@gtkx/cli 0.21.0 → 1.0.0-rc.1

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 (346) hide show
  1. package/README.md +173 -0
  2. package/bin/gtkx-dev-runner.js +9 -0
  3. package/dist/builder.d.ts +2 -50
  4. package/dist/builder.d.ts.map +1 -1
  5. package/dist/builder.js +22 -56
  6. package/dist/builder.js.map +1 -1
  7. package/dist/cli.d.ts +1 -2
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +11 -124
  10. package/dist/cli.js.map +1 -1
  11. package/dist/codegen/freshness.d.ts +11 -0
  12. package/dist/codegen/freshness.d.ts.map +1 -0
  13. package/dist/codegen/freshness.js +42 -0
  14. package/dist/codegen/freshness.js.map +1 -0
  15. package/dist/codegen/report.d.ts +3 -0
  16. package/dist/codegen/report.d.ts.map +1 -0
  17. package/dist/codegen/report.js +16 -0
  18. package/dist/codegen/report.js.map +1 -0
  19. package/dist/codegen/run-codegen.d.ts +35 -0
  20. package/dist/codegen/run-codegen.d.ts.map +1 -0
  21. package/dist/codegen/run-codegen.js +133 -0
  22. package/dist/codegen/run-codegen.js.map +1 -0
  23. package/dist/codegen/store-resolver.d.ts +21 -0
  24. package/dist/codegen/store-resolver.d.ts.map +1 -0
  25. package/dist/codegen/store-resolver.js +52 -0
  26. package/dist/codegen/store-resolver.js.map +1 -0
  27. package/dist/commands/build.d.ts +9 -0
  28. package/dist/commands/build.d.ts.map +1 -0
  29. package/dist/commands/build.js +33 -0
  30. package/dist/commands/build.js.map +1 -0
  31. package/dist/commands/codegen.d.ts +9 -0
  32. package/dist/commands/codegen.d.ts.map +1 -0
  33. package/dist/commands/codegen.js +40 -0
  34. package/dist/commands/codegen.js.map +1 -0
  35. package/dist/commands/dev.d.ts +5 -0
  36. package/dist/commands/dev.d.ts.map +1 -0
  37. package/dist/commands/dev.js +21 -0
  38. package/dist/commands/dev.js.map +1 -0
  39. package/dist/commands/docs.d.ts +19 -0
  40. package/dist/commands/docs.d.ts.map +1 -0
  41. package/dist/commands/docs.js +59 -0
  42. package/dist/commands/docs.js.map +1 -0
  43. package/dist/dev/icon-dir.d.ts +2 -0
  44. package/dist/dev/icon-dir.d.ts.map +1 -0
  45. package/dist/dev/icon-dir.js +13 -0
  46. package/dist/dev/icon-dir.js.map +1 -0
  47. package/dist/dev/refresh-tracker.d.ts +6 -0
  48. package/dist/dev/refresh-tracker.d.ts.map +1 -0
  49. package/dist/dev/refresh-tracker.js +18 -0
  50. package/dist/dev/refresh-tracker.js.map +1 -0
  51. package/dist/dev/runner-deps.d.ts +3 -0
  52. package/dist/dev/runner-deps.d.ts.map +1 -0
  53. package/dist/dev/runner-deps.js +39 -0
  54. package/dist/dev/runner-deps.js.map +1 -0
  55. package/dist/dev/runner-main.d.ts +2 -0
  56. package/dist/dev/runner-main.d.ts.map +1 -0
  57. package/dist/dev/runner-main.js +28 -0
  58. package/dist/dev/runner-main.js.map +1 -0
  59. package/dist/dev/runner.d.ts +23 -0
  60. package/dist/dev/runner.d.ts.map +1 -0
  61. package/dist/dev/runner.js +88 -0
  62. package/dist/dev/runner.js.map +1 -0
  63. package/dist/dev/schema-dir.d.ts +2 -0
  64. package/dist/dev/schema-dir.d.ts.map +1 -0
  65. package/dist/dev/schema-dir.js +10 -0
  66. package/dist/dev/schema-dir.js.map +1 -0
  67. package/dist/dev/supervisor.d.ts +17 -0
  68. package/dist/dev/supervisor.d.ts.map +1 -0
  69. package/dist/dev/supervisor.js +142 -0
  70. package/dist/dev/supervisor.js.map +1 -0
  71. package/dist/dev/vite-dev-server.d.ts +21 -0
  72. package/dist/dev/vite-dev-server.d.ts.map +1 -0
  73. package/dist/dev/vite-dev-server.js +12 -0
  74. package/dist/dev/vite-dev-server.js.map +1 -0
  75. package/dist/internal/banner.d.ts +3 -0
  76. package/dist/internal/banner.d.ts.map +1 -0
  77. package/dist/internal/banner.js +8 -0
  78. package/dist/internal/banner.js.map +1 -0
  79. package/dist/internal/data-dir.d.ts +3 -0
  80. package/dist/internal/data-dir.d.ts.map +1 -0
  81. package/dist/internal/data-dir.js +37 -0
  82. package/dist/internal/data-dir.js.map +1 -0
  83. package/dist/internal/entry-arg.d.ts +19 -0
  84. package/dist/internal/entry-arg.d.ts.map +1 -0
  85. package/dist/internal/entry-arg.js +33 -0
  86. package/dist/internal/entry-arg.js.map +1 -0
  87. package/dist/internal/errors.d.ts +4 -0
  88. package/dist/internal/errors.d.ts.map +1 -0
  89. package/dist/internal/errors.js +27 -0
  90. package/dist/internal/errors.js.map +1 -0
  91. package/dist/internal/list-files.d.ts +6 -0
  92. package/dist/internal/list-files.d.ts.map +1 -0
  93. package/dist/internal/list-files.js +13 -0
  94. package/dist/internal/list-files.js.map +1 -0
  95. package/dist/internal/resolve-cli-tool.d.ts +2 -0
  96. package/dist/internal/resolve-cli-tool.d.ts.map +1 -0
  97. package/dist/internal/resolve-cli-tool.js +20 -0
  98. package/dist/internal/resolve-cli-tool.js.map +1 -0
  99. package/dist/internal/staging-dir.d.ts +3 -0
  100. package/dist/internal/staging-dir.d.ts.map +1 -0
  101. package/dist/internal/staging-dir.js +16 -0
  102. package/dist/internal/staging-dir.js.map +1 -0
  103. package/dist/internal/xdg-data-dirs.d.ts +2 -0
  104. package/dist/internal/xdg-data-dirs.d.ts.map +1 -0
  105. package/dist/internal/xdg-data-dirs.js +8 -0
  106. package/dist/internal/xdg-data-dirs.js.map +1 -0
  107. package/dist/mcp/client.d.ts +23 -0
  108. package/dist/mcp/client.d.ts.map +1 -0
  109. package/dist/mcp/client.js +157 -0
  110. package/dist/mcp/client.js.map +1 -0
  111. package/dist/mcp/handlers.d.ts +8 -0
  112. package/dist/mcp/handlers.d.ts.map +1 -0
  113. package/dist/mcp/handlers.js +119 -0
  114. package/dist/mcp/handlers.js.map +1 -0
  115. package/dist/mcp/index.d.ts +4 -0
  116. package/dist/mcp/index.d.ts.map +1 -0
  117. package/dist/mcp/index.js +17 -0
  118. package/dist/mcp/index.js.map +1 -0
  119. package/dist/mcp/serialize-widget.d.ts +10 -0
  120. package/dist/mcp/serialize-widget.d.ts.map +1 -0
  121. package/dist/mcp/serialize-widget.js +20 -0
  122. package/dist/mcp/serialize-widget.js.map +1 -0
  123. package/dist/mcp/testing-loader.d.ts +6 -0
  124. package/dist/mcp/testing-loader.d.ts.map +1 -0
  125. package/dist/mcp/testing-loader.js +25 -0
  126. package/dist/mcp/testing-loader.js.map +1 -0
  127. package/dist/mcp/widget-registry.d.ts +13 -0
  128. package/dist/mcp/widget-registry.d.ts.map +1 -0
  129. package/dist/mcp/widget-registry.js +38 -0
  130. package/dist/mcp/widget-registry.js.map +1 -0
  131. package/dist/refresh-runtime.d.ts +10 -20
  132. package/dist/refresh-runtime.d.ts.map +1 -1
  133. package/dist/refresh-runtime.js +12 -36
  134. package/dist/refresh-runtime.js.map +1 -1
  135. package/dist/settings/compile.d.ts +2 -0
  136. package/dist/settings/compile.d.ts.map +1 -0
  137. package/dist/settings/compile.js +19 -0
  138. package/dist/settings/compile.js.map +1 -0
  139. package/dist/settings/parser.d.ts +23 -0
  140. package/dist/settings/parser.d.ts.map +1 -0
  141. package/dist/settings/parser.js +117 -0
  142. package/dist/settings/parser.js.map +1 -0
  143. package/dist/settings/render.d.ts +4 -0
  144. package/dist/settings/render.d.ts.map +1 -0
  145. package/dist/settings/render.js +148 -0
  146. package/dist/settings/render.js.map +1 -0
  147. package/dist/settings/schema.d.ts +13 -0
  148. package/dist/settings/schema.d.ts.map +1 -0
  149. package/dist/settings/schema.js +103 -0
  150. package/dist/settings/schema.js.map +1 -0
  151. package/dist/vite-plugins/asset-extensions.d.ts +4 -0
  152. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -0
  153. package/dist/vite-plugins/asset-extensions.js +27 -0
  154. package/dist/vite-plugins/asset-extensions.js.map +1 -0
  155. package/dist/vite-plugins/built-url.d.ts +3 -0
  156. package/dist/vite-plugins/built-url.d.ts.map +1 -0
  157. package/dist/{vite-plugin-gtkx-built-url.js → vite-plugins/built-url.js} +4 -17
  158. package/dist/vite-plugins/built-url.js.map +1 -0
  159. package/dist/vite-plugins/css.d.ts +3 -0
  160. package/dist/vite-plugins/css.d.ts.map +1 -0
  161. package/dist/vite-plugins/css.js +30 -0
  162. package/dist/vite-plugins/css.js.map +1 -0
  163. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +7 -0
  164. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -0
  165. package/dist/vite-plugins/fast-refresh/refresh-filter.js +15 -0
  166. package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -0
  167. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +5 -0
  168. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -0
  169. package/dist/vite-plugins/fast-refresh/swc-refresh.js +66 -0
  170. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -0
  171. package/dist/vite-plugins/icons.d.ts +3 -0
  172. package/dist/vite-plugins/icons.d.ts.map +1 -0
  173. package/dist/vite-plugins/icons.js +47 -0
  174. package/dist/vite-plugins/icons.js.map +1 -0
  175. package/dist/vite-plugins/index.d.ts +3 -0
  176. package/dist/vite-plugins/index.d.ts.map +1 -0
  177. package/dist/vite-plugins/index.js +21 -0
  178. package/dist/vite-plugins/index.js.map +1 -0
  179. package/dist/vite-plugins/native.d.ts +3 -0
  180. package/dist/vite-plugins/native.d.ts.map +1 -0
  181. package/dist/vite-plugins/native.js +60 -0
  182. package/dist/vite-plugins/native.js.map +1 -0
  183. package/dist/vite-plugins/react-compiler.d.ts +4 -0
  184. package/dist/vite-plugins/react-compiler.d.ts.map +1 -0
  185. package/dist/vite-plugins/react-compiler.js +56 -0
  186. package/dist/vite-plugins/react-compiler.js.map +1 -0
  187. package/dist/vite-plugins/react-dom-prebundle.d.ts +3 -0
  188. package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -0
  189. package/dist/vite-plugins/react-dom-prebundle.js +11 -0
  190. package/dist/vite-plugins/react-dom-prebundle.js.map +1 -0
  191. package/dist/vite-plugins/resource-init-module.d.ts +5 -0
  192. package/dist/vite-plugins/resource-init-module.d.ts.map +1 -0
  193. package/dist/vite-plugins/resource-init-module.js +50 -0
  194. package/dist/vite-plugins/resource-init-module.js.map +1 -0
  195. package/dist/vite-plugins/resource-shared.d.ts +6 -0
  196. package/dist/vite-plugins/resource-shared.d.ts.map +1 -0
  197. package/dist/vite-plugins/resource-shared.js +21 -0
  198. package/dist/vite-plugins/resource-shared.js.map +1 -0
  199. package/dist/vite-plugins/resources.d.ts +4 -0
  200. package/dist/vite-plugins/resources.d.ts.map +1 -0
  201. package/dist/vite-plugins/resources.js +220 -0
  202. package/dist/vite-plugins/resources.js.map +1 -0
  203. package/dist/vite-plugins/settings-worker-env.d.ts +3 -0
  204. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -0
  205. package/dist/vite-plugins/settings-worker-env.js +21 -0
  206. package/dist/vite-plugins/settings-worker-env.js.map +1 -0
  207. package/dist/vite-plugins/settings.d.ts +3 -0
  208. package/dist/vite-plugins/settings.d.ts.map +1 -0
  209. package/dist/vite-plugins/settings.js +190 -0
  210. package/dist/vite-plugins/settings.js.map +1 -0
  211. package/dist/vite-plugins/undeclared-library.d.ts +3 -0
  212. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -0
  213. package/dist/vite-plugins/undeclared-library.js +47 -0
  214. package/dist/vite-plugins/undeclared-library.js.map +1 -0
  215. package/dist/vite-plugins/virtual-module.d.ts +22 -0
  216. package/dist/vite-plugins/virtual-module.d.ts.map +1 -0
  217. package/dist/vite-plugins/virtual-module.js +18 -0
  218. package/dist/vite-plugins/virtual-module.js.map +1 -0
  219. package/dist/vitest-plugin.d.ts +10 -0
  220. package/dist/vitest-plugin.d.ts.map +1 -0
  221. package/dist/vitest-plugin.js +12 -0
  222. package/dist/vitest-plugin.js.map +1 -0
  223. package/env.d.ts +131 -8
  224. package/package.json +32 -38
  225. package/src/babel-modules.d.ts +13 -0
  226. package/src/builder.ts +28 -84
  227. package/src/cli.ts +22 -0
  228. package/src/codegen/freshness.ts +52 -0
  229. package/src/codegen/report.ts +20 -0
  230. package/src/codegen/run-codegen.ts +185 -0
  231. package/src/codegen/store-resolver.ts +75 -0
  232. package/src/commands/build.ts +37 -0
  233. package/src/commands/codegen.ts +44 -0
  234. package/src/commands/dev.ts +25 -0
  235. package/src/commands/docs.ts +66 -0
  236. package/src/dev/icon-dir.ts +11 -0
  237. package/src/dev/refresh-tracker.ts +21 -0
  238. package/src/dev/runner-deps.ts +42 -0
  239. package/src/dev/runner-main.ts +33 -0
  240. package/src/dev/runner.ts +126 -0
  241. package/src/dev/schema-dir.ts +11 -0
  242. package/src/dev/supervisor.ts +178 -0
  243. package/src/dev/vite-dev-server.ts +34 -0
  244. package/src/internal/banner.ts +9 -0
  245. package/src/internal/data-dir.ts +39 -0
  246. package/src/internal/entry-arg.ts +38 -0
  247. package/src/internal/errors.ts +28 -0
  248. package/src/internal/list-files.ts +17 -0
  249. package/src/internal/resolve-cli-tool.ts +21 -0
  250. package/src/internal/staging-dir.ts +16 -0
  251. package/src/internal/xdg-data-dirs.ts +7 -0
  252. package/src/mcp/client.ts +177 -0
  253. package/src/mcp/handlers.ts +156 -0
  254. package/src/mcp/index.ts +22 -0
  255. package/src/mcp/serialize-widget.ts +34 -0
  256. package/src/mcp/testing-loader.ts +32 -0
  257. package/src/mcp/widget-registry.ts +43 -0
  258. package/src/refresh-runtime.ts +12 -41
  259. package/src/settings/compile.ts +19 -0
  260. package/src/settings/parser.ts +154 -0
  261. package/src/settings/render.ts +167 -0
  262. package/src/settings/schema.ts +115 -0
  263. package/src/vite-plugins/asset-extensions.ts +28 -0
  264. package/src/{vite-plugin-gtkx-built-url.ts → vite-plugins/built-url.ts} +3 -16
  265. package/src/vite-plugins/css.ts +38 -0
  266. package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -0
  267. package/src/vite-plugins/fast-refresh/swc-refresh.ts +79 -0
  268. package/src/vite-plugins/icons.ts +58 -0
  269. package/src/vite-plugins/index.ts +22 -0
  270. package/src/vite-plugins/native.ts +74 -0
  271. package/src/vite-plugins/react-compiler.ts +70 -0
  272. package/src/vite-plugins/react-dom-prebundle.ts +14 -0
  273. package/src/vite-plugins/resource-init-module.ts +54 -0
  274. package/src/vite-plugins/resource-shared.ts +27 -0
  275. package/src/vite-plugins/resources.ts +272 -0
  276. package/src/vite-plugins/settings-worker-env.ts +25 -0
  277. package/src/vite-plugins/settings.ts +221 -0
  278. package/src/vite-plugins/undeclared-library.ts +69 -0
  279. package/src/vite-plugins/virtual-module.ts +37 -0
  280. package/src/vitest-plugin.ts +14 -0
  281. package/dist/create.d.ts +0 -55
  282. package/dist/create.d.ts.map +0 -1
  283. package/dist/create.js +0 -236
  284. package/dist/create.js.map +0 -1
  285. package/dist/dev-server.d.ts +0 -37
  286. package/dist/dev-server.d.ts.map +0 -1
  287. package/dist/dev-server.js +0 -130
  288. package/dist/dev-server.js.map +0 -1
  289. package/dist/index.d.ts +0 -4
  290. package/dist/index.d.ts.map +0 -1
  291. package/dist/index.js +0 -4
  292. package/dist/index.js.map +0 -1
  293. package/dist/mcp-client.d.ts +0 -31
  294. package/dist/mcp-client.d.ts.map +0 -1
  295. package/dist/mcp-client.js +0 -430
  296. package/dist/mcp-client.js.map +0 -1
  297. package/dist/templates.d.ts +0 -9
  298. package/dist/templates.d.ts.map +0 -1
  299. package/dist/templates.js +0 -16
  300. package/dist/templates.js.map +0 -1
  301. package/dist/vite-plugin-gtkx-assets.d.ts +0 -20
  302. package/dist/vite-plugin-gtkx-assets.d.ts.map +0 -1
  303. package/dist/vite-plugin-gtkx-assets.js +0 -57
  304. package/dist/vite-plugin-gtkx-assets.js.map +0 -1
  305. package/dist/vite-plugin-gtkx-built-url.d.ts +0 -18
  306. package/dist/vite-plugin-gtkx-built-url.d.ts.map +0 -1
  307. package/dist/vite-plugin-gtkx-built-url.js.map +0 -1
  308. package/dist/vite-plugin-gtkx-gsettings.d.ts +0 -28
  309. package/dist/vite-plugin-gtkx-gsettings.d.ts.map +0 -1
  310. package/dist/vite-plugin-gtkx-gsettings.js +0 -147
  311. package/dist/vite-plugin-gtkx-gsettings.js.map +0 -1
  312. package/dist/vite-plugin-gtkx-native.d.ts +0 -14
  313. package/dist/vite-plugin-gtkx-native.d.ts.map +0 -1
  314. package/dist/vite-plugin-gtkx-native.js +0 -53
  315. package/dist/vite-plugin-gtkx-native.js.map +0 -1
  316. package/dist/vite-plugin-gtkx-refresh.d.ts +0 -8
  317. package/dist/vite-plugin-gtkx-refresh.d.ts.map +0 -1
  318. package/dist/vite-plugin-gtkx-refresh.js +0 -37
  319. package/dist/vite-plugin-gtkx-refresh.js.map +0 -1
  320. package/dist/vite-plugin-swc-ssr-refresh.d.ts +0 -8
  321. package/dist/vite-plugin-swc-ssr-refresh.d.ts.map +0 -1
  322. package/dist/vite-plugin-swc-ssr-refresh.js +0 -46
  323. package/dist/vite-plugin-swc-ssr-refresh.js.map +0 -1
  324. package/src/cli.tsx +0 -154
  325. package/src/create.ts +0 -326
  326. package/src/dev-server.tsx +0 -162
  327. package/src/index.ts +0 -3
  328. package/src/mcp-client.ts +0 -518
  329. package/src/templates.ts +0 -26
  330. package/src/vite-plugin-gtkx-assets.ts +0 -69
  331. package/src/vite-plugin-gtkx-gsettings.ts +0 -168
  332. package/src/vite-plugin-gtkx-native.ts +0 -64
  333. package/src/vite-plugin-gtkx-refresh.ts +0 -54
  334. package/src/vite-plugin-swc-ssr-refresh.ts +0 -61
  335. package/templates/claude/EXAMPLES.md.ejs +0 -744
  336. package/templates/claude/SKILL.md.ejs +0 -93
  337. package/templates/claude/WIDGETS.md.ejs +0 -820
  338. package/templates/config/vitest.config.ts.ejs +0 -11
  339. package/templates/gitignore.ejs +0 -4
  340. package/templates/package.json.ejs +0 -16
  341. package/templates/src/app.tsx.ejs +0 -32
  342. package/templates/src/dev.tsx.ejs +0 -5
  343. package/templates/src/gtkx-env.d.ts.ejs +0 -1
  344. package/templates/src/index.tsx.ejs +0 -5
  345. package/templates/tests/app.test.tsx.ejs +0 -16
  346. package/templates/tsconfig.json.ejs +0 -14
@@ -0,0 +1,6 @@
1
+ type TestingModule = typeof import("@gtkx/testing");
2
+ export type TestingModuleLoader = () => Promise<TestingModule>;
3
+ export declare const setTestingModuleLoader: (next: TestingModuleLoader | null) => void;
4
+ export declare const loadTestingModule: () => Promise<TestingModule>;
5
+ export {};
6
+ //# sourceMappingURL=testing-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-loader.d.ts","sourceRoot":"","sources":["../../src/mcp/testing-loader.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG,cAAc,eAAe,CAAC,CAAC;AAEpD,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAQ/D,eAAO,MAAM,sBAAsB,SAAU,mBAAmB,GAAG,IAAI,KAAG,IAIzE,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,aAAa,CAe/D,CAAC"}
@@ -0,0 +1,25 @@
1
+ const defaultLoader = () => import("@gtkx/testing");
2
+ let loader = defaultLoader;
3
+ let testingModule = null;
4
+ let testingLoadError = null;
5
+ export const setTestingModuleLoader = (next) => {
6
+ loader = next ?? defaultLoader;
7
+ testingModule = null;
8
+ testingLoadError = null;
9
+ };
10
+ export const loadTestingModule = async () => {
11
+ if (testingModule)
12
+ return testingModule;
13
+ if (testingLoadError)
14
+ throw testingLoadError;
15
+ try {
16
+ testingModule = await loader();
17
+ return testingModule;
18
+ }
19
+ catch (cause) {
20
+ testingLoadError = new Error("@gtkx/testing is not installed, install it to enable MCP widget interactions: " +
21
+ `pnpm add -D @gtkx/testing (import failed: ${String(cause)})`, { cause });
22
+ throw testingLoadError;
23
+ }
24
+ };
25
+ //# sourceMappingURL=testing-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-loader.js","sourceRoot":"","sources":["../../src/mcp/testing-loader.ts"],"names":[],"mappings":"AAIA,MAAM,aAAa,GAAwB,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAEzE,IAAI,MAAM,GAAwB,aAAa,CAAC;AAChD,IAAI,aAAa,GAAyB,IAAI,CAAC;AAC/C,IAAI,gBAAgB,GAAiB,IAAI,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAgC,EAAQ,EAAE;IAC7E,MAAM,GAAG,IAAI,IAAI,aAAa,CAAC;IAC/B,aAAa,GAAG,IAAI,CAAC;IACrB,gBAAgB,GAAG,IAAI,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,IAA4B,EAAE;IAChE,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,IAAI,gBAAgB;QAAE,MAAM,gBAAgB,CAAC;IAE7C,IAAI,CAAC;QACD,aAAa,GAAG,MAAM,MAAM,EAAE,CAAC;QAC/B,OAAO,aAAa,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,gBAAgB,GAAG,IAAI,KAAK,CACxB,gFAAgF;YAC5E,6CAA6C,MAAM,CAAC,KAAK,CAAC,GAAG,EACjE,EAAE,KAAK,EAAE,CACZ,CAAC;QACF,MAAM,gBAAgB,CAAC;IAC3B,CAAC;AACL,CAAC,CAAC","sourcesContent":["type TestingModule = typeof import(\"@gtkx/testing\");\n\nexport type TestingModuleLoader = () => Promise<TestingModule>;\n\nconst defaultLoader: TestingModuleLoader = () => import(\"@gtkx/testing\");\n\nlet loader: TestingModuleLoader = defaultLoader;\nlet testingModule: TestingModule | null = null;\nlet testingLoadError: Error | null = null;\n\nexport const setTestingModuleLoader = (next: TestingModuleLoader | null): void => {\n loader = next ?? defaultLoader;\n testingModule = null;\n testingLoadError = null;\n};\n\nexport const loadTestingModule = async (): Promise<TestingModule> => {\n if (testingModule) return testingModule;\n if (testingLoadError) throw testingLoadError;\n\n try {\n testingModule = await loader();\n return testingModule;\n } catch (cause) {\n testingLoadError = new Error(\n \"@gtkx/testing is not installed, install it to enable MCP widget interactions: \" +\n `pnpm add -D @gtkx/testing (import failed: ${String(cause)})`,\n { cause },\n );\n throw testingLoadError;\n }\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+ export declare class WidgetRegistry {
3
+ private idByWidget;
4
+ private nextId;
5
+ private widgetById;
6
+ private toplevelWindows;
7
+ refresh(): void;
8
+ toplevels(): Gtk.Window[];
9
+ register(widget: Gtk.Widget): void;
10
+ idFor(widget: Gtk.Widget): string;
11
+ get(id: string): Gtk.Widget | undefined;
12
+ }
13
+ //# sourceMappingURL=widget-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/widget-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,qBAAa,cAAc;IACvB,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,eAAe,CAAoB;IAE3C,OAAO,IAAI,IAAI,CAMd;IAED,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAExB;IAED,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAQjC;IAED,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAOhC;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,SAAS,CAEtC;CACJ"}
@@ -0,0 +1,38 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+ export class WidgetRegistry {
3
+ idByWidget = new WeakMap();
4
+ nextId = 0;
5
+ widgetById = new Map();
6
+ toplevelWindows = [];
7
+ refresh() {
8
+ this.widgetById.clear();
9
+ this.toplevelWindows = Gtk.Window.listToplevels();
10
+ for (const window of this.toplevelWindows) {
11
+ this.register(window);
12
+ }
13
+ }
14
+ toplevels() {
15
+ return this.toplevelWindows;
16
+ }
17
+ register(widget) {
18
+ const id = this.idFor(widget);
19
+ this.widgetById.set(id, widget);
20
+ let child = widget.getFirstChild();
21
+ while (child) {
22
+ this.register(child);
23
+ child = child.getNextSibling();
24
+ }
25
+ }
26
+ idFor(widget) {
27
+ let id = this.idByWidget.get(widget);
28
+ if (!id) {
29
+ id = String(this.nextId++);
30
+ this.idByWidget.set(widget, id);
31
+ }
32
+ return id;
33
+ }
34
+ get(id) {
35
+ return this.widgetById.get(id);
36
+ }
37
+ }
38
+ //# sourceMappingURL=widget-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-registry.js","sourceRoot":"","sources":["../../src/mcp/widget-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,MAAM,OAAO,cAAc;IACf,UAAU,GAAG,IAAI,OAAO,EAAsB,CAAC;IAC/C,MAAM,GAAG,CAAC,CAAC;IACX,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,eAAe,GAAiB,EAAE,CAAC;IAE3C,OAAO;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,EAAkB,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,MAAkB;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAkB;QACpB,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,GAAG,CAAC,EAAU;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;CACJ","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\n\nexport class WidgetRegistry {\n private idByWidget = new WeakMap<Gtk.Widget, string>();\n private nextId = 0;\n private widgetById = new Map<string, Gtk.Widget>();\n private toplevelWindows: Gtk.Window[] = [];\n\n refresh(): void {\n this.widgetById.clear();\n this.toplevelWindows = Gtk.Window.listToplevels() as Gtk.Window[];\n for (const window of this.toplevelWindows) {\n this.register(window);\n }\n }\n\n toplevels(): Gtk.Window[] {\n return this.toplevelWindows;\n }\n\n register(widget: Gtk.Widget): void {\n const id = this.idFor(widget);\n this.widgetById.set(id, widget);\n let child = widget.getFirstChild();\n while (child) {\n this.register(child);\n child = child.getNextSibling();\n }\n }\n\n idFor(widget: Gtk.Widget): string {\n let id = this.idByWidget.get(widget);\n if (!id) {\n id = String(this.nextId++);\n this.idByWidget.set(widget, id);\n }\n return id;\n }\n\n get(id: string): Gtk.Widget | undefined {\n return this.widgetById.get(id);\n }\n}\n"]}
@@ -1,36 +1,26 @@
1
1
  import RefreshRuntime from "react-refresh/runtime";
2
2
  type ComponentType = (...args: unknown[]) => unknown;
3
3
  /**
4
- * Creates registration functions for a module's React components.
4
+ * Builds the per-module `$RefreshReg$` and `$RefreshSig$` hooks that React Refresh
5
+ * transformed code expects, scoping every registered component to the given module.
5
6
  *
6
- * Used internally by the Vite plugin to register components
7
- * for React Fast Refresh.
8
- *
9
- * @param moduleId - Unique identifier for the module
10
- * @returns Registration functions for the module
11
- * @internal
7
+ * @param moduleId Identifier used to namespace registered component types so they are unique across modules.
8
+ * @returns An object with `$RefreshReg$` and `$RefreshSig$` to install as module-local globals.
12
9
  */
13
10
  export declare function createModuleRegistration(moduleId: string): {
14
11
  $RefreshReg$: (type: ComponentType, id: string) => void;
15
12
  $RefreshSig$: typeof RefreshRuntime.createSignatureFunctionForTransform;
16
13
  };
17
14
  /**
18
- * Checks if a module's exports form a React Refresh boundary.
19
- *
20
- * A module is a refresh boundary if all its exports are React components,
21
- * allowing for fast refresh without full page reload.
15
+ * Determines whether a module can act as a React Refresh boundary, meaning every one of
16
+ * its exports (ignoring `__esModule`) looks like a React component type.
22
17
  *
23
- * @param moduleExports - The module's exports object
24
- * @returns `true` if the module can be fast-refreshed
25
- * @internal
18
+ * @param moduleExports The module's export object to inspect.
19
+ * @returns `true` when the module qualifies as a refresh boundary, `false` otherwise.
26
20
  */
27
- export declare function isReactRefreshBoundary(moduleExports: Record<string, unknown>): boolean;
21
+ export declare function isRefreshBoundary(moduleExports: Record<string, unknown>): boolean;
28
22
  /**
29
- * Triggers React Fast Refresh to re-render components.
30
- *
31
- * Called after module updates when all exports are React components.
32
- *
33
- * @internal
23
+ * Applies all pending React Refresh updates, re-rendering components whose modules have changed.
34
24
  */
35
25
  export declare function performRefresh(): void;
36
26
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-runtime.d.ts","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAEnD,KAAK,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAMrD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACxD,YAAY,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,YAAY,EAAE,OAAO,cAAc,CAAC,mCAAmC,CAAC;CAC3E,CAOA;AAqBD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAkBtF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
1
+ {"version":3,"file":"refresh-runtime.d.ts","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAEnD,KAAK,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAMrD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACxD,YAAY,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,YAAY,EAAE,OAAO,cAAc,CAAC,mCAAmC,CAAC;CAC3E,CAOA;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAkBjF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -3,14 +3,11 @@ RefreshRuntime.injectIntoGlobalHook(globalThis);
3
3
  globalThis.$RefreshReg$ = () => { };
4
4
  globalThis.$RefreshSig$ = () => (type) => type;
5
5
  /**
6
- * Creates registration functions for a module's React components.
6
+ * Builds the per-module `$RefreshReg$` and `$RefreshSig$` hooks that React Refresh
7
+ * transformed code expects, scoping every registered component to the given module.
7
8
  *
8
- * Used internally by the Vite plugin to register components
9
- * for React Fast Refresh.
10
- *
11
- * @param moduleId - Unique identifier for the module
12
- * @returns Registration functions for the module
13
- * @internal
9
+ * @param moduleId Identifier used to namespace registered component types so they are unique across modules.
10
+ * @returns An object with `$RefreshReg$` and `$RefreshSig$` to install as module-local globals.
14
11
  */
15
12
  export function createModuleRegistration(moduleId) {
16
13
  return {
@@ -20,31 +17,14 @@ export function createModuleRegistration(moduleId) {
20
17
  $RefreshSig$: RefreshRuntime.createSignatureFunctionForTransform,
21
18
  };
22
19
  }
23
- function isLikelyComponentType(value) {
24
- if (typeof value !== "function") {
25
- return false;
26
- }
27
- const func = value;
28
- if (func.$$typeof === Symbol.for("react.memo") || func.$$typeof === Symbol.for("react.forward_ref")) {
29
- return true;
30
- }
31
- const name = value.name;
32
- if (typeof name === "string" && /^[A-Z]/.test(name)) {
33
- return true;
34
- }
35
- return false;
36
- }
37
20
  /**
38
- * Checks if a module's exports form a React Refresh boundary.
39
- *
40
- * A module is a refresh boundary if all its exports are React components,
41
- * allowing for fast refresh without full page reload.
21
+ * Determines whether a module can act as a React Refresh boundary, meaning every one of
22
+ * its exports (ignoring `__esModule`) looks like a React component type.
42
23
  *
43
- * @param moduleExports - The module's exports object
44
- * @returns `true` if the module can be fast-refreshed
45
- * @internal
24
+ * @param moduleExports The module's export object to inspect.
25
+ * @returns `true` when the module qualifies as a refresh boundary, `false` otherwise.
46
26
  */
47
- export function isReactRefreshBoundary(moduleExports) {
27
+ export function isRefreshBoundary(moduleExports) {
48
28
  if (RefreshRuntime.isLikelyComponentType(moduleExports)) {
49
29
  return true;
50
30
  }
@@ -53,18 +33,14 @@ export function isReactRefreshBoundary(moduleExports) {
53
33
  continue;
54
34
  }
55
35
  const value = moduleExports[key];
56
- if (!isLikelyComponentType(value)) {
36
+ if (!RefreshRuntime.isLikelyComponentType(value)) {
57
37
  return false;
58
38
  }
59
39
  }
60
- return Object.keys(moduleExports).filter((k) => k !== "__esModule").length > 0;
40
+ return Object.keys(moduleExports).some((k) => k !== "__esModule");
61
41
  }
62
42
  /**
63
- * Triggers React Fast Refresh to re-render components.
64
- *
65
- * Called after module updates when all exports are React components.
66
- *
67
- * @internal
43
+ * Applies all pending React Refresh updates, re-rendering components whose modules have changed.
68
44
  */
69
45
  export function performRefresh() {
70
46
  RefreshRuntime.performReactRefresh();
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-runtime.js","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAInD,cAAc,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAChD,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACnC,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC;AAExD;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IAIrD,OAAO;QACH,YAAY,EAAE,CAAC,IAAmB,EAAE,EAAU,EAAE,EAAE;YAC9C,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,YAAY,EAAE,cAAc,CAAC,mCAAmC;KACnE,CAAC;AACN,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,KAA8B,CAAC;IAE5C,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAClG,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,aAAsC;IACzE,IAAI,cAAc,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACvB,SAAS;QACb,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACnF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAC1B,cAAc,CAAC,mBAAmB,EAAE,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"refresh-runtime.js","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAInD,cAAc,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAChD,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACnC,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IAIrD,OAAO;QACH,YAAY,EAAE,CAAC,IAAmB,EAAE,EAAU,EAAE,EAAE;YAC9C,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,YAAY,EAAE,cAAc,CAAC,mCAAmC;KACnE,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAsC;IACpE,IAAI,cAAc,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACvB,SAAS;QACb,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC1B,cAAc,CAAC,mBAAmB,EAAE,CAAC;AACzC,CAAC","sourcesContent":["import RefreshRuntime from \"react-refresh/runtime\";\n\ntype ComponentType = (...args: unknown[]) => unknown;\n\nRefreshRuntime.injectIntoGlobalHook(globalThis);\nglobalThis.$RefreshReg$ = () => {};\nglobalThis.$RefreshSig$ = () => (type: unknown) => type;\n\n/**\n * Builds the per-module `$RefreshReg$` and `$RefreshSig$` hooks that React Refresh\n * transformed code expects, scoping every registered component to the given module.\n *\n * @param moduleId Identifier used to namespace registered component types so they are unique across modules.\n * @returns An object with `$RefreshReg$` and `$RefreshSig$` to install as module-local globals.\n */\nexport function createModuleRegistration(moduleId: string): {\n $RefreshReg$: (type: ComponentType, id: string) => void;\n $RefreshSig$: typeof RefreshRuntime.createSignatureFunctionForTransform;\n} {\n return {\n $RefreshReg$: (type: ComponentType, id: string) => {\n RefreshRuntime.register(type, `${moduleId} ${id}`);\n },\n $RefreshSig$: RefreshRuntime.createSignatureFunctionForTransform,\n };\n}\n\n/**\n * Determines whether a module can act as a React Refresh boundary, meaning every one of\n * its exports (ignoring `__esModule`) looks like a React component type.\n *\n * @param moduleExports The module's export object to inspect.\n * @returns `true` when the module qualifies as a refresh boundary, `false` otherwise.\n */\nexport function isRefreshBoundary(moduleExports: Record<string, unknown>): boolean {\n if (RefreshRuntime.isLikelyComponentType(moduleExports)) {\n return true;\n }\n\n for (const key in moduleExports) {\n if (key === \"__esModule\") {\n continue;\n }\n\n const value = moduleExports[key];\n\n if (!RefreshRuntime.isLikelyComponentType(value)) {\n return false;\n }\n }\n\n return Object.keys(moduleExports).some((k) => k !== \"__esModule\");\n}\n\n/**\n * Applies all pending React Refresh updates, re-rendering components whose modules have changed.\n */\nexport function performRefresh(): void {\n RefreshRuntime.performReactRefresh();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const compileSchemas: (dir: string) => void;
2
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,IAW5C,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { formatChildProcessError } from "@gtkx/utils";
3
+ import { resolveCliTool } from "../internal/resolve-cli-tool.js";
4
+ const SCHEMA_COMPILER = "glib-compile-schemas";
5
+ const SCHEMA_COMPILE_TIMEOUT_MS = 30_000;
6
+ export const compileSchemas = (dir) => {
7
+ try {
8
+ execFileSync(resolveCliTool(SCHEMA_COMPILER), ["--strict", dir], {
9
+ stdio: ["ignore", "pipe", "pipe"],
10
+ timeout: SCHEMA_COMPILE_TIMEOUT_MS,
11
+ encoding: "utf-8",
12
+ });
13
+ }
14
+ catch (error) {
15
+ const details = formatChildProcessError(error);
16
+ throw new Error(`glib-compile-schemas failed for ${dir}${details ? `:\n${details}` : ""}`, { cause: error });
17
+ }
18
+ };
19
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IAChD,IAAI,CAAC;QACD,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;YAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE,OAAO;SACpB,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjH,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { formatChildProcessError } from \"@gtkx/utils\";\nimport { resolveCliTool } from \"../internal/resolve-cli-tool.js\";\n\nconst SCHEMA_COMPILER = \"glib-compile-schemas\";\nconst SCHEMA_COMPILE_TIMEOUT_MS = 30_000;\n\nexport const compileSchemas = (dir: string): void => {\n try {\n execFileSync(resolveCliTool(SCHEMA_COMPILER), [\"--strict\", dir], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: SCHEMA_COMPILE_TIMEOUT_MS,\n encoding: \"utf-8\",\n });\n } catch (error) {\n const details = formatChildProcessError(error);\n throw new Error(`glib-compile-schemas failed for ${dir}${details ? `:\\n${details}` : \"\"}`, { cause: error });\n }\n};\n"]}
@@ -0,0 +1,23 @@
1
+ export type ParsedKey = {
2
+ name: string;
3
+ variantType: string | null;
4
+ enumId: string | null;
5
+ flagsId: string | null;
6
+ choices: string[];
7
+ summary: string | null;
8
+ };
9
+ export type ParsedSchema = {
10
+ id: string;
11
+ path: string | null;
12
+ keys: ParsedKey[];
13
+ };
14
+ export type ParsedSchemaFile = {
15
+ fileName: string;
16
+ schemas: ParsedSchema[];
17
+ enums: Map<string, string[]>;
18
+ flags: Map<string, string[]>;
19
+ };
20
+ export declare class SchemaParseError extends Error {
21
+ }
22
+ export declare const parseSchemaXml: (xml: string, fileName: string) => ParsedSchemaFile;
23
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/settings/parser.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,SAAS,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAChC,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,KAAK;CAAG;AA0G9C,eAAO,MAAM,cAAc,QAAS,MAAM,YAAY,MAAM,KAAG,gBAuB9D,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ export class SchemaParseError extends Error {
3
+ }
4
+ const MULTI_TAGS = new Set(["schema", "key", "enum", "flags", "value", "choice"]);
5
+ const PARSER = new XMLParser({
6
+ ignoreAttributes: false,
7
+ attributeNamePrefix: "@_",
8
+ parseAttributeValue: false,
9
+ parseTagValue: false,
10
+ trimValues: true,
11
+ isArray: (name) => MULTI_TAGS.has(name),
12
+ });
13
+ const isRawNode = (value) => typeof value === "object" && value !== null;
14
+ const attr = (node, name) => {
15
+ const value = node[`@_${name}`];
16
+ return typeof value === "string" ? value : null;
17
+ };
18
+ const text = (node, name) => {
19
+ const value = node[name];
20
+ return typeof value === "string" && value.length > 0 ? value : null;
21
+ };
22
+ const children = (node, name) => {
23
+ const value = node[name];
24
+ if (!Array.isArray(value))
25
+ return [];
26
+ return value.filter(isRawNode);
27
+ };
28
+ const parseNicks = (definition) => children(definition, "value")
29
+ .map((value) => attr(value, "nick"))
30
+ .filter((nick) => nick !== null);
31
+ const parseDefinitions = (schemalist, tag) => {
32
+ const definitions = new Map();
33
+ for (const definition of children(schemalist, tag)) {
34
+ const id = attr(definition, "id");
35
+ if (id !== null)
36
+ definitions.set(id, parseNicks(definition));
37
+ }
38
+ return definitions;
39
+ };
40
+ const parseChoices = (key) => {
41
+ const choices = key.choices;
42
+ if (!isRawNode(choices))
43
+ return [];
44
+ return children(choices, "choice")
45
+ .map((choice) => attr(choice, "value"))
46
+ .filter((value) => value !== null);
47
+ };
48
+ const parseKey = (key, fileName) => {
49
+ const name = attr(key, "name");
50
+ if (name === null) {
51
+ throw new SchemaParseError(`A <key> in ${fileName} has no name attribute`);
52
+ }
53
+ return {
54
+ name,
55
+ variantType: attr(key, "type"),
56
+ enumId: attr(key, "enum"),
57
+ flagsId: attr(key, "flags"),
58
+ choices: parseChoices(key),
59
+ summary: text(key, "summary"),
60
+ };
61
+ };
62
+ const parseRawSchema = (schema, fileName) => {
63
+ const id = attr(schema, "id");
64
+ if (id === null) {
65
+ throw new SchemaParseError(`A <schema> in ${fileName} has no id attribute`);
66
+ }
67
+ return {
68
+ id,
69
+ path: attr(schema, "path"),
70
+ extendsId: attr(schema, "extends"),
71
+ keys: children(schema, "key").map((key) => parseKey(key, fileName)),
72
+ };
73
+ };
74
+ 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()];
91
+ };
92
+ export const parseSchemaXml = (xml, fileName) => {
93
+ let document;
94
+ try {
95
+ document = PARSER.parse(xml);
96
+ }
97
+ catch (error) {
98
+ throw new SchemaParseError(`Failed to parse ${fileName} as XML: ${String(error)}`, { cause: error });
99
+ }
100
+ if (!isRawNode(document) || !("schemalist" in document)) {
101
+ throw new SchemaParseError(`${fileName} has no <schemalist> root element`);
102
+ }
103
+ const schemalist = isRawNode(document.schemalist) ? document.schemalist : {};
104
+ const rawSchemas = children(schemalist, "schema").map((schema) => parseRawSchema(schema, fileName));
105
+ const byId = new Map(rawSchemas.map((schema) => [schema.id, schema]));
106
+ return {
107
+ fileName,
108
+ schemas: rawSchemas.map((schema) => ({
109
+ id: schema.id,
110
+ path: schema.path,
111
+ keys: mergeInheritedKeys(schema, byId),
112
+ })),
113
+ enums: parseDefinitions(schemalist, "enum"),
114
+ flags: parseDefinitions(schemalist, "flags"),
115
+ };
116
+ };
117
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,4 @@
1
+ import type { ParsedSchemaFile } from "./parser.js";
2
+ export declare const renderRuntimeModule: (file: ParsedSchemaFile) => string;
3
+ export declare const renderEnvModule: (files: ParsedSchemaFile[]) => string;
4
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,148 @@
1
+ import { upperFirst } from "@gtkx/utils";
2
+ const GTKX_ENV_MODULE_HEADER = `/**
3
+ * GSettings schema modules generated by GTKX from the project's
4
+ * \`.gschema.xml\` files. Regenerated by \`gtkx codegen\`, \`gtkx dev\`, and
5
+ * \`gtkx build\`; do not edit.
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
+ const ENUM_KIND = "enum";
19
+ 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) => {
24
+ if (key.enumId !== null) {
25
+ const nicks = file.enums.get(key.enumId);
26
+ return nicks !== undefined && nicks.length > 0 ? unionOf(nicks) : "string";
27
+ }
28
+ 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
+ return FLAGS_KIND;
42
+ return key.variantType ?? "";
43
+ };
44
+ const runtimeKeysFor = (schema) => {
45
+ const entries = schema.keys.map((key) => `${toJsStringLiteral(key.name)}: ${toJsStringLiteral(runtimeKindForKey(key))}`);
46
+ return `{ ${entries.join(", ")} }`;
47
+ };
48
+ export const renderRuntimeModule = (file) => {
49
+ const lines = [];
50
+ file.schemas.forEach((schema, index) => {
51
+ const keysName = `keys_${index}`;
52
+ const id = toJsStringLiteral(schema.id);
53
+ lines.push(`const ${keysName} = ${runtimeKeysFor(schema)};`);
54
+ if (schema.path === null) {
55
+ lines.push(`export const ${exportNameFor(schema.id)} = { id: ${id}, keys: ${keysName}, at: (path) => ({ id: ${id}, path, keys: ${keysName} }) };`);
56
+ }
57
+ else {
58
+ lines.push(`export const ${exportNameFor(schema.id)} = { id: ${id}, path: null, keys: ${keysName} };`);
59
+ }
60
+ });
61
+ const first = file.schemas[0];
62
+ if (first !== undefined) {
63
+ lines.push(`export default ${exportNameFor(first.id)};`);
64
+ }
65
+ return lines.join("\n");
66
+ };
67
+ const sanitizeSummary = (summary) => summary.replaceAll("*/", "*\\/");
68
+ const interfaceNameFor = (schemaId, usedNames) => {
69
+ const base = `${schemaId
70
+ .split(/[^a-zA-Z0-9]+/)
71
+ .filter((part) => part.length > 0)
72
+ .map(upperFirst)
73
+ .join("")}Keys`;
74
+ let name = base;
75
+ let suffix = 2;
76
+ while (usedNames.has(name)) {
77
+ name = `${base}${suffix}`;
78
+ suffix += 1;
79
+ }
80
+ usedNames.add(name);
81
+ return name;
82
+ };
83
+ const renderKeysType = (name, schema, file) => {
84
+ const lines = [` type ${name} = {`];
85
+ for (const key of schema.keys) {
86
+ if (key.summary !== null) {
87
+ lines.push(` /** ${sanitizeSummary(key.summary)} */`);
88
+ }
89
+ lines.push(` ${toJsStringLiteral(key.name)}: ${tsTypeForKey(key, file)};`);
90
+ }
91
+ lines.push(" };");
92
+ return lines;
93
+ };
94
+ const boundRefTypeLines = (interfaceName, indent) => [
95
+ `${indent}id: string;`,
96
+ `${indent}path: string | null;`,
97
+ `${indent}keys: { [P in keyof ${interfaceName}]: string };`,
98
+ `${indent}__keys__?: ${interfaceName};`,
99
+ ];
100
+ const renderSchemaConst = (schema, interfaceName) => {
101
+ const exportName = exportNameFor(schema.id);
102
+ if (schema.path !== null) {
103
+ return [
104
+ ` const ${exportName}: {`,
105
+ ` id: ${toJsStringLiteral(schema.id)};`,
106
+ ...boundRefTypeLines(interfaceName, " ").slice(1),
107
+ " };",
108
+ ];
109
+ }
110
+ return [
111
+ ` const ${exportName}: {`,
112
+ ` id: ${JSON.stringify(schema.id)};`,
113
+ ` keys: { [P in keyof ${interfaceName}]: string };`,
114
+ ` __keys__?: ${interfaceName};`,
115
+ " at(path: string): {",
116
+ ...boundRefTypeLines(interfaceName, " "),
117
+ " };",
118
+ " };",
119
+ ];
120
+ };
121
+ const renderFileModule = (file, usedNames) => {
122
+ const lines = [`declare module "${file.fileName}" {`];
123
+ const exportNames = [];
124
+ file.schemas.forEach((schema, index) => {
125
+ if (index > 0)
126
+ 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]};`);
137
+ }
138
+ lines.push("}");
139
+ return lines;
140
+ };
141
+ export const renderEnvModule = (files) => {
142
+ const usedNames = new Set();
143
+ const blocks = files
144
+ .filter((file) => file.schemas.length > 0)
145
+ .map((file) => renderFileModule(file, usedNames).join("\n"));
146
+ return `${[GTKX_ENV_MODULE_HEADER, ...blocks].join("\n\n")}\n`;
147
+ };
148
+ //# sourceMappingURL=render.js.map