docs/src/lib/ConfigTable.tsx 2.2 K raw
1
import schema from "../../../sequoia.schema.json" with { type: "json" };
2
3
type PropertyInfo = {
4
	path: string;
5
	type: string;
6
	required: boolean;
7
	default?: string | number | boolean;
8
	description?: string;
9
};
10
11
function extractProperties(
12
	properties: Record<string, unknown>,
13
	required: string[],
14
	parentPath: string,
15
	result: PropertyInfo[],
16
): void {
17
	for (const [key, value] of Object.entries(properties)) {
18
		const prop = value as Record<string, unknown>;
19
		const fullPath = parentPath ? `${parentPath}.${key}` : key;
20
		const isRequired = required.includes(key);
21
22
		if (prop.properties) {
23
			extractProperties(
24
				prop.properties as Record<string, unknown>,
25
				(prop.required as string[]) || [],
26
				fullPath,
27
				result,
28
			);
29
		} else {
30
			result.push({
31
				path: fullPath,
32
				type: prop.type,
33
				required: isRequired,
34
				default: prop.default,
35
				description: prop.description,
36
			} as PropertyInfo);
37
		}
38
	}
39
}
40
41
export default function ConfigTable() {
42
	const rows: PropertyInfo[] = [];
43
	extractProperties(
44
		schema.properties as Record<string, unknown>,
45
		schema.required as string[],
46
		"",
47
		rows,
48
	);
49
50
	return (
51
		<table className="vocs_Table">
52
			<thead>
53
				<tr className="vocs_TableRow">
54
					<th className="vocs_TableHeader">Field</th>
55
					<th className="vocs_TableHeader">Type</th>
56
					<th className="vocs_TableHeader">Required</th>
57
					<th className="vocs_TableHeader">Default</th>
58
					<th className="vocs_TableHeader">Description</th>
59
				</tr>
60
			</thead>
61
			<tbody>
62
				{rows.map((row) => (
63
					<tr key={row.path} className="vocs_TableRow">
64
						<td className="vocs_TableCell">
65
							<code className="vocs_Code">{row.path}</code>
66
						</td>
67
						<td className="vocs_TableCell">
68
							<code className="vocs_Code">{row.type}</code>
69
						</td>
70
						<td className="vocs_TableCell">{row.required ? "Yes" : ""}</td>
71
						<td className="vocs_TableCell">
72
							{row.default === undefined ? (
73
								"-"
74
							) : (
75
								<code className="vocs_Code">
76
									{typeof row.default === "string"
77
										? `"${row.default}"`
78
										: `${row.default}`}
79
								</code>
80
							)}
81
						</td>
82
						<td className="vocs_TableCell">{row.description || "—"}</td>
83
					</tr>
84
				))}
85
			</tbody>
86
		</table>
87
	);
88
}