@gtkx/cli 0.20.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 (341) 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 -48
  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 -3
  224. package/package.json +32 -38
  225. package/src/babel-modules.d.ts +13 -0
  226. package/src/builder.ts +28 -76
  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 -54
  282. package/dist/create.d.ts.map +0 -1
  283. package/dist/create.js +0 -221
  284. package/dist/create.js.map +0 -1
  285. package/dist/dev-server.d.ts +0 -38
  286. package/dist/dev-server.d.ts.map +0 -1
  287. package/dist/dev-server.js +0 -128
  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-native.d.ts +0 -14
  309. package/dist/vite-plugin-gtkx-native.d.ts.map +0 -1
  310. package/dist/vite-plugin-gtkx-native.js +0 -53
  311. package/dist/vite-plugin-gtkx-native.js.map +0 -1
  312. package/dist/vite-plugin-gtkx-refresh.d.ts +0 -8
  313. package/dist/vite-plugin-gtkx-refresh.d.ts.map +0 -1
  314. package/dist/vite-plugin-gtkx-refresh.js +0 -37
  315. package/dist/vite-plugin-gtkx-refresh.js.map +0 -1
  316. package/dist/vite-plugin-swc-ssr-refresh.d.ts +0 -8
  317. package/dist/vite-plugin-swc-ssr-refresh.d.ts.map +0 -1
  318. package/dist/vite-plugin-swc-ssr-refresh.js +0 -46
  319. package/dist/vite-plugin-swc-ssr-refresh.js.map +0 -1
  320. package/src/cli.tsx +0 -154
  321. package/src/create.ts +0 -310
  322. package/src/dev-server.tsx +0 -162
  323. package/src/index.ts +0 -3
  324. package/src/mcp-client.ts +0 -518
  325. package/src/templates.ts +0 -26
  326. package/src/vite-plugin-gtkx-assets.ts +0 -69
  327. package/src/vite-plugin-gtkx-native.ts +0 -64
  328. package/src/vite-plugin-gtkx-refresh.ts +0 -54
  329. package/src/vite-plugin-swc-ssr-refresh.ts +0 -61
  330. package/templates/claude/EXAMPLES.md.ejs +0 -744
  331. package/templates/claude/SKILL.md.ejs +0 -93
  332. package/templates/claude/WIDGETS.md.ejs +0 -820
  333. package/templates/config/vitest.config.ts.ejs +0 -11
  334. package/templates/gitignore.ejs +0 -4
  335. package/templates/package.json.ejs +0 -16
  336. package/templates/src/app.tsx.ejs +0 -32
  337. package/templates/src/dev.tsx.ejs +0 -5
  338. package/templates/src/gtkx-env.d.ts.ejs +0 -1
  339. package/templates/src/index.tsx.ejs +0 -5
  340. package/templates/tests/app.test.tsx.ejs +0 -16
  341. package/templates/tsconfig.json.ejs +0 -14
@@ -0,0 +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"]}
@@ -0,0 +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
+ type SchemaEnvResult = {
5
+ path: string;
6
+ written: boolean;
7
+ };
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 {};
13
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,103 @@
1
+ import { createHash } from "node:crypto";
2
+ import { copyFileSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join, relative } from "node:path";
5
+ import { sortStrings, warn } from "@gtkx/utils";
6
+ import { DATA_IMPORT_PREFIX } from "../internal/data-dir.js";
7
+ import { removeTempDir } from "../internal/staging-dir.js";
8
+ import { compileSchemas } from "./compile.js";
9
+ import { parseSchemaXml, SchemaParseError } from "./parser.js";
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)
14
+ return dir;
15
+ if (existing.split(":").includes(dir))
16
+ return existing;
17
+ return `${dir}:${existing}`;
18
+ };
19
+ const STAGED_NAME_LENGTH = 16;
20
+ const stagedSchemaName = (filePath) => `${createHash("sha1").update(filePath).digest("hex").slice(0, STAGED_NAME_LENGTH)}${SCHEMA_SUFFIX}`;
21
+ export const stageSchema = (dir, filePath) => {
22
+ copyFileSync(filePath, join(dir, stagedSchemaName(filePath)));
23
+ };
24
+ const toForwardSlashes = (value) => value.replaceAll(/[/\\]/g, "/");
25
+ const moduleSpecifierFor = (dataDirAbs, filePath) => `${DATA_IMPORT_PREFIX}/${toForwardSlashes(relative(dataDirAbs, filePath))}`;
26
+ const readVisibleEntries = (dir) => {
27
+ try {
28
+ return readdirSync(dir, { withFileTypes: true }).filter((entry) => !entry.name.startsWith("."));
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ };
34
+ 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
+ }
46
+ }
47
+ };
48
+ walk(dataDir);
49
+ return sortStrings(found);
50
+ };
51
+ export const stageAndCompileProjectSchemas = (root, dataDir) => {
52
+ if (dataDir === null)
53
+ return null;
54
+ const schemaFiles = findSchemaFiles(join(root, dataDir));
55
+ if (schemaFiles.length === 0)
56
+ return null;
57
+ const dir = mkdtempSync(join(tmpdir(), "gtkx-schemas-"));
58
+ for (const filePath of schemaFiles)
59
+ stageSchema(dir, filePath);
60
+ compileSchemas(dir);
61
+ process.once("exit", () => removeTempDir(dir));
62
+ return dir;
63
+ };
64
+ export const schemaEnvPath = (rootDir) => join(rootDir, "node_modules", ".gtkx", "env.d.ts");
65
+ const parseProjectSchemas = (schemaFiles, dataDirAbs) => {
66
+ const parsed = [];
67
+ 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}`);
76
+ }
77
+ }
78
+ return parsed;
79
+ };
80
+ const writeIfChanged = (path, content) => {
81
+ let existing = null;
82
+ try {
83
+ existing = readFileSync(path, "utf-8");
84
+ }
85
+ catch {
86
+ existing = null;
87
+ }
88
+ if (existing === content)
89
+ return false;
90
+ mkdirSync(dirname(path), { recursive: true });
91
+ writeFileSync(path, content);
92
+ return true;
93
+ };
94
+ export const emitSchemaEnv = (rootDir, dataDir) => {
95
+ const dataDirAbs = dataDir === null ? null : join(rootDir, dataDir);
96
+ const schemaFiles = dataDirAbs === null ? [] : findSchemaFiles(dataDirAbs);
97
+ const parsed = dataDirAbs === null ? [] : parseProjectSchemas(schemaFiles, dataDirAbs);
98
+ const content = renderEnvModule(parsed);
99
+ const path = schemaEnvPath(rootDir);
100
+ const written = writeIfChanged(path, content);
101
+ return { path, written };
102
+ };
103
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/settings/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { copyFileSync, type Dirent, mkdirSync, mkdtempSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport { sortStrings, warn } from \"@gtkx/utils\";\nimport { DATA_IMPORT_PREFIX } from \"../internal/data-dir.js\";\nimport { removeTempDir } from \"../internal/staging-dir.js\";\nimport { compileSchemas } from \"./compile.js\";\nimport { type ParsedSchemaFile, parseSchemaXml, SchemaParseError } from \"./parser.js\";\nimport { renderEnvModule } from \"./render.js\";\n\nexport const SCHEMA_SUFFIX = \".gschema.xml\";\n\nexport const prependSchemaDir = (dir: string, existing: string | undefined): string => {\n if (existing === undefined || existing.length === 0) return dir;\n if (existing.split(\":\").includes(dir)) return existing;\n return `${dir}:${existing}`;\n};\n\nconst STAGED_NAME_LENGTH = 16;\n\nconst stagedSchemaName = (filePath: string): string =>\n `${createHash(\"sha1\").update(filePath).digest(\"hex\").slice(0, STAGED_NAME_LENGTH)}${SCHEMA_SUFFIX}`;\n\nexport const stageSchema = (dir: string, filePath: string): void => {\n copyFileSync(filePath, join(dir, stagedSchemaName(filePath)));\n};\n\nconst toForwardSlashes = (value: string): string => value.replaceAll(/[/\\\\]/g, \"/\");\n\nconst moduleSpecifierFor = (dataDirAbs: string, filePath: string): string =>\n `${DATA_IMPORT_PREFIX}/${toForwardSlashes(relative(dataDirAbs, filePath))}`;\n\ntype SchemaEnvResult = {\n path: string;\n written: boolean;\n};\n\nconst readVisibleEntries = (dir: string): Dirent[] => {\n try {\n return readdirSync(dir, { withFileTypes: true }).filter((entry) => !entry.name.startsWith(\".\"));\n } catch {\n return [];\n }\n};\n\nconst isSchemaFile = (entry: Dirent): boolean => entry.isFile() && entry.name.endsWith(SCHEMA_SUFFIX);\n\nexport const findSchemaFiles = (dataDir: string): string[] => {\n const found: string[] = [];\n const walk = (dir: string): void => {\n for (const entry of readVisibleEntries(dir)) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (isSchemaFile(entry)) {\n found.push(full);\n }\n }\n };\n walk(dataDir);\n return sortStrings(found);\n};\n\nexport const stageAndCompileProjectSchemas = (root: string, dataDir: string | null): string | null => {\n if (dataDir === null) return null;\n const schemaFiles = findSchemaFiles(join(root, dataDir));\n if (schemaFiles.length === 0) return null;\n\n const dir = mkdtempSync(join(tmpdir(), \"gtkx-schemas-\"));\n for (const filePath of schemaFiles) stageSchema(dir, filePath);\n compileSchemas(dir);\n process.once(\"exit\", () => removeTempDir(dir));\n\n return dir;\n};\n\nexport const schemaEnvPath = (rootDir: string): string => join(rootDir, \"node_modules\", \".gtkx\", \"env.d.ts\");\n\nconst parseProjectSchemas = (schemaFiles: string[], dataDirAbs: string): ParsedSchemaFile[] => {\n const parsed: ParsedSchemaFile[] = [];\n for (const filePath of schemaFiles) {\n const specifier = moduleSpecifierFor(dataDirAbs, filePath);\n try {\n parsed.push(parseSchemaXml(readFileSync(filePath, \"utf-8\"), specifier));\n } catch (error) {\n if (!(error instanceof SchemaParseError)) throw error;\n warn(`Skipping ${filePath} in schema type generation: ${error.message}`);\n }\n }\n return parsed;\n};\n\nconst writeIfChanged = (path: string, content: string): boolean => {\n let existing: string | null = null;\n try {\n existing = readFileSync(path, \"utf-8\");\n } catch {\n existing = null;\n }\n if (existing === content) return false;\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content);\n return true;\n};\n\nexport const emitSchemaEnv = (rootDir: string, dataDir: string | null): SchemaEnvResult => {\n const dataDirAbs = dataDir === null ? null : join(rootDir, dataDir);\n const schemaFiles = dataDirAbs === null ? [] : findSchemaFiles(dataDirAbs);\n const parsed = dataDirAbs === null ? [] : parseProjectSchemas(schemaFiles, dataDirAbs);\n const content = renderEnvModule(parsed);\n const path = schemaEnvPath(rootDir);\n const written = writeIfChanged(path, content);\n return { path, written };\n};\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const ASSET_EXTENSIONS: string[];
2
+ export declare const ASSET_RE: RegExp;
3
+ export declare const ASSET_PATH_RE: RegExp;
4
+ //# sourceMappingURL=asset-extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-extensions.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,UAuB5B,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAoE,CAAC;AAE1F,eAAO,MAAM,aAAa,QAA6E,CAAC"}
@@ -0,0 +1,27 @@
1
+ export const ASSET_EXTENSIONS = [
2
+ "png",
3
+ "jpg",
4
+ "jpeg",
5
+ "gif",
6
+ "svg",
7
+ "webp",
8
+ "webm",
9
+ "mp4",
10
+ "ogg",
11
+ "mp3",
12
+ "wav",
13
+ "flac",
14
+ "aac",
15
+ "woff",
16
+ "woff2",
17
+ "eot",
18
+ "ttf",
19
+ "otf",
20
+ "ico",
21
+ "avif",
22
+ "data",
23
+ "gpa",
24
+ ];
25
+ export const ASSET_RE = new RegExp(String.raw `\.(?:${ASSET_EXTENSIONS.join("|")})$`, "i");
26
+ export const ASSET_PATH_RE = new RegExp(String.raw `\.(?:${ASSET_EXTENSIONS.join("|")})(?:\?.*)?$`, "i");
27
+ //# sourceMappingURL=asset-extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-extensions.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAE1F,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC","sourcesContent":["export const ASSET_EXTENSIONS = [\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"svg\",\n \"webp\",\n \"webm\",\n \"mp4\",\n \"ogg\",\n \"mp3\",\n \"wav\",\n \"flac\",\n \"aac\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ico\",\n \"avif\",\n \"data\",\n \"gpa\",\n];\n\nexport const ASSET_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})$`, \"i\");\n\nexport const ASSET_PATH_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})(?:\\?.*)?$`, \"i\");\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "vite";
2
+ export declare function gtkxBuiltUrl(assetBase?: string): Plugin;
3
+ //# sourceMappingURL=built-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-url.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAgCvD"}
@@ -1,21 +1,7 @@
1
- /**
2
- * Vite plugin that configures `renderBuiltUrl` for resolving asset imports
3
- * to filesystem paths at runtime.
4
- *
5
- * When `assetBase` is provided, assets resolve relative to the executable
6
- * directory using `path.join(path.dirname(process.execPath), assetBase, filename)`.
7
- * This supports FHS-compliant layouts where assets live in `../share/<app>/`.
8
- *
9
- * When `assetBase` is omitted, assets resolve relative to the bundle file
10
- * via `import.meta.url`, which works when assets are co-located with the
11
- * executable.
12
- *
13
- * Only applies when the user has not already configured
14
- * `experimental.renderBuiltUrl` in their Vite config.
15
- */
16
1
  export function gtkxBuiltUrl(assetBase) {
17
2
  return {
18
3
  name: "gtkx:built-url",
4
+ apply: "build",
19
5
  config(userConfig) {
20
6
  if (userConfig.experimental?.renderBuiltUrl) {
21
7
  return;
@@ -31,8 +17,9 @@ export function gtkxBuiltUrl(assetBase) {
31
17
  runtime: `require("path").join(require("path").dirname(process.execPath),${JSON.stringify(assetBase)},${JSON.stringify(filename)})`,
32
18
  };
33
19
  }
20
+ const filenameLiteral = JSON.stringify(`./${filename}`);
34
21
  return {
35
- runtime: `new URL(${JSON.stringify(`./${filename}`)}, import.meta.url).pathname`,
22
+ runtime: `new URL(${filenameLiteral}, import.meta.url).pathname`,
36
23
  };
37
24
  },
38
25
  },
@@ -40,4 +27,4 @@ export function gtkxBuiltUrl(assetBase) {
40
27
  },
41
28
  };
42
29
  }
43
- //# sourceMappingURL=vite-plugin-gtkx-built-url.js.map
30
+ //# sourceMappingURL=built-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-url.js","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC3C,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,UAAU;YACb,IAAI,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;gBAC1C,OAAO;YACX,CAAC;YAED,OAAO;gBACH,YAAY,EAAE;oBACV,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;wBAC7B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;4BACnB,OAAO;wBACX,CAAC;wBAED,IAAI,SAAS,EAAE,CAAC;4BACZ,OAAO;gCACH,OAAO,EAAE,kEAAkE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;6BACtI,CAAC;wBACN,CAAC;wBAED,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;wBACxD,OAAO;4BACH,OAAO,EAAE,WAAW,eAAe,6BAA6B;yBACnE,CAAC;oBACN,CAAC;iBACJ;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\n\nexport function gtkxBuiltUrl(assetBase?: string): Plugin {\n return {\n name: \"gtkx:built-url\",\n apply: \"build\",\n\n config(userConfig) {\n if (userConfig.experimental?.renderBuiltUrl) {\n return;\n }\n\n return {\n experimental: {\n renderBuiltUrl(filename, { type }) {\n if (type !== \"asset\") {\n return;\n }\n\n if (assetBase) {\n return {\n runtime: `require(\"path\").join(require(\"path\").dirname(process.execPath),${JSON.stringify(assetBase)},${JSON.stringify(filename)})`,\n };\n }\n\n const filenameLiteral = JSON.stringify(`./${filename}`);\n return {\n runtime: `new URL(${filenameLiteral}, import.meta.url).pathname`,\n };\n },\n },\n };\n },\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "vite";
2
+ export declare function gtkxCss(): Plugin;
3
+ //# sourceMappingURL=css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/css.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC,wBAAgB,OAAO,IAAI,MAAM,CA4BhC"}
@@ -0,0 +1,30 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { createVirtualNamespace } from "./virtual-module.js";
3
+ const CSS_RE = /\.css$/i;
4
+ const INJECT_SUFFIX = "?inject";
5
+ const VIRTUAL_PREFIX = "\0gtkx-css:";
6
+ const { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);
7
+ export function gtkxCss() {
8
+ return {
9
+ name: "gtkx:css",
10
+ enforce: "pre",
11
+ async resolveId(source, importer, options) {
12
+ if (!CSS_RE.test(source)) {
13
+ return;
14
+ }
15
+ const virtualId = await resolveToVirtual(this, { source, importer, options });
16
+ if (virtualId === undefined)
17
+ return;
18
+ return virtualId + INJECT_SUFFIX;
19
+ },
20
+ load(id) {
21
+ if (isVirtual(id) && id.endsWith(INJECT_SUFFIX)) {
22
+ const filePath = fromVirtualId(id.slice(0, -INJECT_SUFFIX.length));
23
+ const content = readFileSync(filePath, "utf-8");
24
+ return [`import { injectGlobal } from "@gtkx/css";`, `injectGlobal(${JSON.stringify(content)});`].join("\n");
25
+ }
26
+ return;
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/vite-plugins/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,MAAM,GAAG,SAAS,CAAC;AACzB,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;AAE9F,MAAM,UAAU,OAAO;IACnB,OAAO;QACH,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK;QAEd,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;YACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,OAAO;YACX,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9E,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO;YAEpC,OAAO,SAAS,GAAG,aAAa,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,EAAE;YACH,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;gBACnE,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,OAAO,CAAC,2CAA2C,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAClG,IAAI,CACP,CAAC;YACN,CAAC;YAED,OAAO;QACX,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { Plugin } from \"vite\";\nimport { createVirtualNamespace } from \"./virtual-module.js\";\n\nconst CSS_RE = /\\.css$/i;\nconst INJECT_SUFFIX = \"?inject\";\nconst VIRTUAL_PREFIX = \"\\0gtkx-css:\";\nconst { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);\n\nexport function gtkxCss(): Plugin {\n return {\n name: \"gtkx:css\",\n enforce: \"pre\",\n\n async resolveId(source, importer, options) {\n if (!CSS_RE.test(source)) {\n return;\n }\n\n const virtualId = await resolveToVirtual(this, { source, importer, options });\n if (virtualId === undefined) return;\n\n return virtualId + INJECT_SUFFIX;\n },\n\n load(id) {\n if (isVirtual(id) && id.endsWith(INJECT_SUFFIX)) {\n const filePath = fromVirtualId(id.slice(0, -INJECT_SUFFIX.length));\n const content = readFileSync(filePath, \"utf-8\");\n return [`import { injectGlobal } from \"@gtkx/css\";`, `injectGlobal(${JSON.stringify(content)});`].join(\n \"\\n\",\n );\n }\n\n return;\n },\n };\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export declare const REFRESH_REG = "$RefreshReg$";
2
+ export declare const REFRESH_SIG = "$RefreshSig$";
3
+ export declare const REFRESH_RUNTIME_SPECIFIER = "@gtkx/cli/refresh-runtime";
4
+ export declare const shouldTransformForRefresh: (id: string, transformOptions: {
5
+ ssr?: boolean | undefined;
6
+ } | undefined) => boolean;
7
+ //# sourceMappingURL=refresh-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-filter.d.ts","sourceRoot":"","sources":["../../../src/vite-plugins/fast-refresh/refresh-filter.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAE1C,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAE1C,eAAO,MAAM,yBAAyB,8BAA8B,CAAC;AAKrE,eAAO,MAAM,yBAAyB,OAC9B,MAAM,oBACQ;IAAE,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,KAC5D,OAKF,CAAC"}
@@ -0,0 +1,15 @@
1
+ export const REFRESH_REG = "$RefreshReg$";
2
+ export const REFRESH_SIG = "$RefreshSig$";
3
+ export const REFRESH_RUNTIME_SPECIFIER = "@gtkx/cli/refresh-runtime";
4
+ const REFRESH_INCLUDE = /\.[tj]sx?$/;
5
+ const REFRESH_EXCLUDE = /node_modules|[/\\]dist[/\\]|[/\\]\.gtkx[/\\]/;
6
+ export const shouldTransformForRefresh = (id, transformOptions) => {
7
+ if (!transformOptions?.ssr)
8
+ return false;
9
+ if (!REFRESH_INCLUDE.test(id))
10
+ return false;
11
+ if (REFRESH_EXCLUDE.test(id))
12
+ return false;
13
+ return true;
14
+ };
15
+ //# sourceMappingURL=refresh-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-filter.js","sourceRoot":"","sources":["../../../src/vite-plugins/fast-refresh/refresh-filter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,MAAM,eAAe,GAAG,YAAY,CAAC;AACrC,MAAM,eAAe,GAAG,8CAA8C,CAAC;AAEvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACrC,EAAU,EACV,gBAA2D,EACpD,EAAE;IACT,IAAI,CAAC,gBAAgB,EAAE,GAAG;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC","sourcesContent":["export const REFRESH_REG = \"$RefreshReg$\";\n\nexport const REFRESH_SIG = \"$RefreshSig$\";\n\nexport const REFRESH_RUNTIME_SPECIFIER = \"@gtkx/cli/refresh-runtime\";\n\nconst REFRESH_INCLUDE = /\\.[tj]sx?$/;\nconst REFRESH_EXCLUDE = /node_modules|[/\\\\]dist[/\\\\]|[/\\\\]\\.gtkx[/\\\\]/;\n\nexport const shouldTransformForRefresh = (\n id: string,\n transformOptions: { ssr?: boolean | undefined } | undefined,\n): boolean => {\n if (!transformOptions?.ssr) return false;\n if (!REFRESH_INCLUDE.test(id)) return false;\n if (REFRESH_EXCLUDE.test(id)) return false;\n return true;\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import type { Plugin } from "vite";
2
+ export declare function gtkxSwcRefresh(): Plugin;
3
+ export declare function gtkxRefreshRuntime(): Plugin;
4
+ export declare const gtkxFastRefresh: () => Plugin[];
5
+ //# sourceMappingURL=swc-refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swc-refresh.d.ts","sourceRoot":"","sources":["../../../src/vite-plugins/fast-refresh/swc-refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,wBAAgB,cAAc,IAAI,MAAM,CAoCvC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAiC3C;AAED,eAAO,MAAM,eAAe,QAAO,MAAM,EAA8C,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { transform } from "@swc/core";
3
+ import { REFRESH_REG, REFRESH_RUNTIME_SPECIFIER, REFRESH_SIG, shouldTransformForRefresh } from "./refresh-filter.js";
4
+ export function gtkxSwcRefresh() {
5
+ return {
6
+ name: "gtkx:swc-refresh",
7
+ enforce: "pre",
8
+ apply: "serve",
9
+ async transform(code, id, transformOptions) {
10
+ if (!shouldTransformForRefresh(id, transformOptions)) {
11
+ return;
12
+ }
13
+ const isTsx = id.endsWith(".tsx");
14
+ const isTs = id.endsWith(".ts") || isTsx;
15
+ const swcOptions = {
16
+ filename: id,
17
+ sourceFileName: id,
18
+ sourceMaps: true,
19
+ jsc: {
20
+ parser: isTs ? { syntax: "typescript", tsx: isTsx } : { syntax: "ecmascript", jsx: true },
21
+ transform: {
22
+ react: {
23
+ runtime: "automatic",
24
+ development: true,
25
+ refresh: true,
26
+ },
27
+ },
28
+ target: "es2022",
29
+ },
30
+ };
31
+ const result = await transform(code, swcOptions);
32
+ return result.map === undefined ? { code: result.code } : { code: result.code, map: result.map };
33
+ },
34
+ };
35
+ }
36
+ export function gtkxRefreshRuntime() {
37
+ return {
38
+ name: "gtkx:refresh-runtime",
39
+ enforce: "post",
40
+ apply: "serve",
41
+ resolveId(id) {
42
+ if (id !== REFRESH_RUNTIME_SPECIFIER)
43
+ return undefined;
44
+ return fileURLToPath(import.meta.resolve(REFRESH_RUNTIME_SPECIFIER));
45
+ },
46
+ transform(code, id, transformOptions) {
47
+ if (!shouldTransformForRefresh(id, transformOptions)) {
48
+ return;
49
+ }
50
+ if (!code.includes(REFRESH_REG) && !code.includes(REFRESH_SIG)) {
51
+ return;
52
+ }
53
+ const moduleIdJson = JSON.stringify(id);
54
+ const header = `
55
+ import { createModuleRegistration as __createModuleRegistration__ } from "${REFRESH_RUNTIME_SPECIFIER}";
56
+ const { ${REFRESH_REG}, ${REFRESH_SIG} } = __createModuleRegistration__(${moduleIdJson});
57
+ `;
58
+ return {
59
+ code: header + code,
60
+ map: null,
61
+ };
62
+ },
63
+ };
64
+ }
65
+ export const gtkxFastRefresh = () => [gtkxSwcRefresh(), gtkxRefreshRuntime()];
66
+ //# sourceMappingURL=swc-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swc-refresh.js","sourceRoot":"","sources":["../../../src/vite-plugins/fast-refresh/swc-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAA8B,SAAS,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErH,MAAM,UAAU,cAAc;IAC1B,OAAO;QACH,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QAEd,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,gBAAgB;YACtC,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBACnD,OAAO;YACX,CAAC;YAED,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;YAEzC,MAAM,UAAU,GAAe;gBAC3B,QAAQ,EAAE,EAAE;gBACZ,cAAc,EAAE,EAAE;gBAClB,UAAU,EAAE,IAAI;gBAChB,GAAG,EAAE;oBACD,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE;oBACzF,SAAS,EAAE;wBACP,KAAK,EAAE;4BACH,OAAO,EAAE,WAAW;4BACpB,WAAW,EAAE,IAAI;4BACjB,OAAO,EAAE,IAAI;yBAChB;qBACJ;oBACD,MAAM,EAAE,QAAQ;iBACnB;aACJ,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAEjD,OAAO,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QACrG,CAAC;KACJ,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB;IAC9B,OAAO;QACH,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QAEd,SAAS,CAAC,EAAE;YACR,IAAI,EAAE,KAAK,yBAAyB;gBAAE,OAAO,SAAS,CAAC;YACvD,OAAO,aAAa,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,gBAAgB;YAChC,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBACnD,OAAO;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7D,OAAO;YACX,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAExC,MAAM,MAAM,GAAG;4EACiD,yBAAyB;UAC3F,WAAW,KAAK,WAAW,qCAAqC,YAAY;CACrF,CAAC;YAEU,OAAO;gBACH,IAAI,EAAE,MAAM,GAAG,IAAI;gBACnB,GAAG,EAAE,IAAI;aACZ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAa,EAAE,CAAC,CAAC,cAAc,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC","sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport { type Options as SwcOptions, transform } from \"@swc/core\";\nimport type { Plugin } from \"vite\";\nimport { REFRESH_REG, REFRESH_RUNTIME_SPECIFIER, REFRESH_SIG, shouldTransformForRefresh } from \"./refresh-filter.js\";\n\nexport function gtkxSwcRefresh(): Plugin {\n return {\n name: \"gtkx:swc-refresh\",\n enforce: \"pre\",\n apply: \"serve\",\n\n async transform(code, id, transformOptions) {\n if (!shouldTransformForRefresh(id, transformOptions)) {\n return;\n }\n\n const isTsx = id.endsWith(\".tsx\");\n const isTs = id.endsWith(\".ts\") || isTsx;\n\n const swcOptions: SwcOptions = {\n filename: id,\n sourceFileName: id,\n sourceMaps: true,\n jsc: {\n parser: isTs ? { syntax: \"typescript\", tsx: isTsx } : { syntax: \"ecmascript\", jsx: true },\n transform: {\n react: {\n runtime: \"automatic\",\n development: true,\n refresh: true,\n },\n },\n target: \"es2022\",\n },\n };\n\n const result = await transform(code, swcOptions);\n\n return result.map === undefined ? { code: result.code } : { code: result.code, map: result.map };\n },\n };\n}\n\nexport function gtkxRefreshRuntime(): Plugin {\n return {\n name: \"gtkx:refresh-runtime\",\n enforce: \"post\",\n apply: \"serve\",\n\n resolveId(id) {\n if (id !== REFRESH_RUNTIME_SPECIFIER) return undefined;\n return fileURLToPath(import.meta.resolve(REFRESH_RUNTIME_SPECIFIER));\n },\n\n transform(code, id, transformOptions) {\n if (!shouldTransformForRefresh(id, transformOptions)) {\n return;\n }\n\n if (!code.includes(REFRESH_REG) && !code.includes(REFRESH_SIG)) {\n return;\n }\n\n const moduleIdJson = JSON.stringify(id);\n\n const header = `\nimport { createModuleRegistration as __createModuleRegistration__ } from \"${REFRESH_RUNTIME_SPECIFIER}\";\nconst { ${REFRESH_REG}, ${REFRESH_SIG} } = __createModuleRegistration__(${moduleIdJson});\n`;\n\n return {\n code: header + code,\n map: null,\n };\n },\n };\n}\n\nexport const gtkxFastRefresh = (): Plugin[] => [gtkxSwcRefresh(), gtkxRefreshRuntime()];\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "vite";
2
+ export declare function gtkxIcons(): Plugin;
3
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAqB/C,wBAAgB,SAAS,IAAI,MAAM,CAiClC"}
@@ -0,0 +1,47 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { info } from "@gtkx/utils";
4
+ import { prependBanner } from "../internal/banner.js";
5
+ import { resolveDataDir } from "../internal/data-dir.js";
6
+ import { listFilesRecursive } from "../internal/list-files.js";
7
+ const ICONS_DIR = "icons";
8
+ const XDG_ENV_BANNER = [
9
+ `process.env.XDG_DATA_DIRS = [`,
10
+ ` decodeURIComponent(new URL(".", import.meta.url).pathname),`,
11
+ ` process.env.XDG_DATA_DIRS || "/usr/local/share:/usr/share",`,
12
+ `].join(":");`,
13
+ ].join("\n");
14
+ const findIconFiles = (iconsDir) => iconsDir === null ? [] : listFilesRecursive(iconsDir);
15
+ export function gtkxIcons() {
16
+ const state = {
17
+ iconsDir: null,
18
+ };
19
+ return {
20
+ name: "gtkx:icons",
21
+ enforce: "pre",
22
+ apply: "build",
23
+ config(config) {
24
+ const root = config.root ?? process.cwd();
25
+ const dataDir = resolveDataDir(root);
26
+ state.iconsDir = dataDir === null ? null : join(root, dataDir, ICONS_DIR);
27
+ },
28
+ outputOptions(options) {
29
+ if (findIconFiles(state.iconsDir).length === 0)
30
+ return;
31
+ return prependBanner(options, XDG_ENV_BANNER);
32
+ },
33
+ buildEnd() {
34
+ const icons = findIconFiles(state.iconsDir);
35
+ for (const { absPath, rel } of icons) {
36
+ this.emitFile({
37
+ type: "asset",
38
+ fileName: join(ICONS_DIR, rel),
39
+ source: readFileSync(absPath),
40
+ });
41
+ }
42
+ if (icons.length > 0)
43
+ info(`Copied ${icons.length} icon(s) into ${ICONS_DIR}/`);
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAmB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,MAAM,SAAS,GAAG,OAAO,CAAC;AAE1B,MAAM,cAAc,GAAG;IACnB,+BAA+B;IAC/B,iEAAiE;IACjE,iEAAiE;IACjE,cAAc;CACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAMb,MAAM,aAAa,GAAG,CAAC,QAAuB,EAAgB,EAAE,CAC5D,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE1D,MAAM,UAAU,SAAS;IACrB,MAAM,KAAK,GAAgB;QACvB,QAAQ,EAAE,IAAI;KACjB,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,MAAkB;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACrC,KAAK,CAAC,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9E,CAAC;QAED,aAAa,CAAC,OAAO;YACjB,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACvD,OAAO,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC;QAED,QAAQ;YACJ,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5C,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;gBACnC,IAAI,CAAC,QAAQ,CAAC;oBACV,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;oBAC9B,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC;iBAChC,CAAC,CAAC;YACP,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,iBAAiB,SAAS,GAAG,CAAC,CAAC;QACpF,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { info } from \"@gtkx/utils\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { prependBanner } from \"../internal/banner.js\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { type ListedFile, listFilesRecursive } from \"../internal/list-files.js\";\n\nconst ICONS_DIR = \"icons\";\n\nconst XDG_ENV_BANNER = [\n `process.env.XDG_DATA_DIRS = [`,\n ` decodeURIComponent(new URL(\".\", import.meta.url).pathname),`,\n ` process.env.XDG_DATA_DIRS || \"/usr/local/share:/usr/share\",`,\n `].join(\":\");`,\n].join(\"\\n\");\n\ntype PluginState = {\n iconsDir: string | null;\n};\n\nconst findIconFiles = (iconsDir: string | null): ListedFile[] =>\n iconsDir === null ? [] : listFilesRecursive(iconsDir);\n\nexport function gtkxIcons(): Plugin {\n const state: PluginState = {\n iconsDir: null,\n };\n\n return {\n name: \"gtkx:icons\",\n enforce: \"pre\",\n apply: \"build\",\n\n config(config: UserConfig) {\n const root = config.root ?? process.cwd();\n const dataDir = resolveDataDir(root);\n state.iconsDir = dataDir === null ? null : join(root, dataDir, ICONS_DIR);\n },\n\n outputOptions(options) {\n if (findIconFiles(state.iconsDir).length === 0) return;\n return prependBanner(options, XDG_ENV_BANNER);\n },\n\n buildEnd() {\n const icons = findIconFiles(state.iconsDir);\n for (const { absPath, rel } of icons) {\n this.emitFile({\n type: \"asset\",\n fileName: join(ICONS_DIR, rel),\n source: readFileSync(absPath),\n });\n }\n if (icons.length > 0) info(`Copied ${icons.length} icon(s) into ${ICONS_DIR}/`);\n },\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "vite";
2
+ export declare const gtkxVitePlugins: (mode?: string) => Plugin[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,MAAM,EAWrD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { createConfigLoader } from "@gtkx/config/internal";
2
+ import createConfigPlugin from "@gtkx/config/vite-plugin";
3
+ import { gtkxCss } from "./css.js";
4
+ import { gtkxIcons } from "./icons.js";
5
+ import { gtkxReactCompiler } from "./react-compiler.js";
6
+ import { gtkxResources } from "./resources.js";
7
+ import { gtkxSettings } from "./settings.js";
8
+ import { gtkxUndeclaredLibrary } from "./undeclared-library.js";
9
+ export const gtkxVitePlugins = (mode) => {
10
+ const loadConfig = createConfigLoader(mode !== undefined ? { mode } : {});
11
+ return [
12
+ createConfigPlugin({ name: "gtkx:config", loadConfig }),
13
+ gtkxUndeclaredLibrary(mode),
14
+ gtkxSettings(),
15
+ gtkxIcons(),
16
+ gtkxResources(loadConfig),
17
+ gtkxCss(),
18
+ gtkxReactCompiler(loadConfig),
19
+ ];
20
+ };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAa,EAAY,EAAE;IACvD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,OAAO;QACH,kBAAkB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;QACvD,qBAAqB,CAAC,IAAI,CAAC;QAC3B,YAAY,EAAE;QACd,SAAS,EAAE;QACX,aAAa,CAAC,UAAU,CAAC;QACzB,OAAO,EAAE;QACT,iBAAiB,CAAC,UAAU,CAAC;KAChC,CAAC;AACN,CAAC,CAAC","sourcesContent":["import { createConfigLoader } from \"@gtkx/config/internal\";\nimport createConfigPlugin from \"@gtkx/config/vite-plugin\";\nimport type { Plugin } from \"vite\";\nimport { gtkxCss } from \"./css.js\";\nimport { gtkxIcons } from \"./icons.js\";\nimport { gtkxReactCompiler } from \"./react-compiler.js\";\nimport { gtkxResources } from \"./resources.js\";\nimport { gtkxSettings } from \"./settings.js\";\nimport { gtkxUndeclaredLibrary } from \"./undeclared-library.js\";\n\nexport const gtkxVitePlugins = (mode?: string): Plugin[] => {\n const loadConfig = createConfigLoader(mode !== undefined ? { mode } : {});\n return [\n createConfigPlugin({ name: \"gtkx:config\", loadConfig }),\n gtkxUndeclaredLibrary(mode),\n gtkxSettings(),\n gtkxIcons(),\n gtkxResources(loadConfig),\n gtkxCss(),\n gtkxReactCompiler(loadConfig),\n ];\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "vite";
2
+ export declare function gtkxNative(root: string): Plugin;
3
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/native.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA2CnC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0B/C"}
@@ -0,0 +1,60 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { arch, platform } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ const EMITTED_BINDING_SPECIFIER = "./gtkx.node";
6
+ function resolveBinaryPath(projectRequire, currentArch) {
7
+ const nativeRoot = dirname(projectRequire.resolve("@gtkx/native/package.json"));
8
+ const localBinary = join(nativeRoot, `native.linux-${currentArch}-gnu.node`);
9
+ return existsSync(localBinary) ? localBinary : projectRequire.resolve(`@gtkx/native-linux-${currentArch}-gnu`);
10
+ }
11
+ function resolvePlatformBinary(projectRequire) {
12
+ const currentPlatform = platform();
13
+ const currentArch = arch();
14
+ if (currentPlatform !== "linux") {
15
+ throw new Error(`Unsupported build platform: ${currentPlatform}, only Linux is supported`);
16
+ }
17
+ if (currentArch !== "x64" && currentArch !== "arm64") {
18
+ throw new Error(`Unsupported build architecture: ${currentArch}, only x64 and arm64 are supported`);
19
+ }
20
+ return readFileSync(resolveBinaryPath(projectRequire, currentArch));
21
+ }
22
+ function rewriteLoader(code) {
23
+ const idents = [];
24
+ for (const match of code.matchAll(/export\s*\{\s*([A-Za-z0-9_$]+)\s*\}/g)) {
25
+ const ident = match[1];
26
+ if (ident) {
27
+ idents.push(ident);
28
+ }
29
+ }
30
+ const bindings = idents.join(", ");
31
+ return [
32
+ `import { createRequire as __gtkxCreateRequire } from "node:module";`,
33
+ `const __gtkxNative = __gtkxCreateRequire(import.meta.url)(${JSON.stringify(EMITTED_BINDING_SPECIFIER)});`,
34
+ `const { ${bindings} } = __gtkxNative;`,
35
+ `export { ${bindings} };`,
36
+ ].join("\n");
37
+ }
38
+ export function gtkxNative(root) {
39
+ const projectRequire = createRequire(join(root, "package.json"));
40
+ let cachedLoaderPath;
41
+ const loaderPath = () => {
42
+ cachedLoaderPath ??= join(dirname(projectRequire.resolve("@gtkx/native/package.json")), "index.js");
43
+ return cachedLoaderPath;
44
+ };
45
+ return {
46
+ name: "gtkx:native",
47
+ enforce: "pre",
48
+ apply: "build",
49
+ buildStart() {
50
+ this.emitFile({ type: "asset", fileName: "gtkx.node", source: resolvePlatformBinary(projectRequire) });
51
+ },
52
+ resolveId(id) {
53
+ return id === EMITTED_BINDING_SPECIFIER ? { id, external: true } : null;
54
+ },
55
+ transform(code, id) {
56
+ return id.replace(/\?.*$/, "") === loaderPath() ? rewriteLoader(code) : null;
57
+ },
58
+ };
59
+ }
60
+ //# sourceMappingURL=native.js.map