@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.
Files changed (286) hide show
  1. package/dist/builder.d.ts +3 -2
  2. package/dist/builder.d.ts.map +1 -1
  3. package/dist/builder.js +2 -1
  4. package/dist/builder.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +21 -6
  8. package/dist/cli.js.map +1 -1
  9. package/dist/codegen/freshness.d.ts +5 -5
  10. package/dist/codegen/freshness.d.ts.map +1 -1
  11. package/dist/codegen/freshness.js +26 -23
  12. package/dist/codegen/freshness.js.map +1 -1
  13. package/dist/codegen/report.d.ts +2 -1
  14. package/dist/codegen/report.d.ts.map +1 -1
  15. package/dist/codegen/report.js +4 -2
  16. package/dist/codegen/report.js.map +1 -1
  17. package/dist/codegen/run-codegen.d.ts +8 -8
  18. package/dist/codegen/run-codegen.d.ts.map +1 -1
  19. package/dist/codegen/run-codegen.js +72 -43
  20. package/dist/codegen/run-codegen.js.map +1 -1
  21. package/dist/codegen/store-resolver.d.ts +8 -5
  22. package/dist/codegen/store-resolver.d.ts.map +1 -1
  23. package/dist/codegen/store-resolver.js +26 -6
  24. package/dist/codegen/store-resolver.js.map +1 -1
  25. package/dist/commands/build.d.ts +4 -3
  26. package/dist/commands/build.d.ts.map +1 -1
  27. package/dist/commands/build.js +2 -1
  28. package/dist/commands/build.js.map +1 -1
  29. package/dist/commands/codegen.d.ts +2 -1
  30. package/dist/commands/codegen.d.ts.map +1 -1
  31. package/dist/commands/codegen.js +6 -4
  32. package/dist/commands/codegen.js.map +1 -1
  33. package/dist/commands/dev.d.ts +2 -1
  34. package/dist/commands/dev.d.ts.map +1 -1
  35. package/dist/commands/dev.js +2 -1
  36. package/dist/commands/dev.js.map +1 -1
  37. package/dist/commands/docs.d.ts +2 -1
  38. package/dist/commands/docs.d.ts.map +1 -1
  39. package/dist/commands/docs.js +22 -7
  40. package/dist/commands/docs.js.map +1 -1
  41. package/dist/dev/icon-dir.d.ts +2 -1
  42. package/dist/dev/icon-dir.d.ts.map +1 -1
  43. package/dist/dev/icon-dir.js +6 -3
  44. package/dist/dev/icon-dir.js.map +1 -1
  45. package/dist/dev/refresh-tracker.d.ts +5 -4
  46. package/dist/dev/refresh-tracker.d.ts.map +1 -1
  47. package/dist/dev/refresh-tracker.js +6 -5
  48. package/dist/dev/refresh-tracker.js.map +1 -1
  49. package/dist/dev/runner-deps.d.ts +2 -1
  50. package/dist/dev/runner-deps.d.ts.map +1 -1
  51. package/dist/dev/runner-deps.js +20 -4
  52. package/dist/dev/runner-deps.js.map +1 -1
  53. package/dist/dev/runner-main.d.ts +2 -1
  54. package/dist/dev/runner-main.d.ts.map +1 -1
  55. package/dist/dev/runner-main.js +3 -2
  56. package/dist/dev/runner-main.js.map +1 -1
  57. package/dist/dev/runner.d.ts +6 -5
  58. package/dist/dev/runner.d.ts.map +1 -1
  59. package/dist/dev/runner.js +69 -38
  60. package/dist/dev/runner.js.map +1 -1
  61. package/dist/dev/schema-dir.d.ts +2 -1
  62. package/dist/dev/schema-dir.d.ts.map +1 -1
  63. package/dist/dev/schema-dir.js +4 -2
  64. package/dist/dev/schema-dir.js.map +1 -1
  65. package/dist/dev/supervisor.d.ts +7 -6
  66. package/dist/dev/supervisor.d.ts.map +1 -1
  67. package/dist/dev/supervisor.js +107 -67
  68. package/dist/dev/supervisor.js.map +1 -1
  69. package/dist/dev/vite-dev-server.d.ts +3 -3
  70. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  71. package/dist/dev/vite-dev-server.js +2 -1
  72. package/dist/dev/vite-dev-server.js.map +1 -1
  73. package/dist/internal/banner.d.ts +2 -1
  74. package/dist/internal/banner.d.ts.map +1 -1
  75. package/dist/internal/banner.js +2 -1
  76. package/dist/internal/banner.js.map +1 -1
  77. package/dist/internal/data-dir.d.ts +3 -2
  78. package/dist/internal/data-dir.d.ts.map +1 -1
  79. package/dist/internal/data-dir.js +29 -14
  80. package/dist/internal/data-dir.js.map +1 -1
  81. package/dist/internal/entry-arg.d.ts +5 -4
  82. package/dist/internal/entry-arg.d.ts.map +1 -1
  83. package/dist/internal/entry-arg.js +10 -7
  84. package/dist/internal/entry-arg.js.map +1 -1
  85. package/dist/internal/errors.d.ts +3 -2
  86. package/dist/internal/errors.d.ts.map +1 -1
  87. package/dist/internal/errors.js +7 -5
  88. package/dist/internal/errors.js.map +1 -1
  89. package/dist/internal/list-files.d.ts +3 -2
  90. package/dist/internal/list-files.d.ts.map +1 -1
  91. package/dist/internal/list-files.js +5 -3
  92. package/dist/internal/list-files.js.map +1 -1
  93. package/dist/internal/resolve-cli-tool.d.ts +2 -1
  94. package/dist/internal/resolve-cli-tool.d.ts.map +1 -1
  95. package/dist/internal/resolve-cli-tool.js +17 -10
  96. package/dist/internal/resolve-cli-tool.js.map +1 -1
  97. package/dist/internal/staging-dir.d.ts +3 -2
  98. package/dist/internal/staging-dir.d.ts.map +1 -1
  99. package/dist/internal/staging-dir.js +3 -2
  100. package/dist/internal/staging-dir.js.map +1 -1
  101. package/dist/internal/xdg-data-dirs.d.ts +2 -1
  102. package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
  103. package/dist/internal/xdg-data-dirs.js +4 -2
  104. package/dist/internal/xdg-data-dirs.js.map +1 -1
  105. package/dist/mcp/client.d.ts +9 -4
  106. package/dist/mcp/client.d.ts.map +1 -1
  107. package/dist/mcp/client.js +106 -81
  108. package/dist/mcp/client.js.map +1 -1
  109. package/dist/mcp/handlers.d.ts +3 -2
  110. package/dist/mcp/handlers.d.ts.map +1 -1
  111. package/dist/mcp/handlers.js +89 -61
  112. package/dist/mcp/handlers.js.map +1 -1
  113. package/dist/mcp/index.d.ts +2 -2
  114. package/dist/mcp/index.d.ts.map +1 -1
  115. package/dist/mcp/index.js +30 -13
  116. package/dist/mcp/index.js.map +1 -1
  117. package/dist/mcp/serialize-widget.d.ts +3 -3
  118. package/dist/mcp/serialize-widget.d.ts.map +1 -1
  119. package/dist/mcp/serialize-widget.js +9 -6
  120. package/dist/mcp/serialize-widget.js.map +1 -1
  121. package/dist/mcp/testing-loader.d.ts +3 -4
  122. package/dist/mcp/testing-loader.d.ts.map +1 -1
  123. package/dist/mcp/testing-loader.js +43 -21
  124. package/dist/mcp/testing-loader.js.map +1 -1
  125. package/dist/mcp/widget-registry.d.ts +3 -2
  126. package/dist/mcp/widget-registry.d.ts.map +1 -1
  127. package/dist/mcp/widget-registry.js +4 -3
  128. package/dist/mcp/widget-registry.js.map +1 -1
  129. package/dist/refresh-globals.d.ts +2 -0
  130. package/dist/refresh-globals.d.ts.map +1 -0
  131. package/dist/refresh-globals.js +8 -0
  132. package/dist/refresh-globals.js.map +1 -0
  133. package/dist/refresh-runtime.d.ts +5 -11
  134. package/dist/refresh-runtime.d.ts.map +1 -1
  135. package/dist/refresh-runtime.js +16 -14
  136. package/dist/refresh-runtime.js.map +1 -1
  137. package/dist/settings/compile.d.ts +2 -1
  138. package/dist/settings/compile.d.ts.map +1 -1
  139. package/dist/settings/compile.js +6 -4
  140. package/dist/settings/compile.js.map +1 -1
  141. package/dist/settings/parser.d.ts +6 -5
  142. package/dist/settings/parser.d.ts.map +1 -1
  143. package/dist/settings/parser.js +26 -22
  144. package/dist/settings/parser.js.map +1 -1
  145. package/dist/settings/render.d.ts +3 -2
  146. package/dist/settings/render.d.ts.map +1 -1
  147. package/dist/settings/render.js +38 -64
  148. package/dist/settings/render.js.map +1 -1
  149. package/dist/settings/schema.d.ts +8 -8
  150. package/dist/settings/schema.d.ts.map +1 -1
  151. package/dist/settings/schema.js +61 -43
  152. package/dist/settings/schema.js.map +1 -1
  153. package/dist/vite-plugins/asset-extensions.d.ts +4 -3
  154. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  155. package/dist/vite-plugins/asset-extensions.js +4 -3
  156. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  157. package/dist/vite-plugins/built-url.d.ts +2 -1
  158. package/dist/vite-plugins/built-url.d.ts.map +1 -1
  159. package/dist/vite-plugins/built-url.js +19 -13
  160. package/dist/vite-plugins/built-url.js.map +1 -1
  161. package/dist/vite-plugins/css.d.ts +2 -1
  162. package/dist/vite-plugins/css.d.ts.map +1 -1
  163. package/dist/vite-plugins/css.js +23 -15
  164. package/dist/vite-plugins/css.js.map +1 -1
  165. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +5 -4
  166. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -1
  167. package/dist/vite-plugins/fast-refresh/refresh-filter.js +11 -7
  168. package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -1
  169. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +4 -3
  170. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
  171. package/dist/vite-plugins/fast-refresh/swc-refresh.js +45 -41
  172. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
  173. package/dist/vite-plugins/icons.d.ts +2 -1
  174. package/dist/vite-plugins/icons.d.ts.map +1 -1
  175. package/dist/vite-plugins/icons.js +24 -20
  176. package/dist/vite-plugins/icons.js.map +1 -1
  177. package/dist/vite-plugins/index.d.ts +2 -1
  178. package/dist/vite-plugins/index.d.ts.map +1 -1
  179. package/dist/vite-plugins/index.js +3 -2
  180. package/dist/vite-plugins/index.js.map +1 -1
  181. package/dist/vite-plugins/native.d.ts +2 -1
  182. package/dist/vite-plugins/native.d.ts.map +1 -1
  183. package/dist/vite-plugins/native.js +6 -4
  184. package/dist/vite-plugins/native.js.map +1 -1
  185. package/dist/vite-plugins/react-compiler.d.ts +3 -2
  186. package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
  187. package/dist/vite-plugins/react-compiler.js +26 -20
  188. package/dist/vite-plugins/react-compiler.js.map +1 -1
  189. package/dist/vite-plugins/react-dom-prebundle.d.ts +2 -1
  190. package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -1
  191. package/dist/vite-plugins/react-dom-prebundle.js +2 -1
  192. package/dist/vite-plugins/react-dom-prebundle.js.map +1 -1
  193. package/dist/vite-plugins/resource-init-module.d.ts +2 -1
  194. package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
  195. package/dist/vite-plugins/resource-init-module.js +39 -38
  196. package/dist/vite-plugins/resource-init-module.js.map +1 -1
  197. package/dist/vite-plugins/resource-shared.d.ts +7 -5
  198. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  199. package/dist/vite-plugins/resource-shared.js +17 -10
  200. package/dist/vite-plugins/resource-shared.js.map +1 -1
  201. package/dist/vite-plugins/resources.d.ts +3 -2
  202. package/dist/vite-plugins/resources.d.ts.map +1 -1
  203. package/dist/vite-plugins/resources.js +94 -54
  204. package/dist/vite-plugins/resources.js.map +1 -1
  205. package/dist/vite-plugins/settings-worker-env.d.ts +2 -1
  206. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  207. package/dist/vite-plugins/settings-worker-env.js +4 -2
  208. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  209. package/dist/vite-plugins/settings.d.ts +2 -1
  210. package/dist/vite-plugins/settings.d.ts.map +1 -1
  211. package/dist/vite-plugins/settings.js +56 -32
  212. package/dist/vite-plugins/settings.js.map +1 -1
  213. package/dist/vite-plugins/strip-query.d.ts +3 -0
  214. package/dist/vite-plugins/strip-query.d.ts.map +1 -0
  215. package/dist/vite-plugins/strip-query.js +6 -0
  216. package/dist/vite-plugins/strip-query.js.map +1 -0
  217. package/dist/vite-plugins/undeclared-library.d.ts +2 -1
  218. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  219. package/dist/vite-plugins/undeclared-library.js +8 -5
  220. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  221. package/dist/vite-plugins/virtual-module.d.ts +2 -2
  222. package/dist/vite-plugins/virtual-module.d.ts.map +1 -1
  223. package/dist/vite-plugins/virtual-module.js +5 -3
  224. package/dist/vite-plugins/virtual-module.js.map +1 -1
  225. package/dist/vitest-plugin.d.ts.map +1 -1
  226. package/dist/vitest-plugin.js.map +1 -1
  227. package/env.d.ts +21 -61
  228. package/package.json +12 -14
  229. package/src/babel-modules.d.ts +0 -2
  230. package/src/builder.ts +7 -6
  231. package/src/cli.ts +26 -6
  232. package/src/codegen/freshness.ts +38 -25
  233. package/src/codegen/report.ts +10 -2
  234. package/src/codegen/run-codegen.ts +135 -60
  235. package/src/codegen/store-resolver.ts +56 -15
  236. package/src/commands/build.ts +3 -2
  237. package/src/commands/codegen.ts +9 -4
  238. package/src/commands/dev.ts +3 -4
  239. package/src/commands/docs.ts +36 -7
  240. package/src/dev/icon-dir.ts +13 -3
  241. package/src/dev/refresh-tracker.ts +12 -8
  242. package/src/dev/runner-deps.ts +30 -7
  243. package/src/dev/runner-main.ts +4 -3
  244. package/src/dev/runner.ts +100 -41
  245. package/src/dev/schema-dir.ts +7 -2
  246. package/src/dev/supervisor.ts +169 -71
  247. package/src/dev/vite-dev-server.ts +4 -2
  248. package/src/internal/banner.ts +5 -1
  249. package/src/internal/data-dir.ts +47 -16
  250. package/src/internal/entry-arg.ts +16 -8
  251. package/src/internal/errors.ts +15 -7
  252. package/src/internal/list-files.ts +10 -4
  253. package/src/internal/resolve-cli-tool.ts +28 -12
  254. package/src/internal/staging-dir.ts +5 -2
  255. package/src/internal/xdg-data-dirs.ts +8 -2
  256. package/src/mcp/client.ts +143 -85
  257. package/src/mcp/handlers.ts +126 -69
  258. package/src/mcp/index.ts +38 -14
  259. package/src/mcp/serialize-widget.ts +15 -8
  260. package/src/mcp/testing-loader.ts +64 -23
  261. package/src/mcp/widget-registry.ts +11 -5
  262. package/src/refresh-globals.ts +10 -0
  263. package/src/refresh-runtime.ts +20 -16
  264. package/src/settings/compile.ts +7 -4
  265. package/src/settings/parser.ts +69 -30
  266. package/src/settings/render.ts +66 -66
  267. package/src/settings/schema.ts +100 -46
  268. package/src/vite-plugins/asset-extensions.ts +4 -3
  269. package/src/vite-plugins/built-url.ts +30 -15
  270. package/src/vite-plugins/css.ts +35 -20
  271. package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -10
  272. package/src/vite-plugins/fast-refresh/swc-refresh.ts +60 -47
  273. package/src/vite-plugins/icons.ts +40 -24
  274. package/src/vite-plugins/index.ts +6 -3
  275. package/src/vite-plugins/native.ts +14 -5
  276. package/src/vite-plugins/react-compiler.ts +44 -30
  277. package/src/vite-plugins/react-dom-prebundle.ts +4 -1
  278. package/src/vite-plugins/resource-init-module.ts +41 -38
  279. package/src/vite-plugins/resource-shared.ts +27 -14
  280. package/src/vite-plugins/resources.ts +153 -59
  281. package/src/vite-plugins/settings-worker-env.ts +7 -2
  282. package/src/vite-plugins/settings.ts +107 -42
  283. package/src/vite-plugins/strip-query.ts +7 -0
  284. package/src/vite-plugins/undeclared-library.ts +21 -12
  285. package/src/vite-plugins/virtual-module.ts +9 -2
  286. package/src/vitest-plugin.ts +1 -2
@@ -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 merged = new Map();
76
- const visited = new Set();
77
- const collect = (current) => {
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
- export const parseSchemaXml = (xml, fileName) => {
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":"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","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
- export declare const renderRuntimeModule: (file: ParsedSchemaFile) => string;
3
- export declare const renderEnvModule: (files: ParsedSchemaFile[]) => string;
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;AA2D7E,eAAO,MAAM,mBAAmB,SAAU,gBAAgB,KAAG,MAmB5D,CAAC;AAiFF,eAAO,MAAM,eAAe,UAAW,gBAAgB,EAAE,KAAG,MAM3D,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"}
@@ -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("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
21
- const exportNameFor = (schemaId) => schemaId.replaceAll(".", "_");
22
- const unionOf = (values) => values.map(toJsStringLiteral).join(" | ");
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
- const nicks = file.enums.get(key.enumId);
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 runtimeKeysFor = (schema) => {
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
- export const renderRuntimeModule = (file) => {
24
+ const renderRuntimeModule = (file) => {
49
25
  const lines = [];
50
- file.schemas.forEach((schema, index) => {
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} = ${runtimeKeysFor(schema)};`);
29
+ lines.push(`const ${keysName} = ${getRuntimeKeys(schema)};`);
54
30
  if (schema.path === null) {
55
- lines.push(`export const ${exportNameFor(schema.id)} = { id: ${id}, keys: ${keysName}, at: (path) => ({ id: ${id}, path, keys: ${keysName} }) };`);
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 ${exportNameFor(schema.id)} = { id: ${id}, path: null, keys: ${keysName} };`);
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 ${exportNameFor(first.id)};`);
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 interfaceNameFor = (schemaId, usedNames) => {
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, file) => {
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)}: ${tsTypeForKey(key, file)};`);
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: { [P in keyof ${interfaceName}]: string };`,
98
- `${indent}__keys__?: ${interfaceName};`,
74
+ `${indent}keys: ${interfaceName};`,
99
75
  ];
100
76
  const renderSchemaConst = (schema, interfaceName) => {
101
- const exportName = exportNameFor(schema.id);
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, " ").slice(1),
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: { [P in keyof ${interfaceName}]: string };`,
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.forEach((schema, index) => {
125
- if (index > 0)
99
+ for (const [index, schema] of file.schemas.entries()) {
100
+ if (index > 0) {
126
101
  lines.push("");
127
- const interfaceName = interfaceNameFor(schema.id, usedNames);
128
- lines.push(...renderKeysType(interfaceName, schema, file));
129
- lines.push("");
130
- lines.push(...renderSchemaConst(schema, interfaceName));
131
- exportNames.push(exportNameFor(schema.id));
132
- });
133
- if (exportNames.length > 0) {
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
- export const renderEnvModule = (files) => {
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":"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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 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
- export declare const findSchemaFiles: (dataDir: string) => string[];
9
- export declare const stageAndCompileProjectSchemas: (root: string, dataDir: string | null) => string | null;
10
- export declare const schemaEnvPath: (rootDir: string) => string;
11
- export declare const emitSchemaEnv: (rootDir: string, dataDir: string | null) => SchemaEnvResult;
12
- export {};
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,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C,eAAO,MAAM,gBAAgB,QAAS,MAAM,YAAY,MAAM,GAAG,SAAS,KAAG,MAI5E,CAAC;AAOF,eAAO,MAAM,WAAW,QAAS,MAAM,YAAY,MAAM,KAAG,IAE3D,CAAC;AAOF,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAYF,eAAO,MAAM,eAAe,YAAa,MAAM,KAAG,MAAM,EAcvD,CAAC;AAEF,eAAO,MAAM,6BAA6B,SAAU,MAAM,WAAW,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAW7F,CAAC;AAEF,eAAO,MAAM,aAAa,YAAa,MAAM,KAAG,MAA4D,CAAC;AA6B7G,eAAO,MAAM,aAAa,YAAa,MAAM,WAAW,MAAM,GAAG,IAAI,KAAG,eAQvE,CAAC"}
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"}
@@ -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
- export const SCHEMA_SUFFIX = ".gschema.xml";
12
- export const prependSchemaDir = (dir, existing) => {
13
- if (existing === undefined || existing.length === 0)
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
- if (existing.split(":").includes(dir))
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
- export const stageSchema = (dir, filePath) => {
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 moduleSpecifierFor = (dataDirAbs, filePath) => `${DATA_IMPORT_PREFIX}/${toForwardSlashes(relative(dataDirAbs, filePath))}`;
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
- export const findSchemaFiles = (dataDir) => {
36
- const found = [];
37
- const walk = (dir) => {
38
- for (const entry of readVisibleEntries(dir)) {
39
- const full = join(dir, entry.name);
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
- walk(dataDir);
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
- export const stageAndCompileProjectSchemas = (root, dataDir) => {
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", () => removeTempDir(dir));
66
+ process.once("exit", () => {
67
+ removeTempDir(dir);
68
+ });
62
69
  return dir;
63
70
  };
64
- export const schemaEnvPath = (rootDir) => join(rootDir, "node_modules", ".gtkx", "env.d.ts");
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 specifier = moduleSpecifierFor(dataDirAbs, filePath);
69
- try {
70
- parsed.push(parseSchemaXml(readFileSync(filePath, "utf-8"), specifier));
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 writeIfChanged = (path, content) => {
81
- let existing = null;
95
+ const readFileOrNull = (path) => {
82
96
  try {
83
- existing = readFileSync(path, "utf-8");
97
+ return readFileSync(path, "utf8");
84
98
  }
85
99
  catch {
86
- existing = null;
100
+ return null;
87
101
  }
88
- if (existing === content)
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
- export const emitSchemaEnv = (rootDir, dataDir) => {
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 written = writeIfChanged(path, content);
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