@gtkx/cli 1.0.0-rc.1 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder.d.ts +3 -2
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -1
- package/dist/builder.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -6
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts +5 -5
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +26 -23
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/codegen/report.d.ts +2 -1
- package/dist/codegen/report.d.ts.map +1 -1
- package/dist/codegen/report.js +4 -2
- package/dist/codegen/report.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +8 -8
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +72 -43
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/codegen/store-resolver.d.ts +8 -5
- package/dist/codegen/store-resolver.d.ts.map +1 -1
- package/dist/codegen/store-resolver.js +26 -6
- package/dist/codegen/store-resolver.js.map +1 -1
- package/dist/commands/build.d.ts +4 -3
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +2 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts +2 -1
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +6 -4
- package/dist/commands/codegen.js.map +1 -1
- package/dist/commands/dev.d.ts +2 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +2 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs.d.ts +2 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +22 -7
- package/dist/commands/docs.js.map +1 -1
- package/dist/dev/icon-dir.d.ts +2 -1
- package/dist/dev/icon-dir.d.ts.map +1 -1
- package/dist/dev/icon-dir.js +6 -3
- package/dist/dev/icon-dir.js.map +1 -1
- package/dist/dev/refresh-tracker.d.ts +5 -4
- package/dist/dev/refresh-tracker.d.ts.map +1 -1
- package/dist/dev/refresh-tracker.js +6 -5
- package/dist/dev/refresh-tracker.js.map +1 -1
- package/dist/dev/runner-deps.d.ts +2 -1
- package/dist/dev/runner-deps.d.ts.map +1 -1
- package/dist/dev/runner-deps.js +20 -4
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/dev/runner-main.d.ts +2 -1
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +3 -2
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/runner.d.ts +6 -5
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +69 -38
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/schema-dir.d.ts +2 -1
- package/dist/dev/schema-dir.d.ts.map +1 -1
- package/dist/dev/schema-dir.js +4 -2
- package/dist/dev/schema-dir.js.map +1 -1
- package/dist/dev/supervisor.d.ts +7 -6
- package/dist/dev/supervisor.d.ts.map +1 -1
- package/dist/dev/supervisor.js +107 -67
- package/dist/dev/supervisor.js.map +1 -1
- package/dist/dev/vite-dev-server.d.ts +3 -3
- package/dist/dev/vite-dev-server.d.ts.map +1 -1
- package/dist/dev/vite-dev-server.js +2 -1
- package/dist/dev/vite-dev-server.js.map +1 -1
- package/dist/internal/banner.d.ts +2 -1
- package/dist/internal/banner.d.ts.map +1 -1
- package/dist/internal/banner.js +2 -1
- package/dist/internal/banner.js.map +1 -1
- package/dist/internal/data-dir.d.ts +3 -2
- package/dist/internal/data-dir.d.ts.map +1 -1
- package/dist/internal/data-dir.js +29 -14
- package/dist/internal/data-dir.js.map +1 -1
- package/dist/internal/entry-arg.d.ts +5 -4
- package/dist/internal/entry-arg.d.ts.map +1 -1
- package/dist/internal/entry-arg.js +10 -7
- package/dist/internal/entry-arg.js.map +1 -1
- package/dist/internal/errors.d.ts +3 -2
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +7 -5
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/list-files.d.ts +3 -2
- package/dist/internal/list-files.d.ts.map +1 -1
- package/dist/internal/list-files.js +5 -3
- package/dist/internal/list-files.js.map +1 -1
- package/dist/internal/resolve-cli-tool.d.ts +2 -1
- package/dist/internal/resolve-cli-tool.d.ts.map +1 -1
- package/dist/internal/resolve-cli-tool.js +17 -10
- package/dist/internal/resolve-cli-tool.js.map +1 -1
- package/dist/internal/staging-dir.d.ts +3 -2
- package/dist/internal/staging-dir.d.ts.map +1 -1
- package/dist/internal/staging-dir.js +3 -2
- package/dist/internal/staging-dir.js.map +1 -1
- package/dist/internal/xdg-data-dirs.d.ts +2 -1
- package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
- package/dist/internal/xdg-data-dirs.js +4 -2
- package/dist/internal/xdg-data-dirs.js.map +1 -1
- package/dist/mcp/client.d.ts +9 -4
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +106 -81
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/handlers.d.ts +3 -2
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js +89 -61
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +30 -13
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/serialize-widget.d.ts +3 -3
- package/dist/mcp/serialize-widget.d.ts.map +1 -1
- package/dist/mcp/serialize-widget.js +9 -6
- package/dist/mcp/serialize-widget.js.map +1 -1
- package/dist/mcp/testing-loader.d.ts +3 -4
- package/dist/mcp/testing-loader.d.ts.map +1 -1
- package/dist/mcp/testing-loader.js +43 -21
- package/dist/mcp/testing-loader.js.map +1 -1
- package/dist/mcp/widget-registry.d.ts +3 -2
- package/dist/mcp/widget-registry.d.ts.map +1 -1
- package/dist/mcp/widget-registry.js +4 -3
- package/dist/mcp/widget-registry.js.map +1 -1
- package/dist/refresh-globals.d.ts +2 -0
- package/dist/refresh-globals.d.ts.map +1 -0
- package/dist/refresh-globals.js +8 -0
- package/dist/refresh-globals.js.map +1 -0
- package/dist/refresh-runtime.d.ts +5 -11
- package/dist/refresh-runtime.d.ts.map +1 -1
- package/dist/refresh-runtime.js +16 -14
- package/dist/refresh-runtime.js.map +1 -1
- package/dist/settings/compile.d.ts +2 -1
- package/dist/settings/compile.d.ts.map +1 -1
- package/dist/settings/compile.js +6 -4
- package/dist/settings/compile.js.map +1 -1
- package/dist/settings/parser.d.ts +6 -5
- package/dist/settings/parser.d.ts.map +1 -1
- package/dist/settings/parser.js +26 -22
- package/dist/settings/parser.js.map +1 -1
- package/dist/settings/render.d.ts +3 -2
- package/dist/settings/render.d.ts.map +1 -1
- package/dist/settings/render.js +38 -64
- package/dist/settings/render.js.map +1 -1
- package/dist/settings/schema.d.ts +8 -8
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +61 -43
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-extensions.d.ts +4 -3
- package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
- package/dist/vite-plugins/asset-extensions.js +4 -3
- package/dist/vite-plugins/asset-extensions.js.map +1 -1
- package/dist/vite-plugins/built-url.d.ts +2 -1
- package/dist/vite-plugins/built-url.d.ts.map +1 -1
- package/dist/vite-plugins/built-url.js +19 -13
- package/dist/vite-plugins/built-url.js.map +1 -1
- package/dist/vite-plugins/css.d.ts +2 -1
- package/dist/vite-plugins/css.d.ts.map +1 -1
- package/dist/vite-plugins/css.js +23 -15
- package/dist/vite-plugins/css.js.map +1 -1
- package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +5 -4
- package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -1
- package/dist/vite-plugins/fast-refresh/refresh-filter.js +11 -7
- package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -1
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +4 -3
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
- package/dist/vite-plugins/fast-refresh/swc-refresh.js +45 -41
- package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
- package/dist/vite-plugins/icons.d.ts +2 -1
- package/dist/vite-plugins/icons.d.ts.map +1 -1
- package/dist/vite-plugins/icons.js +24 -20
- package/dist/vite-plugins/icons.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +2 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +3 -2
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/native.d.ts +2 -1
- package/dist/vite-plugins/native.d.ts.map +1 -1
- package/dist/vite-plugins/native.js +6 -4
- package/dist/vite-plugins/native.js.map +1 -1
- package/dist/vite-plugins/react-compiler.d.ts +3 -2
- package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
- package/dist/vite-plugins/react-compiler.js +26 -20
- package/dist/vite-plugins/react-compiler.js.map +1 -1
- package/dist/vite-plugins/react-dom-prebundle.d.ts +2 -1
- package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -1
- package/dist/vite-plugins/react-dom-prebundle.js +2 -1
- package/dist/vite-plugins/react-dom-prebundle.js.map +1 -1
- package/dist/vite-plugins/resource-init-module.d.ts +2 -1
- package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
- package/dist/vite-plugins/resource-init-module.js +39 -38
- package/dist/vite-plugins/resource-init-module.js.map +1 -1
- package/dist/vite-plugins/resource-shared.d.ts +7 -5
- package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
- package/dist/vite-plugins/resource-shared.js +17 -10
- package/dist/vite-plugins/resource-shared.js.map +1 -1
- package/dist/vite-plugins/resources.d.ts +3 -2
- package/dist/vite-plugins/resources.d.ts.map +1 -1
- package/dist/vite-plugins/resources.js +94 -54
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/settings-worker-env.d.ts +2 -1
- package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
- package/dist/vite-plugins/settings-worker-env.js +4 -2
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts +2 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +56 -32
- package/dist/vite-plugins/settings.js.map +1 -1
- package/dist/vite-plugins/strip-query.d.ts +3 -0
- package/dist/vite-plugins/strip-query.d.ts.map +1 -0
- package/dist/vite-plugins/strip-query.js +6 -0
- package/dist/vite-plugins/strip-query.js.map +1 -0
- package/dist/vite-plugins/undeclared-library.d.ts +2 -1
- package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
- package/dist/vite-plugins/undeclared-library.js +8 -5
- package/dist/vite-plugins/undeclared-library.js.map +1 -1
- package/dist/vite-plugins/virtual-module.d.ts +2 -2
- package/dist/vite-plugins/virtual-module.d.ts.map +1 -1
- package/dist/vite-plugins/virtual-module.js +5 -3
- package/dist/vite-plugins/virtual-module.js.map +1 -1
- package/dist/vitest-plugin.d.ts.map +1 -1
- package/dist/vitest-plugin.js.map +1 -1
- package/env.d.ts +21 -61
- package/package.json +12 -14
- package/src/babel-modules.d.ts +0 -2
- package/src/builder.ts +7 -6
- package/src/cli.ts +26 -6
- package/src/codegen/freshness.ts +38 -25
- package/src/codegen/report.ts +10 -2
- package/src/codegen/run-codegen.ts +135 -60
- package/src/codegen/store-resolver.ts +56 -15
- package/src/commands/build.ts +3 -2
- package/src/commands/codegen.ts +9 -4
- package/src/commands/dev.ts +3 -4
- package/src/commands/docs.ts +36 -7
- package/src/dev/icon-dir.ts +13 -3
- package/src/dev/refresh-tracker.ts +12 -8
- package/src/dev/runner-deps.ts +30 -7
- package/src/dev/runner-main.ts +4 -3
- package/src/dev/runner.ts +100 -41
- package/src/dev/schema-dir.ts +7 -2
- package/src/dev/supervisor.ts +169 -71
- package/src/dev/vite-dev-server.ts +4 -2
- package/src/internal/banner.ts +5 -1
- package/src/internal/data-dir.ts +47 -16
- package/src/internal/entry-arg.ts +16 -8
- package/src/internal/errors.ts +15 -7
- package/src/internal/list-files.ts +10 -4
- package/src/internal/resolve-cli-tool.ts +28 -12
- package/src/internal/staging-dir.ts +5 -2
- package/src/internal/xdg-data-dirs.ts +8 -2
- package/src/mcp/client.ts +143 -85
- package/src/mcp/handlers.ts +126 -69
- package/src/mcp/index.ts +38 -14
- package/src/mcp/serialize-widget.ts +15 -8
- package/src/mcp/testing-loader.ts +64 -23
- package/src/mcp/widget-registry.ts +11 -5
- package/src/refresh-globals.ts +10 -0
- package/src/refresh-runtime.ts +20 -16
- package/src/settings/compile.ts +7 -4
- package/src/settings/parser.ts +69 -30
- package/src/settings/render.ts +66 -66
- package/src/settings/schema.ts +100 -46
- package/src/vite-plugins/asset-extensions.ts +4 -3
- package/src/vite-plugins/built-url.ts +30 -15
- package/src/vite-plugins/css.ts +35 -20
- package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -10
- package/src/vite-plugins/fast-refresh/swc-refresh.ts +60 -47
- package/src/vite-plugins/icons.ts +40 -24
- package/src/vite-plugins/index.ts +6 -3
- package/src/vite-plugins/native.ts +14 -5
- package/src/vite-plugins/react-compiler.ts +44 -30
- package/src/vite-plugins/react-dom-prebundle.ts +4 -1
- package/src/vite-plugins/resource-init-module.ts +41 -38
- package/src/vite-plugins/resource-shared.ts +27 -14
- package/src/vite-plugins/resources.ts +153 -59
- package/src/vite-plugins/settings-worker-env.ts +7 -2
- package/src/vite-plugins/settings.ts +107 -42
- package/src/vite-plugins/strip-query.ts +7 -0
- package/src/vite-plugins/undeclared-library.ts +21 -12
- package/src/vite-plugins/virtual-module.ts +9 -2
- package/src/vitest-plugin.ts +1 -2
package/dist/settings/parser.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { XMLParser } from "fast-xml-parser";
|
|
2
|
-
export class SchemaParseError extends Error {
|
|
3
|
-
}
|
|
4
2
|
const MULTI_TAGS = new Set(["schema", "key", "enum", "flags", "value", "choice"]);
|
|
5
3
|
const PARSER = new XMLParser({
|
|
6
4
|
ignoreAttributes: false,
|
|
@@ -21,8 +19,9 @@ const text = (node, name) => {
|
|
|
21
19
|
};
|
|
22
20
|
const children = (node, name) => {
|
|
23
21
|
const value = node[name];
|
|
24
|
-
if (!Array.isArray(value))
|
|
22
|
+
if (!Array.isArray(value)) {
|
|
25
23
|
return [];
|
|
24
|
+
}
|
|
26
25
|
return value.filter(isRawNode);
|
|
27
26
|
};
|
|
28
27
|
const parseNicks = (definition) => children(definition, "value")
|
|
@@ -32,15 +31,17 @@ const parseDefinitions = (schemalist, tag) => {
|
|
|
32
31
|
const definitions = new Map();
|
|
33
32
|
for (const definition of children(schemalist, tag)) {
|
|
34
33
|
const id = attr(definition, "id");
|
|
35
|
-
if (id !== null)
|
|
34
|
+
if (id !== null) {
|
|
36
35
|
definitions.set(id, parseNicks(definition));
|
|
36
|
+
}
|
|
37
37
|
}
|
|
38
38
|
return definitions;
|
|
39
39
|
};
|
|
40
40
|
const parseChoices = (key) => {
|
|
41
41
|
const choices = key.choices;
|
|
42
|
-
if (!isRawNode(choices))
|
|
42
|
+
if (!isRawNode(choices)) {
|
|
43
43
|
return [];
|
|
44
|
+
}
|
|
44
45
|
return children(choices, "choice")
|
|
45
46
|
.map((choice) => attr(choice, "value"))
|
|
46
47
|
.filter((value) => value !== null);
|
|
@@ -71,25 +72,25 @@ const parseRawSchema = (schema, fileName) => {
|
|
|
71
72
|
keys: children(schema, "key").map((key) => parseKey(key, fileName)),
|
|
72
73
|
};
|
|
73
74
|
};
|
|
75
|
+
const collectInheritedKeys = (context, current) => {
|
|
76
|
+
if (context.visited.has(current.id)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
context.visited.add(current.id);
|
|
80
|
+
const parent = current.extendsId === null ? undefined : context.byId.get(current.extendsId);
|
|
81
|
+
if (parent !== undefined) {
|
|
82
|
+
collectInheritedKeys(context, parent);
|
|
83
|
+
}
|
|
84
|
+
for (const key of current.keys) {
|
|
85
|
+
context.merged.set(key.name, key);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
74
88
|
const mergeInheritedKeys = (schema, byId) => {
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (visited.has(current.id))
|
|
79
|
-
return;
|
|
80
|
-
visited.add(current.id);
|
|
81
|
-
if (current.extendsId !== null) {
|
|
82
|
-
const parent = byId.get(current.extendsId);
|
|
83
|
-
if (parent !== undefined)
|
|
84
|
-
collect(parent);
|
|
85
|
-
}
|
|
86
|
-
for (const key of current.keys)
|
|
87
|
-
merged.set(key.name, key);
|
|
88
|
-
};
|
|
89
|
-
collect(schema);
|
|
90
|
-
return [...merged.values()];
|
|
89
|
+
const context = { byId, merged: new Map(), visited: new Set() };
|
|
90
|
+
collectInheritedKeys(context, schema);
|
|
91
|
+
return context.merged.values().toArray();
|
|
91
92
|
};
|
|
92
|
-
|
|
93
|
+
const parseSchemaXml = (xml, fileName) => {
|
|
93
94
|
let document;
|
|
94
95
|
try {
|
|
95
96
|
document = PARSER.parse(xml);
|
|
@@ -114,4 +115,7 @@ export const parseSchemaXml = (xml, fileName) => {
|
|
|
114
115
|
flags: parseDefinitions(schemalist, "flags"),
|
|
115
116
|
};
|
|
116
117
|
};
|
|
118
|
+
class SchemaParseError extends Error {
|
|
119
|
+
}
|
|
120
|
+
export { parseSchemaXml, SchemaParseError };
|
|
117
121
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/settings/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { XMLParser } from \"fast-xml-parser\";\n\nexport type ParsedKey = {\n name: string;\n variantType: string | null;\n enumId: string | null;\n flagsId: string | null;\n choices: string[];\n summary: string | null;\n};\n\nexport type ParsedSchema = {\n id: string;\n path: string | null;\n keys: ParsedKey[];\n};\n\nexport type ParsedSchemaFile = {\n fileName: string;\n schemas: ParsedSchema[];\n enums: Map<string, string[]>;\n flags: Map<string, string[]>;\n};\n\nexport class SchemaParseError extends Error {}\n\ntype RawNode = Record<string, unknown>;\n\nconst MULTI_TAGS: Set<string> = new Set([\"schema\", \"key\", \"enum\", \"flags\", \"value\", \"choice\"]);\n\nconst PARSER = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n parseAttributeValue: false,\n parseTagValue: false,\n trimValues: true,\n isArray: (name) => MULTI_TAGS.has(name),\n});\n\nconst isRawNode = (value: unknown): value is RawNode => typeof value === \"object\" && value !== null;\n\nconst attr = (node: RawNode, name: string): string | null => {\n const value = node[`@_${name}`];\n return typeof value === \"string\" ? value : null;\n};\n\nconst text = (node: RawNode, name: string): string | null => {\n const value = node[name];\n return typeof value === \"string\" && value.length > 0 ? value : null;\n};\n\nconst children = (node: RawNode, name: string): RawNode[] => {\n const value = node[name];\n if (!Array.isArray(value)) return [];\n return value.filter(isRawNode);\n};\n\nconst parseNicks = (definition: RawNode): string[] =>\n children(definition, \"value\")\n .map((value) => attr(value, \"nick\"))\n .filter((nick): nick is string => nick !== null);\n\nconst parseDefinitions = (schemalist: RawNode, tag: string): Map<string, string[]> => {\n const definitions = new Map<string, string[]>();\n for (const definition of children(schemalist, tag)) {\n const id = attr(definition, \"id\");\n if (id !== null) definitions.set(id, parseNicks(definition));\n }\n return definitions;\n};\n\nconst parseChoices = (key: RawNode): string[] => {\n const choices = key.choices;\n if (!isRawNode(choices)) return [];\n return children(choices, \"choice\")\n .map((choice) => attr(choice, \"value\"))\n .filter((value): value is string => value !== null);\n};\n\nconst parseKey = (key: RawNode, fileName: string): ParsedKey => {\n const name = attr(key, \"name\");\n if (name === null) {\n throw new SchemaParseError(`A <key> in ${fileName} has no name attribute`);\n }\n return {\n name,\n variantType: attr(key, \"type\"),\n enumId: attr(key, \"enum\"),\n flagsId: attr(key, \"flags\"),\n choices: parseChoices(key),\n summary: text(key, \"summary\"),\n };\n};\n\ntype RawSchema = {\n id: string;\n path: string | null;\n extendsId: string | null;\n keys: ParsedKey[];\n};\n\nconst parseRawSchema = (schema: RawNode, fileName: string): RawSchema => {\n const id = attr(schema, \"id\");\n if (id === null) {\n throw new SchemaParseError(`A <schema> in ${fileName} has no id attribute`);\n }\n return {\n id,\n path: attr(schema, \"path\"),\n extendsId: attr(schema, \"extends\"),\n keys: children(schema, \"key\").map((key) => parseKey(key, fileName)),\n };\n};\n\nconst mergeInheritedKeys = (schema: RawSchema, byId: Map<string, RawSchema>): ParsedKey[] => {\n const merged = new Map<string, ParsedKey>();\n const visited = new Set<string>();\n const collect = (current: RawSchema): void => {\n if (visited.has(current.id)) return;\n visited.add(current.id);\n if (current.extendsId !== null) {\n const parent = byId.get(current.extendsId);\n if (parent !== undefined) collect(parent);\n }\n for (const key of current.keys) merged.set(key.name, key);\n };\n collect(schema);\n return [...merged.values()];\n};\n\nexport const parseSchemaXml = (xml: string, fileName: string): ParsedSchemaFile => {\n let document: unknown;\n try {\n document = PARSER.parse(xml);\n } catch (error) {\n throw new SchemaParseError(`Failed to parse ${fileName} as XML: ${String(error)}`, { cause: error });\n }\n if (!isRawNode(document) || !(\"schemalist\" in document)) {\n throw new SchemaParseError(`${fileName} has no <schemalist> root element`);\n }\n const schemalist = isRawNode(document.schemalist) ? document.schemalist : {};\n const rawSchemas = children(schemalist, \"schema\").map((schema) => parseRawSchema(schema, fileName));\n const byId = new Map(rawSchemas.map((schema) => [schema.id, schema]));\n return {\n fileName,\n schemas: rawSchemas.map((schema) => ({\n id: schema.id,\n path: schema.path,\n keys: mergeInheritedKeys(schema, byId),\n })),\n enums: parseDefinitions(schemalist, \"enum\"),\n flags: parseDefinitions(schemalist, \"flags\"),\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/settings/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuC5C,MAAM,UAAU,GAAgB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE/F,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IACzB,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,KAAK;IAC1B,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,KAAc,EAAoB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAEpG,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,IAAY,EAAiB,EAAE;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEhC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,IAAY,EAAiB,EAAE;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAE,IAAY,EAAa,EAAE;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,UAAmB,EAAY,EAAE,CACjD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;KACnC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAEzD,MAAM,gBAAgB,GAAG,CAAC,UAAmB,EAAE,GAAW,EAAyB,EAAE;IACjF,MAAM,WAAW,GAA0B,IAAI,GAAG,EAAE,CAAC;IAErD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAElC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACd,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAY,EAAY,EAAE;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAE5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;SAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAE,QAAgB,EAAa,EAAE;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE/B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,gBAAgB,CAAC,cAAc,QAAQ,wBAAwB,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACH,IAAI;QACJ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;QAC9B,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;QACzB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;QAC3B,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;KAChC,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,MAAe,EAAE,QAAgB,EAAa,EAAE;IACpE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE9B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,QAAQ,sBAAsB,CAAC,CAAC;IAChF,CAAC;IAED,OAAO;QACH,EAAE;QACF,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;QAClC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;KACtE,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAqB,EAAE,OAAkB,EAAQ,EAAE;IAC7E,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO;IACX,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE5F,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAiB,EAAE,IAA4B,EAAe,EAAE;IACxF,MAAM,OAAO,GAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC9E,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,QAAgB,EAAoB,EAAE;IACvE,IAAI,QAAiB,CAAC;IAEtB,IAAI,CAAC;QACD,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,gBAAgB,CAAC,mBAAmB,QAAQ,YAAY,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,gBAAgB,CAAC,GAAG,QAAQ,mCAAmC,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAEtE,OAAO;QACH,QAAQ;QACR,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;SACzC,CAAC,CAAC;QACH,KAAK,EAAE,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC;QAC3C,KAAK,EAAE,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;KAC/C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,gBAAiB,SAAQ,KAAK;CAAG;AAEvC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA4D,CAAC","sourcesContent":["import { XMLParser } from \"fast-xml-parser\";\n\ntype ParsedKey = {\n name: string;\n variantType: string | null;\n enumId: string | null;\n flagsId: string | null;\n choices: string[];\n summary: string | null;\n};\n\ntype ParsedSchema = {\n id: string;\n path: string | null;\n keys: ParsedKey[];\n};\n\ntype ParsedSchemaFile = {\n fileName: string;\n schemas: ParsedSchema[];\n enums: Map<string, string[]>;\n flags: Map<string, string[]>;\n};\n\ntype RawNode = Record<string, unknown>;\n\ntype RawSchema = {\n id: string;\n path: string | null;\n extendsId: string | null;\n keys: ParsedKey[];\n};\n\ntype MergeContext = {\n byId: Map<string, RawSchema>;\n merged: Map<string, ParsedKey>;\n visited: Set<string>;\n};\n\nconst MULTI_TAGS: Set<string> = new Set([\"schema\", \"key\", \"enum\", \"flags\", \"value\", \"choice\"]);\n\nconst PARSER = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n parseAttributeValue: false,\n parseTagValue: false,\n trimValues: true,\n isArray: (name) => MULTI_TAGS.has(name),\n});\n\nconst isRawNode = (value: unknown): value is RawNode => typeof value === \"object\" && value !== null;\n\nconst attr = (node: RawNode, name: string): string | null => {\n const value = node[`@_${name}`];\n\n return typeof value === \"string\" ? value : null;\n};\n\nconst text = (node: RawNode, name: string): string | null => {\n const value = node[name];\n\n return typeof value === \"string\" && value.length > 0 ? value : null;\n};\n\nconst children = (node: RawNode, name: string): RawNode[] => {\n const value = node[name];\n\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(isRawNode);\n};\n\nconst parseNicks = (definition: RawNode): string[] =>\n children(definition, \"value\")\n .map((value) => attr(value, \"nick\"))\n .filter((nick): nick is string => nick !== null);\n\nconst parseDefinitions = (schemalist: RawNode, tag: string): Map<string, string[]> => {\n const definitions: Map<string, string[]> = new Map();\n\n for (const definition of children(schemalist, tag)) {\n const id = attr(definition, \"id\");\n\n if (id !== null) {\n definitions.set(id, parseNicks(definition));\n }\n }\n\n return definitions;\n};\n\nconst parseChoices = (key: RawNode): string[] => {\n const choices = key.choices;\n\n if (!isRawNode(choices)) {\n return [];\n }\n\n return children(choices, \"choice\")\n .map((choice) => attr(choice, \"value\"))\n .filter((value): value is string => value !== null);\n};\n\nconst parseKey = (key: RawNode, fileName: string): ParsedKey => {\n const name = attr(key, \"name\");\n\n if (name === null) {\n throw new SchemaParseError(`A <key> in ${fileName} has no name attribute`);\n }\n\n return {\n name,\n variantType: attr(key, \"type\"),\n enumId: attr(key, \"enum\"),\n flagsId: attr(key, \"flags\"),\n choices: parseChoices(key),\n summary: text(key, \"summary\"),\n };\n};\n\nconst parseRawSchema = (schema: RawNode, fileName: string): RawSchema => {\n const id = attr(schema, \"id\");\n\n if (id === null) {\n throw new SchemaParseError(`A <schema> in ${fileName} has no id attribute`);\n }\n\n return {\n id,\n path: attr(schema, \"path\"),\n extendsId: attr(schema, \"extends\"),\n keys: children(schema, \"key\").map((key) => parseKey(key, fileName)),\n };\n};\n\nconst collectInheritedKeys = (context: MergeContext, current: RawSchema): void => {\n if (context.visited.has(current.id)) {\n return;\n }\n\n context.visited.add(current.id);\n const parent = current.extendsId === null ? undefined : context.byId.get(current.extendsId);\n\n if (parent !== undefined) {\n collectInheritedKeys(context, parent);\n }\n\n for (const key of current.keys) {\n context.merged.set(key.name, key);\n }\n};\n\nconst mergeInheritedKeys = (schema: RawSchema, byId: Map<string, RawSchema>): ParsedKey[] => {\n const context: MergeContext = { byId, merged: new Map(), visited: new Set() };\n collectInheritedKeys(context, schema);\n\n return context.merged.values().toArray();\n};\n\nconst parseSchemaXml = (xml: string, fileName: string): ParsedSchemaFile => {\n let document: unknown;\n\n try {\n document = PARSER.parse(xml);\n } catch (error) {\n throw new SchemaParseError(`Failed to parse ${fileName} as XML: ${String(error)}`, { cause: error });\n }\n\n if (!isRawNode(document) || !(\"schemalist\" in document)) {\n throw new SchemaParseError(`${fileName} has no <schemalist> root element`);\n }\n\n const schemalist = isRawNode(document.schemalist) ? document.schemalist : {};\n const rawSchemas = children(schemalist, \"schema\").map((schema) => parseRawSchema(schema, fileName));\n const byId = new Map(rawSchemas.map((schema) => [schema.id, schema]));\n\n return {\n fileName,\n schemas: rawSchemas.map((schema) => ({\n id: schema.id,\n path: schema.path,\n keys: mergeInheritedKeys(schema, byId),\n })),\n enums: parseDefinitions(schemalist, \"enum\"),\n flags: parseDefinitions(schemalist, \"flags\"),\n };\n};\n\nclass SchemaParseError extends Error {}\n\nexport { parseSchemaXml, SchemaParseError, type ParsedKey, type ParsedSchema, type ParsedSchemaFile };\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ParsedSchemaFile } from "./parser.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
declare const renderRuntimeModule: (file: ParsedSchemaFile) => string;
|
|
3
|
+
declare const renderEnvModule: (files: ParsedSchemaFile[]) => string;
|
|
4
|
+
export { renderRuntimeModule, renderEnvModule };
|
|
4
5
|
//# sourceMappingURL=render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/settings/render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA2B,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/settings/render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA2B,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoC7E,QAAA,MAAM,mBAAmB,GAAI,MAAM,gBAAgB,KAAG,MAyBrD,CAAC;AA8FF,QAAA,MAAM,eAAe,GAAI,OAAO,gBAAgB,EAAE,KAAG,MAQpD,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/settings/render.js
CHANGED
|
@@ -4,89 +4,66 @@ const GTKX_ENV_MODULE_HEADER = `/**
|
|
|
4
4
|
* \`.gschema.xml\` files. Regenerated by \`gtkx codegen\`, \`gtkx dev\`, and
|
|
5
5
|
* \`gtkx build\`; do not edit.
|
|
6
6
|
*/`;
|
|
7
|
-
const VARIANT_TS_TYPES = {
|
|
8
|
-
b: "boolean",
|
|
9
|
-
i: "number",
|
|
10
|
-
u: "number",
|
|
11
|
-
x: "number",
|
|
12
|
-
t: "number",
|
|
13
|
-
d: "number",
|
|
14
|
-
s: "string",
|
|
15
|
-
as: "string[]",
|
|
16
|
-
};
|
|
17
|
-
const VARIANT_FALLBACK_TS_TYPE = `import("@gtkx/gi/glib").Variant`;
|
|
18
7
|
const ENUM_KIND = "enum";
|
|
19
8
|
const FLAGS_KIND = "flags";
|
|
20
|
-
const toJsStringLiteral = (value) => JSON.stringify(value).replaceAll("\
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const tsTypeForKey = (key, file) => {
|
|
9
|
+
const toJsStringLiteral = (value) => JSON.stringify(value).replaceAll("\u{2028}", String.raw `\u2028`).replaceAll("\u{2029}", String.raw `\u2029`);
|
|
10
|
+
const getExportName = (schemaId) => schemaId.replaceAll(".", "_");
|
|
11
|
+
const runtimeKindForKey = (key) => {
|
|
24
12
|
if (key.enumId !== null) {
|
|
25
|
-
|
|
26
|
-
return nicks !== undefined && nicks.length > 0 ? unionOf(nicks) : "string";
|
|
13
|
+
return ENUM_KIND;
|
|
27
14
|
}
|
|
28
15
|
if (key.flagsId !== null) {
|
|
29
|
-
const nicks = file.flags.get(key.flagsId);
|
|
30
|
-
return nicks !== undefined && nicks.length > 0 ? `(${unionOf(nicks)})[]` : "string[]";
|
|
31
|
-
}
|
|
32
|
-
if (key.variantType === "s" && key.choices.length > 0) {
|
|
33
|
-
return unionOf(key.choices);
|
|
34
|
-
}
|
|
35
|
-
return VARIANT_TS_TYPES[key.variantType ?? ""] ?? VARIANT_FALLBACK_TS_TYPE;
|
|
36
|
-
};
|
|
37
|
-
const runtimeKindForKey = (key) => {
|
|
38
|
-
if (key.enumId !== null)
|
|
39
|
-
return ENUM_KIND;
|
|
40
|
-
if (key.flagsId !== null)
|
|
41
16
|
return FLAGS_KIND;
|
|
17
|
+
}
|
|
42
18
|
return key.variantType ?? "";
|
|
43
19
|
};
|
|
44
|
-
const
|
|
20
|
+
const getRuntimeKeys = (schema) => {
|
|
45
21
|
const entries = schema.keys.map((key) => `${toJsStringLiteral(key.name)}: ${toJsStringLiteral(runtimeKindForKey(key))}`);
|
|
46
22
|
return `{ ${entries.join(", ")} }`;
|
|
47
23
|
};
|
|
48
|
-
|
|
24
|
+
const renderRuntimeModule = (file) => {
|
|
49
25
|
const lines = [];
|
|
50
|
-
file.schemas.
|
|
51
|
-
const keysName = `keys_${index}`;
|
|
26
|
+
for (const [index, schema] of file.schemas.entries()) {
|
|
27
|
+
const keysName = `keys_${String(index)}`;
|
|
52
28
|
const id = toJsStringLiteral(schema.id);
|
|
53
|
-
lines.push(`const ${keysName} = ${
|
|
29
|
+
lines.push(`const ${keysName} = ${getRuntimeKeys(schema)};`);
|
|
54
30
|
if (schema.path === null) {
|
|
55
|
-
lines.push(`export const ${
|
|
31
|
+
lines.push(`export const ${getExportName(schema.id)} = { id: ${id}, keys: ${keysName}, ` +
|
|
32
|
+
`at: (path) => ({ id: ${id}, path, keys: ${keysName} }) };`);
|
|
56
33
|
}
|
|
57
34
|
else {
|
|
58
|
-
lines.push(`export const ${
|
|
35
|
+
lines.push(`export const ${getExportName(schema.id)} = { id: ${id}, path: null, keys: ${keysName} };`);
|
|
59
36
|
}
|
|
60
|
-
}
|
|
37
|
+
}
|
|
61
38
|
const first = file.schemas[0];
|
|
62
39
|
if (first !== undefined) {
|
|
63
|
-
lines.push(`export default ${
|
|
40
|
+
lines.push(`export default ${getExportName(first.id)};`);
|
|
64
41
|
}
|
|
65
42
|
return lines.join("\n");
|
|
66
43
|
};
|
|
67
|
-
const sanitizeSummary = (summary) => summary.replaceAll("*/",
|
|
68
|
-
const
|
|
44
|
+
const sanitizeSummary = (summary) => summary.replaceAll("*/", String.raw `*\/`);
|
|
45
|
+
const allocateInterfaceName = (schemaId, usedNames) => {
|
|
69
46
|
const base = `${schemaId
|
|
70
47
|
.split(/[^a-zA-Z0-9]+/)
|
|
71
48
|
.filter((part) => part.length > 0)
|
|
72
|
-
.map(upperFirst)
|
|
49
|
+
.map((part) => upperFirst(part))
|
|
73
50
|
.join("")}Keys`;
|
|
74
51
|
let name = base;
|
|
75
52
|
let suffix = 2;
|
|
76
53
|
while (usedNames.has(name)) {
|
|
77
|
-
name = `${base}${suffix}`;
|
|
54
|
+
name = `${base}${String(suffix)}`;
|
|
78
55
|
suffix += 1;
|
|
79
56
|
}
|
|
80
57
|
usedNames.add(name);
|
|
81
58
|
return name;
|
|
82
59
|
};
|
|
83
|
-
const renderKeysType = (name, schema
|
|
60
|
+
const renderKeysType = (name, schema) => {
|
|
84
61
|
const lines = [` type ${name} = {`];
|
|
85
62
|
for (const key of schema.keys) {
|
|
86
63
|
if (key.summary !== null) {
|
|
87
64
|
lines.push(` /** ${sanitizeSummary(key.summary)} */`);
|
|
88
65
|
}
|
|
89
|
-
lines.push(` ${toJsStringLiteral(key.name)}: ${
|
|
66
|
+
lines.push(` ${toJsStringLiteral(key.name)}: ${toJsStringLiteral(runtimeKindForKey(key))};`);
|
|
90
67
|
}
|
|
91
68
|
lines.push(" };");
|
|
92
69
|
return lines;
|
|
@@ -94,26 +71,24 @@ const renderKeysType = (name, schema, file) => {
|
|
|
94
71
|
const boundRefTypeLines = (interfaceName, indent) => [
|
|
95
72
|
`${indent}id: string;`,
|
|
96
73
|
`${indent}path: string | null;`,
|
|
97
|
-
`${indent}keys:
|
|
98
|
-
`${indent}__keys__?: ${interfaceName};`,
|
|
74
|
+
`${indent}keys: ${interfaceName};`,
|
|
99
75
|
];
|
|
100
76
|
const renderSchemaConst = (schema, interfaceName) => {
|
|
101
|
-
const exportName =
|
|
77
|
+
const exportName = getExportName(schema.id);
|
|
102
78
|
if (schema.path !== null) {
|
|
103
79
|
return [
|
|
104
80
|
` const ${exportName}: {`,
|
|
105
81
|
` id: ${toJsStringLiteral(schema.id)};`,
|
|
106
|
-
...boundRefTypeLines(interfaceName, "
|
|
82
|
+
...boundRefTypeLines(interfaceName, " ".repeat(8)).slice(1),
|
|
107
83
|
" };",
|
|
108
84
|
];
|
|
109
85
|
}
|
|
110
86
|
return [
|
|
111
87
|
` const ${exportName}: {`,
|
|
112
88
|
` id: ${JSON.stringify(schema.id)};`,
|
|
113
|
-
` keys:
|
|
114
|
-
` __keys__?: ${interfaceName};`,
|
|
89
|
+
` keys: ${interfaceName};`,
|
|
115
90
|
" at(path: string): {",
|
|
116
|
-
...boundRefTypeLines(interfaceName, "
|
|
91
|
+
...boundRefTypeLines(interfaceName, " ".repeat(12)),
|
|
117
92
|
" };",
|
|
118
93
|
" };",
|
|
119
94
|
];
|
|
@@ -121,28 +96,27 @@ const renderSchemaConst = (schema, interfaceName) => {
|
|
|
121
96
|
const renderFileModule = (file, usedNames) => {
|
|
122
97
|
const lines = [`declare module "${file.fileName}" {`];
|
|
123
98
|
const exportNames = [];
|
|
124
|
-
file.schemas.
|
|
125
|
-
if (index > 0)
|
|
99
|
+
for (const [index, schema] of file.schemas.entries()) {
|
|
100
|
+
if (index > 0) {
|
|
126
101
|
lines.push("");
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
lines.push("");
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
lines.push("");
|
|
135
|
-
lines.push(` export { ${exportNames.join(", ")} };`);
|
|
136
|
-
lines.push(` export default ${exportNames[0]};`);
|
|
102
|
+
}
|
|
103
|
+
const interfaceName = allocateInterfaceName(schema.id, usedNames);
|
|
104
|
+
lines.push(...renderKeysType(interfaceName, schema), "", ...renderSchemaConst(schema, interfaceName));
|
|
105
|
+
exportNames.push(getExportName(schema.id));
|
|
106
|
+
}
|
|
107
|
+
const [firstExport] = exportNames;
|
|
108
|
+
if (firstExport !== undefined) {
|
|
109
|
+
lines.push("", ` export { ${exportNames.join(", ")} };`, ` export default ${firstExport};`);
|
|
137
110
|
}
|
|
138
111
|
lines.push("}");
|
|
139
112
|
return lines;
|
|
140
113
|
};
|
|
141
|
-
|
|
114
|
+
const renderEnvModule = (files) => {
|
|
142
115
|
const usedNames = new Set();
|
|
143
116
|
const blocks = files
|
|
144
117
|
.filter((file) => file.schemas.length > 0)
|
|
145
118
|
.map((file) => renderFileModule(file, usedNames).join("\n"));
|
|
146
119
|
return `${[GTKX_ENV_MODULE_HEADER, ...blocks].join("\n\n")}\n`;
|
|
147
120
|
};
|
|
121
|
+
export { renderRuntimeModule, renderEnvModule };
|
|
148
122
|
//# sourceMappingURL=render.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/settings/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,sBAAsB,GAAG;;;;IAI3B,CAAC;AAEL,MAAM,gBAAgB,GAA2B;IAC7C,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,QAAQ;IACX,EAAE,EAAE,UAAU;CACjB,CAAC;AAEF,MAAM,wBAAwB,GAAG,iCAAiC,CAAC;AAEnE,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAU,EAAE,CAChD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE1F,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAElF,MAAM,OAAO,GAAG,CAAC,MAAgB,EAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAExF,MAAM,YAAY,GAAG,CAAC,GAAc,EAAE,IAAsB,EAAU,EAAE;IACpE,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/E,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAC1F,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,IAAI,wBAAwB,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,GAAc,EAAU,EAAE;IACjD,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IAC5C,OAAO,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,MAAoB,EAAU,EAAE;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAC3B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,CAC1F,CAAC;IACF,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAsB,EAAU,EAAE;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACnC,MAAM,QAAQ,GAAG,QAAQ,KAAK,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,MAAM,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CACN,gBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,QAAQ,0BAA0B,EAAE,iBAAiB,QAAQ,QAAQ,CACzI,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,IAAI,CAAC,gBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,uBAAuB,QAAQ,KAAK,CAAC,CAAC;QAC3G,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,kBAAkB,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAEtF,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,SAAsB,EAAU,EAAE;IAC1E,MAAM,IAAI,GAAG,GAAG,QAAQ;SACnB,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,GAAG,CAAC,UAAU,CAAC;SACf,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACpB,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,MAAoB,EAAE,IAAsB,EAAY,EAAE;IAC5F,MAAM,KAAK,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,eAAe,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,WAAW,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACtF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,aAAqB,EAAE,MAAc,EAAY,EAAE,CAAC;IAC3E,GAAG,MAAM,aAAa;IACtB,GAAG,MAAM,sBAAsB;IAC/B,GAAG,MAAM,uBAAuB,aAAa,cAAc;IAC3D,GAAG,MAAM,cAAc,aAAa,GAAG;CAC1C,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAoB,EAAE,aAAqB,EAAY,EAAE;IAChF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO;YACH,aAAa,UAAU,KAAK;YAC5B,eAAe,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG;YAC9C,GAAG,iBAAiB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,QAAQ;SACX,CAAC;IACN,CAAC;IACD,OAAO;QACH,aAAa,UAAU,KAAK;QAC5B,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG;QAC3C,+BAA+B,aAAa,cAAc;QAC1D,sBAAsB,aAAa,GAAG;QACtC,6BAA6B;QAC7B,GAAG,iBAAiB,CAAC,aAAa,EAAE,cAAc,CAAC;QACnD,YAAY;QACZ,QAAQ;KACX,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,IAAsB,EAAE,SAAsB,EAAY,EAAE;IAClF,MAAM,KAAK,GAAG,CAAC,mBAAmB,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;IACtD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACnC,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;QACxD,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,sBAAsB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAyB,EAAU,EAAE;IACjE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC,sBAAsB,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACnE,CAAC,CAAC","sourcesContent":["import { upperFirst } from \"@gtkx/utils\";\nimport type { ParsedKey, ParsedSchema, ParsedSchemaFile } from \"./parser.js\";\n\nconst GTKX_ENV_MODULE_HEADER = `/**\n * GSettings schema modules generated by GTKX from the project's\n * \\`.gschema.xml\\` files. Regenerated by \\`gtkx codegen\\`, \\`gtkx dev\\`, and\n * \\`gtkx build\\`; do not edit.\n */`;\n\nconst VARIANT_TS_TYPES: Record<string, string> = {\n b: \"boolean\",\n i: \"number\",\n u: \"number\",\n x: \"number\",\n t: \"number\",\n d: \"number\",\n s: \"string\",\n as: \"string[]\",\n};\n\nconst VARIANT_FALLBACK_TS_TYPE = `import(\"@gtkx/gi/glib\").Variant`;\n\nconst ENUM_KIND = \"enum\";\nconst FLAGS_KIND = \"flags\";\n\nconst toJsStringLiteral = (value: string): string =>\n JSON.stringify(value).replaceAll(\"\\u2028\", \"\\\\u2028\").replaceAll(\"\\u2029\", \"\\\\u2029\");\n\nconst exportNameFor = (schemaId: string): string => schemaId.replaceAll(\".\", \"_\");\n\nconst unionOf = (values: string[]): string => values.map(toJsStringLiteral).join(\" | \");\n\nconst tsTypeForKey = (key: ParsedKey, file: ParsedSchemaFile): string => {\n if (key.enumId !== null) {\n const nicks = file.enums.get(key.enumId);\n return nicks !== undefined && nicks.length > 0 ? unionOf(nicks) : \"string\";\n }\n if (key.flagsId !== null) {\n const nicks = file.flags.get(key.flagsId);\n return nicks !== undefined && nicks.length > 0 ? `(${unionOf(nicks)})[]` : \"string[]\";\n }\n if (key.variantType === \"s\" && key.choices.length > 0) {\n return unionOf(key.choices);\n }\n return VARIANT_TS_TYPES[key.variantType ?? \"\"] ?? VARIANT_FALLBACK_TS_TYPE;\n};\n\nconst runtimeKindForKey = (key: ParsedKey): string => {\n if (key.enumId !== null) return ENUM_KIND;\n if (key.flagsId !== null) return FLAGS_KIND;\n return key.variantType ?? \"\";\n};\n\nconst runtimeKeysFor = (schema: ParsedSchema): string => {\n const entries = schema.keys.map(\n (key) => `${toJsStringLiteral(key.name)}: ${toJsStringLiteral(runtimeKindForKey(key))}`,\n );\n return `{ ${entries.join(\", \")} }`;\n};\n\nexport const renderRuntimeModule = (file: ParsedSchemaFile): string => {\n const lines: string[] = [];\n file.schemas.forEach((schema, index) => {\n const keysName = `keys_${index}`;\n const id = toJsStringLiteral(schema.id);\n lines.push(`const ${keysName} = ${runtimeKeysFor(schema)};`);\n if (schema.path === null) {\n lines.push(\n `export const ${exportNameFor(schema.id)} = { id: ${id}, keys: ${keysName}, at: (path) => ({ id: ${id}, path, keys: ${keysName} }) };`,\n );\n } else {\n lines.push(`export const ${exportNameFor(schema.id)} = { id: ${id}, path: null, keys: ${keysName} };`);\n }\n });\n const first = file.schemas[0];\n if (first !== undefined) {\n lines.push(`export default ${exportNameFor(first.id)};`);\n }\n return lines.join(\"\\n\");\n};\n\nconst sanitizeSummary = (summary: string): string => summary.replaceAll(\"*/\", \"*\\\\/\");\n\nconst interfaceNameFor = (schemaId: string, usedNames: Set<string>): string => {\n const base = `${schemaId\n .split(/[^a-zA-Z0-9]+/)\n .filter((part) => part.length > 0)\n .map(upperFirst)\n .join(\"\")}Keys`;\n let name = base;\n let suffix = 2;\n while (usedNames.has(name)) {\n name = `${base}${suffix}`;\n suffix += 1;\n }\n usedNames.add(name);\n return name;\n};\n\nconst renderKeysType = (name: string, schema: ParsedSchema, file: ParsedSchemaFile): string[] => {\n const lines = [` type ${name} = {`];\n for (const key of schema.keys) {\n if (key.summary !== null) {\n lines.push(` /** ${sanitizeSummary(key.summary)} */`);\n }\n lines.push(` ${toJsStringLiteral(key.name)}: ${tsTypeForKey(key, file)};`);\n }\n lines.push(\" };\");\n return lines;\n};\n\nconst boundRefTypeLines = (interfaceName: string, indent: string): string[] => [\n `${indent}id: string;`,\n `${indent}path: string | null;`,\n `${indent}keys: { [P in keyof ${interfaceName}]: string };`,\n `${indent}__keys__?: ${interfaceName};`,\n];\n\nconst renderSchemaConst = (schema: ParsedSchema, interfaceName: string): string[] => {\n const exportName = exportNameFor(schema.id);\n if (schema.path !== null) {\n return [\n ` const ${exportName}: {`,\n ` id: ${toJsStringLiteral(schema.id)};`,\n ...boundRefTypeLines(interfaceName, \" \").slice(1),\n \" };\",\n ];\n }\n return [\n ` const ${exportName}: {`,\n ` id: ${JSON.stringify(schema.id)};`,\n ` keys: { [P in keyof ${interfaceName}]: string };`,\n ` __keys__?: ${interfaceName};`,\n \" at(path: string): {\",\n ...boundRefTypeLines(interfaceName, \" \"),\n \" };\",\n \" };\",\n ];\n};\n\nconst renderFileModule = (file: ParsedSchemaFile, usedNames: Set<string>): string[] => {\n const lines = [`declare module \"${file.fileName}\" {`];\n const exportNames: string[] = [];\n file.schemas.forEach((schema, index) => {\n if (index > 0) lines.push(\"\");\n const interfaceName = interfaceNameFor(schema.id, usedNames);\n lines.push(...renderKeysType(interfaceName, schema, file));\n lines.push(\"\");\n lines.push(...renderSchemaConst(schema, interfaceName));\n exportNames.push(exportNameFor(schema.id));\n });\n if (exportNames.length > 0) {\n lines.push(\"\");\n lines.push(` export { ${exportNames.join(\", \")} };`);\n lines.push(` export default ${exportNames[0]};`);\n }\n lines.push(\"}\");\n return lines;\n};\n\nexport const renderEnvModule = (files: ParsedSchemaFile[]): string => {\n const usedNames = new Set<string>();\n const blocks = files\n .filter((file) => file.schemas.length > 0)\n .map((file) => renderFileModule(file, usedNames).join(\"\\n\"));\n return `${[GTKX_ENV_MODULE_HEADER, ...blocks].join(\"\\n\\n\")}\\n`;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/settings/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { upperFirst } from \"@gtkx/utils\";\nimport type { ParsedKey, ParsedSchema, ParsedSchemaFile } from \"./parser.js\";\n\nconst GTKX_ENV_MODULE_HEADER = `/**\n * GSettings schema modules generated by GTKX from the project's\n * \\`.gschema.xml\\` files. Regenerated by \\`gtkx codegen\\`, \\`gtkx dev\\`, and\n * \\`gtkx build\\`; do not edit.\n */`;\n\nconst ENUM_KIND = \"enum\";\nconst FLAGS_KIND = \"flags\";\n\nconst toJsStringLiteral = (value: string): string =>\n JSON.stringify(value).replaceAll(\"\\u{2028}\", String.raw`\\u2028`).replaceAll(\"\\u{2029}\", String.raw`\\u2029`);\n\nconst getExportName = (schemaId: string): string => schemaId.replaceAll(\".\", \"_\");\n\nconst runtimeKindForKey = (key: ParsedKey): string => {\n if (key.enumId !== null) {\n return ENUM_KIND;\n }\n\n if (key.flagsId !== null) {\n return FLAGS_KIND;\n }\n\n return key.variantType ?? \"\";\n};\n\nconst getRuntimeKeys = (schema: ParsedSchema): string => {\n const entries = schema.keys.map(\n (key) => `${toJsStringLiteral(key.name)}: ${toJsStringLiteral(runtimeKindForKey(key))}`,\n );\n\n return `{ ${entries.join(\", \")} }`;\n};\n\nconst renderRuntimeModule = (file: ParsedSchemaFile): string => {\n const lines: string[] = [];\n\n for (const [index, schema] of file.schemas.entries()) {\n const keysName = `keys_${String(index)}`;\n const id = toJsStringLiteral(schema.id);\n lines.push(`const ${keysName} = ${getRuntimeKeys(schema)};`);\n\n if (schema.path === null) {\n lines.push(\n `export const ${getExportName(schema.id)} = { id: ${id}, keys: ${keysName}, ` +\n `at: (path) => ({ id: ${id}, path, keys: ${keysName} }) };`,\n );\n } else {\n lines.push(`export const ${getExportName(schema.id)} = { id: ${id}, path: null, keys: ${keysName} };`);\n }\n }\n\n const first = file.schemas[0];\n\n if (first !== undefined) {\n lines.push(`export default ${getExportName(first.id)};`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst sanitizeSummary = (summary: string): string => summary.replaceAll(\"*/\", String.raw`*\\/`);\n\nconst allocateInterfaceName = (schemaId: string, usedNames: Set<string>): string => {\n const base = `${schemaId\n .split(/[^a-zA-Z0-9]+/)\n .filter((part) => part.length > 0)\n .map((part) => upperFirst(part))\n .join(\"\")}Keys`;\n\n let name = base;\n let suffix = 2;\n\n while (usedNames.has(name)) {\n name = `${base}${String(suffix)}`;\n suffix += 1;\n }\n\n usedNames.add(name);\n\n return name;\n};\n\nconst renderKeysType = (name: string, schema: ParsedSchema): string[] => {\n const lines = [` type ${name} = {`];\n\n for (const key of schema.keys) {\n if (key.summary !== null) {\n lines.push(` /** ${sanitizeSummary(key.summary)} */`);\n }\n\n lines.push(` ${toJsStringLiteral(key.name)}: ${toJsStringLiteral(runtimeKindForKey(key))};`);\n }\n\n lines.push(\" };\");\n\n return lines;\n};\n\nconst boundRefTypeLines = (interfaceName: string, indent: string): string[] => [\n `${indent}id: string;`,\n `${indent}path: string | null;`,\n `${indent}keys: ${interfaceName};`,\n];\n\nconst renderSchemaConst = (schema: ParsedSchema, interfaceName: string): string[] => {\n const exportName = getExportName(schema.id);\n\n if (schema.path !== null) {\n return [\n ` const ${exportName}: {`,\n ` id: ${toJsStringLiteral(schema.id)};`,\n ...boundRefTypeLines(interfaceName, \" \".repeat(8)).slice(1),\n \" };\",\n ];\n }\n\n return [\n ` const ${exportName}: {`,\n ` id: ${JSON.stringify(schema.id)};`,\n ` keys: ${interfaceName};`,\n \" at(path: string): {\",\n ...boundRefTypeLines(interfaceName, \" \".repeat(12)),\n \" };\",\n \" };\",\n ];\n};\n\nconst renderFileModule = (file: ParsedSchemaFile, usedNames: Set<string>): string[] => {\n const lines = [`declare module \"${file.fileName}\" {`];\n const exportNames: string[] = [];\n\n for (const [index, schema] of file.schemas.entries()) {\n if (index > 0) {\n lines.push(\"\");\n }\n\n const interfaceName = allocateInterfaceName(schema.id, usedNames);\n lines.push(...renderKeysType(interfaceName, schema), \"\", ...renderSchemaConst(schema, interfaceName));\n exportNames.push(getExportName(schema.id));\n }\n\n const [firstExport] = exportNames;\n\n if (firstExport !== undefined) {\n lines.push(\"\", ` export { ${exportNames.join(\", \")} };`, ` export default ${firstExport};`);\n }\n\n lines.push(\"}\");\n\n return lines;\n};\n\nconst renderEnvModule = (files: ParsedSchemaFile[]): string => {\n const usedNames: Set<string> = new Set();\n\n const blocks = files\n .filter((file) => file.schemas.length > 0)\n .map((file) => renderFileModule(file, usedNames).join(\"\\n\"));\n\n return `${[GTKX_ENV_MODULE_HEADER, ...blocks].join(\"\\n\\n\")}\\n`;\n};\n\nexport { renderRuntimeModule, renderEnvModule };\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export declare const SCHEMA_SUFFIX = ".gschema.xml";
|
|
2
|
-
export declare const prependSchemaDir: (dir: string, existing: string | undefined) => string;
|
|
3
|
-
export declare const stageSchema: (dir: string, filePath: string) => void;
|
|
4
1
|
type SchemaEnvResult = {
|
|
5
2
|
path: string;
|
|
6
3
|
written: boolean;
|
|
7
4
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
declare const SCHEMA_SUFFIX = ".gschema.xml";
|
|
6
|
+
declare const prependSchemaDir: (dir: string, existing: string | undefined) => string;
|
|
7
|
+
declare const stageSchema: (dir: string, filePath: string) => void;
|
|
8
|
+
declare const findSchemaFiles: (dataDir: string) => string[];
|
|
9
|
+
declare const stageAndCompileProjectSchemas: (root: string, dataDir: string | null) => string | null;
|
|
10
|
+
declare const schemaEnvPath: (rootDir: string) => string;
|
|
11
|
+
declare const emitSchemaEnv: (rootDir: string, dataDir: string | null) => SchemaEnvResult;
|
|
12
|
+
export { SCHEMA_SUFFIX, prependSchemaDir, stageSchema, findSchemaFiles, stageAndCompileProjectSchemas, schemaEnvPath, emitSchemaEnv, };
|
|
13
13
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/settings/schema.ts"],"names":[],"mappings":"AAWA,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/settings/schema.ts"],"names":[],"mappings":"AAWA,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,aAAa,iBAAiB,CAAC;AAGrC,QAAA,MAAM,gBAAgB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAUrE,CAAC;AAKF,QAAA,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,IAEpD,CAAC;AA6BF,QAAA,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,MAAM,EAKhD,CAAC;AAEF,QAAA,MAAM,6BAA6B,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAwBtF,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MAA4D,CAAC;AAmDtG,QAAA,MAAM,aAAa,GAAI,SAAS,MAAM,EAAE,SAAS,MAAM,GAAG,IAAI,KAAG,eAShE,CAAC;AAEF,OAAO,EACH,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,6BAA6B,EAC7B,aAAa,EACb,aAAa,GAChB,CAAC"}
|
package/dist/settings/schema.js
CHANGED
|
@@ -1,28 +1,30 @@
|
|
|
1
|
+
import { sortStrings, warn } from "@gtkx/utils";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
3
|
import { copyFileSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
4
|
import { tmpdir } from "node:os";
|
|
4
5
|
import { dirname, join, relative } from "node:path";
|
|
5
|
-
import { sortStrings, warn } from "@gtkx/utils";
|
|
6
6
|
import { DATA_IMPORT_PREFIX } from "../internal/data-dir.js";
|
|
7
7
|
import { removeTempDir } from "../internal/staging-dir.js";
|
|
8
8
|
import { compileSchemas } from "./compile.js";
|
|
9
9
|
import { parseSchemaXml, SchemaParseError } from "./parser.js";
|
|
10
10
|
import { renderEnvModule } from "./render.js";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const SCHEMA_SUFFIX = ".gschema.xml";
|
|
12
|
+
const STAGED_NAME_LENGTH = 16;
|
|
13
|
+
const prependSchemaDir = (dir, existing) => {
|
|
14
|
+
if (existing === undefined || existing.length === 0) {
|
|
14
15
|
return dir;
|
|
15
|
-
|
|
16
|
+
}
|
|
17
|
+
if (existing.split(":").includes(dir)) {
|
|
16
18
|
return existing;
|
|
19
|
+
}
|
|
17
20
|
return `${dir}:${existing}`;
|
|
18
21
|
};
|
|
19
|
-
const STAGED_NAME_LENGTH = 16;
|
|
20
22
|
const stagedSchemaName = (filePath) => `${createHash("sha1").update(filePath).digest("hex").slice(0, STAGED_NAME_LENGTH)}${SCHEMA_SUFFIX}`;
|
|
21
|
-
|
|
23
|
+
const stageSchema = (dir, filePath) => {
|
|
22
24
|
copyFileSync(filePath, join(dir, stagedSchemaName(filePath)));
|
|
23
25
|
};
|
|
24
26
|
const toForwardSlashes = (value) => value.replaceAll(/[/\\]/g, "/");
|
|
25
|
-
const
|
|
27
|
+
const getModuleSpecifier = (dataDirAbs, filePath) => `${DATA_IMPORT_PREFIX}/${toForwardSlashes(relative(dataDirAbs, filePath))}`;
|
|
26
28
|
const readVisibleEntries = (dir) => {
|
|
27
29
|
try {
|
|
28
30
|
return readdirSync(dir, { withFileTypes: true }).filter((entry) => !entry.name.startsWith("."));
|
|
@@ -32,72 +34,88 @@ const readVisibleEntries = (dir) => {
|
|
|
32
34
|
}
|
|
33
35
|
};
|
|
34
36
|
const isSchemaFile = (entry) => entry.isFile() && entry.name.endsWith(SCHEMA_SUFFIX);
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (entry.isDirectory()) {
|
|
41
|
-
walk(full);
|
|
42
|
-
}
|
|
43
|
-
else if (isSchemaFile(entry)) {
|
|
44
|
-
found.push(full);
|
|
45
|
-
}
|
|
37
|
+
const collectSchemaFiles = (dir, found) => {
|
|
38
|
+
for (const entry of readVisibleEntries(dir)) {
|
|
39
|
+
const full = join(dir, entry.name);
|
|
40
|
+
if (entry.isDirectory()) {
|
|
41
|
+
collectSchemaFiles(full, found);
|
|
46
42
|
}
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
else if (isSchemaFile(entry)) {
|
|
44
|
+
found.push(full);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const findSchemaFiles = (dataDir) => {
|
|
49
|
+
const found = [];
|
|
50
|
+
collectSchemaFiles(dataDir, found);
|
|
49
51
|
return sortStrings(found);
|
|
50
52
|
};
|
|
51
|
-
|
|
52
|
-
if (dataDir === null)
|
|
53
|
+
const stageAndCompileProjectSchemas = (root, dataDir) => {
|
|
54
|
+
if (dataDir === null) {
|
|
53
55
|
return null;
|
|
56
|
+
}
|
|
54
57
|
const schemaFiles = findSchemaFiles(join(root, dataDir));
|
|
55
|
-
if (schemaFiles.length === 0)
|
|
58
|
+
if (schemaFiles.length === 0) {
|
|
56
59
|
return null;
|
|
60
|
+
}
|
|
57
61
|
const dir = mkdtempSync(join(tmpdir(), "gtkx-schemas-"));
|
|
58
|
-
for (const filePath of schemaFiles)
|
|
62
|
+
for (const filePath of schemaFiles) {
|
|
59
63
|
stageSchema(dir, filePath);
|
|
64
|
+
}
|
|
60
65
|
compileSchemas(dir);
|
|
61
|
-
process.once("exit", () =>
|
|
66
|
+
process.once("exit", () => {
|
|
67
|
+
removeTempDir(dir);
|
|
68
|
+
});
|
|
62
69
|
return dir;
|
|
63
70
|
};
|
|
64
|
-
|
|
71
|
+
const schemaEnvPath = (rootDir) => join(rootDir, "node_modules", ".gtkx", "env.d.ts");
|
|
72
|
+
const parseSchemaFileOrWarn = (filePath, dataDirAbs) => {
|
|
73
|
+
const specifier = getModuleSpecifier(dataDirAbs, filePath);
|
|
74
|
+
try {
|
|
75
|
+
return parseSchemaXml(readFileSync(filePath, "utf8"), specifier);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (!(error instanceof SchemaParseError)) {
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
warn(`Skipping ${filePath} in schema type generation: ${error.message}`);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
65
85
|
const parseProjectSchemas = (schemaFiles, dataDirAbs) => {
|
|
66
86
|
const parsed = [];
|
|
67
87
|
for (const filePath of schemaFiles) {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
parsed.push(
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
if (!(error instanceof SchemaParseError))
|
|
74
|
-
throw error;
|
|
75
|
-
warn(`Skipping ${filePath} in schema type generation: ${error.message}`);
|
|
88
|
+
const result = parseSchemaFileOrWarn(filePath, dataDirAbs);
|
|
89
|
+
if (result !== null) {
|
|
90
|
+
parsed.push(result);
|
|
76
91
|
}
|
|
77
92
|
}
|
|
78
93
|
return parsed;
|
|
79
94
|
};
|
|
80
|
-
const
|
|
81
|
-
let existing = null;
|
|
95
|
+
const readFileOrNull = (path) => {
|
|
82
96
|
try {
|
|
83
|
-
|
|
97
|
+
return readFileSync(path, "utf8");
|
|
84
98
|
}
|
|
85
99
|
catch {
|
|
86
|
-
|
|
100
|
+
return null;
|
|
87
101
|
}
|
|
88
|
-
|
|
102
|
+
};
|
|
103
|
+
const didWriteChanges = (path, content) => {
|
|
104
|
+
if (readFileOrNull(path) === content) {
|
|
89
105
|
return false;
|
|
106
|
+
}
|
|
90
107
|
mkdirSync(dirname(path), { recursive: true });
|
|
91
108
|
writeFileSync(path, content);
|
|
92
109
|
return true;
|
|
93
110
|
};
|
|
94
|
-
|
|
111
|
+
const emitSchemaEnv = (rootDir, dataDir) => {
|
|
95
112
|
const dataDirAbs = dataDir === null ? null : join(rootDir, dataDir);
|
|
96
113
|
const schemaFiles = dataDirAbs === null ? [] : findSchemaFiles(dataDirAbs);
|
|
97
114
|
const parsed = dataDirAbs === null ? [] : parseProjectSchemas(schemaFiles, dataDirAbs);
|
|
98
115
|
const content = renderEnvModule(parsed);
|
|
99
116
|
const path = schemaEnvPath(rootDir);
|
|
100
|
-
const
|
|
101
|
-
return { path, written };
|
|
117
|
+
const isWritten = didWriteChanges(path, content);
|
|
118
|
+
return { path, written: isWritten };
|
|
102
119
|
};
|
|
120
|
+
export { SCHEMA_SUFFIX, prependSchemaDir, stageSchema, findSchemaFiles, stageAndCompileProjectSchemas, schemaEnvPath, emitSchemaEnv, };
|
|
103
121
|
//# sourceMappingURL=schema.js.map
|