@gtkx/cli 2.0.0-beta.1 → 2.0.0-beta.10

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 (501) hide show
  1. package/README.md +43 -40
  2. package/bin/gtkx-dev-runner.js +5 -1
  3. package/bin/gtkx.js +5 -1
  4. package/dist/builder.d.ts +1 -0
  5. package/dist/builder.d.ts.map +1 -1
  6. package/dist/builder.js +44 -12
  7. package/dist/builder.js.map +1 -1
  8. package/dist/cli.d.ts +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +14 -2
  11. package/dist/cli.js.map +1 -1
  12. package/dist/codegen/config-dependencies.d.ts +3 -0
  13. package/dist/codegen/config-dependencies.d.ts.map +1 -0
  14. package/dist/codegen/config-dependencies.js +355 -0
  15. package/dist/codegen/config-dependencies.js.map +1 -0
  16. package/dist/codegen/freshness.d.ts.map +1 -1
  17. package/dist/codegen/freshness.js +5 -1
  18. package/dist/codegen/freshness.js.map +1 -1
  19. package/dist/codegen/reference.d.ts.map +1 -1
  20. package/dist/codegen/reference.js +1 -0
  21. package/dist/codegen/reference.js.map +1 -1
  22. package/dist/codegen/run-codegen.d.ts +6 -3
  23. package/dist/codegen/run-codegen.d.ts.map +1 -1
  24. package/dist/codegen/run-codegen.js +42 -18
  25. package/dist/codegen/run-codegen.js.map +1 -1
  26. package/dist/codegen/store-resolver.d.ts +3 -1
  27. package/dist/codegen/store-resolver.d.ts.map +1 -1
  28. package/dist/codegen/store-resolver.js +7 -4
  29. package/dist/codegen/store-resolver.js.map +1 -1
  30. package/dist/commands/build.d.ts +5 -0
  31. package/dist/commands/build.d.ts.map +1 -1
  32. package/dist/commands/build.js +83 -10
  33. package/dist/commands/build.js.map +1 -1
  34. package/dist/commands/cleanup.d.ts +9 -0
  35. package/dist/commands/cleanup.d.ts.map +1 -0
  36. package/dist/commands/cleanup.js +42 -0
  37. package/dist/commands/cleanup.js.map +1 -0
  38. package/dist/commands/codegen.d.ts +1 -0
  39. package/dist/commands/codegen.d.ts.map +1 -1
  40. package/dist/commands/codegen.js +6 -5
  41. package/dist/commands/codegen.js.map +1 -1
  42. package/dist/commands/deploy.d.ts +5 -0
  43. package/dist/commands/deploy.d.ts.map +1 -1
  44. package/dist/commands/deploy.js +10 -2
  45. package/dist/commands/deploy.js.map +1 -1
  46. package/dist/commands/dev.d.ts +9 -0
  47. package/dist/commands/dev.d.ts.map +1 -1
  48. package/dist/commands/dev.js +31 -4
  49. package/dist/commands/dev.js.map +1 -1
  50. package/dist/commands/docs.d.ts.map +1 -1
  51. package/dist/commands/docs.js +1 -0
  52. package/dist/commands/docs.js.map +1 -1
  53. package/dist/deploy/depends.d.ts.map +1 -1
  54. package/dist/deploy/depends.js +24 -2
  55. package/dist/deploy/depends.js.map +1 -1
  56. package/dist/deploy/download.d.ts +7 -3
  57. package/dist/deploy/download.d.ts.map +1 -1
  58. package/dist/deploy/download.js +19 -20
  59. package/dist/deploy/download.js.map +1 -1
  60. package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -1
  61. package/dist/deploy/freedesktop/metainfo.js +41 -2
  62. package/dist/deploy/freedesktop/metainfo.js.map +1 -1
  63. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  64. package/dist/deploy/freedesktop/validate.js +58 -14
  65. package/dist/deploy/freedesktop/validate.js.map +1 -1
  66. package/dist/deploy/native-addon.d.ts +5 -0
  67. package/dist/deploy/native-addon.d.ts.map +1 -0
  68. package/dist/deploy/native-addon.js +134 -0
  69. package/dist/deploy/native-addon.js.map +1 -0
  70. package/dist/deploy/nfpm/config.d.ts +3 -2
  71. package/dist/deploy/nfpm/config.d.ts.map +1 -1
  72. package/dist/deploy/nfpm/config.js +7 -4
  73. package/dist/deploy/nfpm/config.js.map +1 -1
  74. package/dist/deploy/nfpm/contents.d.ts.map +1 -1
  75. package/dist/deploy/nfpm/contents.js +8 -0
  76. package/dist/deploy/nfpm/contents.js.map +1 -1
  77. package/dist/deploy/node-runtime/download.js +2 -2
  78. package/dist/deploy/node-runtime/download.js.map +1 -1
  79. package/dist/deploy/node-runtime/elf.d.ts +4 -1
  80. package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
  81. package/dist/deploy/node-runtime/elf.js +34 -5
  82. package/dist/deploy/node-runtime/elf.js.map +1 -1
  83. package/dist/deploy/node-runtime/guard.d.ts.map +1 -1
  84. package/dist/deploy/node-runtime/guard.js +7 -14
  85. package/dist/deploy/node-runtime/guard.js.map +1 -1
  86. package/dist/deploy/node-runtime/index.d.ts +3 -1
  87. package/dist/deploy/node-runtime/index.d.ts.map +1 -1
  88. package/dist/deploy/node-runtime/index.js +103 -10
  89. package/dist/deploy/node-runtime/index.js.map +1 -1
  90. package/dist/deploy/node-runtime/sonames.d.ts +5 -0
  91. package/dist/deploy/node-runtime/sonames.d.ts.map +1 -0
  92. package/dist/deploy/node-runtime/sonames.js +13 -0
  93. package/dist/deploy/node-runtime/sonames.js.map +1 -0
  94. package/dist/deploy/notices/node-runtime.js +2 -2
  95. package/dist/deploy/notices/node-runtime.js.map +1 -1
  96. package/dist/deploy/payload/launcher.d.ts.map +1 -1
  97. package/dist/deploy/payload/launcher.js +14 -1
  98. package/dist/deploy/payload/launcher.js.map +1 -1
  99. package/dist/deploy/payload/stage.d.ts +2 -1
  100. package/dist/deploy/payload/stage.d.ts.map +1 -1
  101. package/dist/deploy/payload/stage.js +46 -5
  102. package/dist/deploy/payload/stage.js.map +1 -1
  103. package/dist/deploy/run-deploy.d.ts +2 -0
  104. package/dist/deploy/run-deploy.d.ts.map +1 -1
  105. package/dist/deploy/run-deploy.js +197 -52
  106. package/dist/deploy/run-deploy.js.map +1 -1
  107. package/dist/deploy/settings/arch.d.ts +9 -3
  108. package/dist/deploy/settings/arch.d.ts.map +1 -1
  109. package/dist/deploy/settings/arch.js +27 -6
  110. package/dist/deploy/settings/arch.js.map +1 -1
  111. package/dist/deploy/settings/build-manifest.d.ts +6 -1
  112. package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
  113. package/dist/deploy/settings/build-manifest.js +15 -4
  114. package/dist/deploy/settings/build-manifest.js.map +1 -1
  115. package/dist/deploy/settings/extra-files.d.ts +1 -1
  116. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  117. package/dist/deploy/settings/extra-files.js +25 -3
  118. package/dist/deploy/settings/extra-files.js.map +1 -1
  119. package/dist/deploy/settings/index.d.ts +3 -1
  120. package/dist/deploy/settings/index.d.ts.map +1 -1
  121. package/dist/deploy/settings/index.js +4 -2
  122. package/dist/deploy/settings/index.js.map +1 -1
  123. package/dist/deploy/settings/libraries.d.ts.map +1 -1
  124. package/dist/deploy/settings/libraries.js +2 -1
  125. package/dist/deploy/settings/libraries.js.map +1 -1
  126. package/dist/deploy/settings/paths.d.ts +4 -2
  127. package/dist/deploy/settings/paths.d.ts.map +1 -1
  128. package/dist/deploy/settings/paths.js +121 -12
  129. package/dist/deploy/settings/paths.js.map +1 -1
  130. package/dist/deploy/targets/appimage.d.ts.map +1 -1
  131. package/dist/deploy/targets/appimage.js +1 -0
  132. package/dist/deploy/targets/appimage.js.map +1 -1
  133. package/dist/deploy/targets/flatpak-pnpm.js +4 -4
  134. package/dist/deploy/targets/flatpak-pnpm.js.map +1 -1
  135. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  136. package/dist/deploy/targets/flatpak-source.js +13 -2
  137. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  138. package/dist/deploy/targets/flatpak.d.ts.map +1 -1
  139. package/dist/deploy/targets/flatpak.js +1 -0
  140. package/dist/deploy/targets/flatpak.js.map +1 -1
  141. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -1
  142. package/dist/deploy/targets/nfpm-target.js +13 -7
  143. package/dist/deploy/targets/nfpm-target.js.map +1 -1
  144. package/dist/deploy/types.d.ts +5 -2
  145. package/dist/deploy/types.d.ts.map +1 -1
  146. package/dist/deploy/types.js.map +1 -1
  147. package/dist/deploy/vendored/appimagetool.js +2 -2
  148. package/dist/deploy/vendored/appimagetool.js.map +1 -1
  149. package/dist/deploy/vendored/nfpm.js +1 -1
  150. package/dist/deploy/vendored/nfpm.js.map +1 -1
  151. package/dist/dev/catalog-writes.d.ts +8 -0
  152. package/dist/dev/catalog-writes.d.ts.map +1 -0
  153. package/dist/dev/catalog-writes.js +26 -0
  154. package/dist/dev/catalog-writes.js.map +1 -0
  155. package/dist/dev/entry-env.d.ts +2 -1
  156. package/dist/dev/entry-env.d.ts.map +1 -1
  157. package/dist/dev/entry-env.js +2 -1
  158. package/dist/dev/entry-env.js.map +1 -1
  159. package/dist/dev/font-dir.d.ts +3 -0
  160. package/dist/dev/font-dir.d.ts.map +1 -0
  161. package/dist/dev/font-dir.js +9 -0
  162. package/dist/dev/font-dir.js.map +1 -0
  163. package/dist/dev/headless.d.ts +3 -0
  164. package/dist/dev/headless.d.ts.map +1 -0
  165. package/dist/dev/headless.js +35 -0
  166. package/dist/dev/headless.js.map +1 -0
  167. package/dist/dev/runner-deps.d.ts +1 -1
  168. package/dist/dev/runner-deps.d.ts.map +1 -1
  169. package/dist/dev/runner-deps.js +12 -7
  170. package/dist/dev/runner-deps.js.map +1 -1
  171. package/dist/dev/runner-main.d.ts.map +1 -1
  172. package/dist/dev/runner-main.js +10 -3
  173. package/dist/dev/runner-main.js.map +1 -1
  174. package/dist/dev/runner.d.ts +2 -0
  175. package/dist/dev/runner.d.ts.map +1 -1
  176. package/dist/dev/runner.js +26 -7
  177. package/dist/dev/runner.js.map +1 -1
  178. package/dist/dev/supervisor.d.ts +3 -1
  179. package/dist/dev/supervisor.d.ts.map +1 -1
  180. package/dist/dev/supervisor.js +132 -29
  181. package/dist/dev/supervisor.js.map +1 -1
  182. package/dist/dev/vite-dev-server.d.ts +1 -1
  183. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  184. package/dist/dev/vite-dev-server.js +14 -2
  185. package/dist/dev/vite-dev-server.js.map +1 -1
  186. package/dist/dev/watch-ignore.d.ts +3 -0
  187. package/dist/dev/watch-ignore.d.ts.map +1 -0
  188. package/dist/dev/watch-ignore.js +11 -0
  189. package/dist/dev/watch-ignore.js.map +1 -0
  190. package/dist/i18n/catalogs.d.ts +6 -2
  191. package/dist/i18n/catalogs.d.ts.map +1 -1
  192. package/dist/i18n/catalogs.js +10 -7
  193. package/dist/i18n/catalogs.js.map +1 -1
  194. package/dist/i18n/source-messages.d.ts +3 -1
  195. package/dist/i18n/source-messages.d.ts.map +1 -1
  196. package/dist/i18n/source-messages.js +973 -9
  197. package/dist/i18n/source-messages.js.map +1 -1
  198. package/dist/internal/agent-rules.d.ts.map +1 -1
  199. package/dist/internal/agent-rules.js +7 -2
  200. package/dist/internal/agent-rules.js.map +1 -1
  201. package/dist/internal/banner.d.ts +4 -2
  202. package/dist/internal/banner.d.ts.map +1 -1
  203. package/dist/internal/banner.js +19 -5
  204. package/dist/internal/banner.js.map +1 -1
  205. package/dist/internal/build-manifest.d.ts +5 -2
  206. package/dist/internal/build-manifest.d.ts.map +1 -1
  207. package/dist/internal/build-manifest.js +15 -2
  208. package/dist/internal/build-manifest.js.map +1 -1
  209. package/dist/internal/build-output.d.ts +8 -0
  210. package/dist/internal/build-output.d.ts.map +1 -0
  211. package/dist/internal/build-output.js +116 -0
  212. package/dist/internal/build-output.js.map +1 -0
  213. package/dist/internal/cache-root.d.ts +3 -0
  214. package/dist/internal/cache-root.d.ts.map +1 -0
  215. package/dist/internal/cache-root.js +9 -0
  216. package/dist/internal/cache-root.js.map +1 -0
  217. package/dist/internal/compile-cache-store.d.ts +4 -0
  218. package/dist/internal/compile-cache-store.d.ts.map +1 -0
  219. package/dist/internal/compile-cache-store.js +41 -0
  220. package/dist/internal/compile-cache-store.js.map +1 -0
  221. package/dist/internal/compile-cache.d.ts +4 -0
  222. package/dist/internal/compile-cache.d.ts.map +1 -0
  223. package/dist/internal/compile-cache.js +16 -0
  224. package/dist/internal/compile-cache.js.map +1 -0
  225. package/dist/internal/deploy-out-dir.d.ts +4 -0
  226. package/dist/internal/deploy-out-dir.d.ts.map +1 -0
  227. package/dist/internal/deploy-out-dir.js +5 -0
  228. package/dist/internal/deploy-out-dir.js.map +1 -0
  229. package/dist/internal/docs-elements.d.ts +1 -0
  230. package/dist/internal/docs-elements.d.ts.map +1 -1
  231. package/dist/internal/docs-elements.js +5 -4
  232. package/dist/internal/docs-elements.js.map +1 -1
  233. package/dist/internal/entry-arg.d.ts +4 -1
  234. package/dist/internal/entry-arg.d.ts.map +1 -1
  235. package/dist/internal/entry-arg.js +7 -1
  236. package/dist/internal/entry-arg.js.map +1 -1
  237. package/dist/internal/errors.d.ts +2 -1
  238. package/dist/internal/errors.d.ts.map +1 -1
  239. package/dist/internal/errors.js +1 -1
  240. package/dist/internal/errors.js.map +1 -1
  241. package/dist/internal/font-path.d.ts +4 -0
  242. package/dist/internal/font-path.d.ts.map +1 -0
  243. package/dist/internal/font-path.js +12 -0
  244. package/dist/internal/font-path.js.map +1 -0
  245. package/dist/internal/font-staging.d.ts +6 -0
  246. package/dist/internal/font-staging.d.ts.map +1 -0
  247. package/dist/internal/font-staging.js +94 -0
  248. package/dist/internal/font-staging.js.map +1 -0
  249. package/dist/internal/icon-staging.d.ts +3 -0
  250. package/dist/internal/icon-staging.d.ts.map +1 -0
  251. package/dist/internal/icon-staging.js +40 -0
  252. package/dist/internal/icon-staging.js.map +1 -0
  253. package/dist/internal/import-scan.d.ts +4 -0
  254. package/dist/internal/import-scan.d.ts.map +1 -0
  255. package/dist/internal/import-scan.js +138 -0
  256. package/dist/internal/import-scan.js.map +1 -0
  257. package/dist/internal/module-hash.d.ts +3 -0
  258. package/dist/internal/module-hash.d.ts.map +1 -0
  259. package/dist/internal/module-hash.js +19 -0
  260. package/dist/internal/module-hash.js.map +1 -0
  261. package/dist/internal/output-directory.d.ts +15 -0
  262. package/dist/internal/output-directory.d.ts.map +1 -0
  263. package/dist/internal/output-directory.js +490 -0
  264. package/dist/internal/output-directory.js.map +1 -0
  265. package/dist/internal/parent-process.d.ts +12 -0
  266. package/dist/internal/parent-process.d.ts.map +1 -0
  267. package/dist/internal/parent-process.js +74 -0
  268. package/dist/internal/parent-process.js.map +1 -0
  269. package/dist/internal/prepare-project.d.ts +3 -0
  270. package/dist/internal/prepare-project.d.ts.map +1 -1
  271. package/dist/internal/prepare-project.js +9 -3
  272. package/dist/internal/prepare-project.js.map +1 -1
  273. package/dist/internal/react-compiler-cache.d.ts +13 -0
  274. package/dist/internal/react-compiler-cache.d.ts.map +1 -0
  275. package/dist/internal/react-compiler-cache.js +182 -0
  276. package/dist/internal/react-compiler-cache.js.map +1 -0
  277. package/dist/internal/source-imports.d.ts +7 -2
  278. package/dist/internal/source-imports.d.ts.map +1 -1
  279. package/dist/internal/source-imports.js +31 -11
  280. package/dist/internal/source-imports.js.map +1 -1
  281. package/dist/internal/staging-file.d.ts +5 -0
  282. package/dist/internal/staging-file.d.ts.map +1 -0
  283. package/dist/internal/staging-file.js +35 -0
  284. package/dist/internal/staging-file.js.map +1 -0
  285. package/dist/internal/xdg-banner.d.ts +4 -0
  286. package/dist/internal/xdg-banner.d.ts.map +1 -0
  287. package/dist/internal/xdg-banner.js +11 -0
  288. package/dist/internal/xdg-banner.js.map +1 -0
  289. package/dist/internal/xdg-data-dirs.d.ts +2 -1
  290. package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
  291. package/dist/internal/xdg-data-dirs.js +1 -1
  292. package/dist/internal/xdg-data-dirs.js.map +1 -1
  293. package/dist/mcp/client.js +2 -2
  294. package/dist/mcp/client.js.map +1 -1
  295. package/dist/settings/schema.d.ts.map +1 -1
  296. package/dist/settings/schema.js +3 -8
  297. package/dist/settings/schema.js.map +1 -1
  298. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  299. package/dist/vite-plugins/asset-extensions.js +2 -0
  300. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  301. package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
  302. package/dist/vite-plugins/asset-imports.js +20 -6
  303. package/dist/vite-plugins/asset-imports.js.map +1 -1
  304. package/dist/vite-plugins/asset-specifier.d.ts +5 -1
  305. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
  306. package/dist/vite-plugins/asset-specifier.js +10 -1
  307. package/dist/vite-plugins/asset-specifier.js.map +1 -1
  308. package/dist/vite-plugins/build-manifest.d.ts +5 -1
  309. package/dist/vite-plugins/build-manifest.d.ts.map +1 -1
  310. package/dist/vite-plugins/build-manifest.js +2 -1
  311. package/dist/vite-plugins/build-manifest.js.map +1 -1
  312. package/dist/vite-plugins/built-url.d.ts.map +1 -1
  313. package/dist/vite-plugins/built-url.js +5 -2
  314. package/dist/vite-plugins/built-url.js.map +1 -1
  315. package/dist/vite-plugins/css.d.ts.map +1 -1
  316. package/dist/vite-plugins/css.js +13 -5
  317. package/dist/vite-plugins/css.js.map +1 -1
  318. package/dist/vite-plugins/ensure-store.d.ts +1 -1
  319. package/dist/vite-plugins/ensure-store.d.ts.map +1 -1
  320. package/dist/vite-plugins/ensure-store.js +2 -2
  321. package/dist/vite-plugins/ensure-store.js.map +1 -1
  322. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +6 -1
  323. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -1
  324. package/dist/vite-plugins/fast-refresh/refresh-filter.js +3 -1
  325. package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -1
  326. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
  327. package/dist/vite-plugins/fast-refresh/swc-refresh.js +23 -14
  328. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
  329. package/dist/vite-plugins/font-name.d.ts +3 -0
  330. package/dist/vite-plugins/font-name.d.ts.map +1 -0
  331. package/dist/vite-plugins/font-name.js +406 -0
  332. package/dist/vite-plugins/font-name.js.map +1 -0
  333. package/dist/vite-plugins/font-worker-env.d.ts +4 -0
  334. package/dist/vite-plugins/font-worker-env.d.ts.map +1 -0
  335. package/dist/vite-plugins/font-worker-env.js +19 -0
  336. package/dist/vite-plugins/font-worker-env.js.map +1 -0
  337. package/dist/vite-plugins/font.d.ts +4 -0
  338. package/dist/vite-plugins/font.d.ts.map +1 -0
  339. package/dist/vite-plugins/font.js +111 -0
  340. package/dist/vite-plugins/font.js.map +1 -0
  341. package/dist/vite-plugins/i18n.d.ts +11 -2
  342. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  343. package/dist/vite-plugins/i18n.js +74 -8
  344. package/dist/vite-plugins/i18n.js.map +1 -1
  345. package/dist/vite-plugins/icon-worker-env.d.ts +4 -0
  346. package/dist/vite-plugins/icon-worker-env.d.ts.map +1 -0
  347. package/dist/vite-plugins/icon-worker-env.js +23 -0
  348. package/dist/vite-plugins/icon-worker-env.js.map +1 -0
  349. package/dist/vite-plugins/icons.d.ts.map +1 -1
  350. package/dist/vite-plugins/icons.js +4 -9
  351. package/dist/vite-plugins/icons.js.map +1 -1
  352. package/dist/vite-plugins/index.d.ts +10 -1
  353. package/dist/vite-plugins/index.d.ts.map +1 -1
  354. package/dist/vite-plugins/index.js +17 -3
  355. package/dist/vite-plugins/index.js.map +1 -1
  356. package/dist/vite-plugins/native.d.ts.map +1 -1
  357. package/dist/vite-plugins/native.js +0 -4
  358. package/dist/vite-plugins/native.js.map +1 -1
  359. package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
  360. package/dist/vite-plugins/react-compiler.js +57 -18
  361. package/dist/vite-plugins/react-compiler.js.map +1 -1
  362. package/dist/vite-plugins/resource-shared.d.ts +3 -1
  363. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  364. package/dist/vite-plugins/resource-shared.js +3 -1
  365. package/dist/vite-plugins/resource-shared.js.map +1 -1
  366. package/dist/vite-plugins/resources.d.ts.map +1 -1
  367. package/dist/vite-plugins/resources.js +9 -6
  368. package/dist/vite-plugins/resources.js.map +1 -1
  369. package/dist/vite-plugins/self-contained.d.ts.map +1 -1
  370. package/dist/vite-plugins/self-contained.js +159 -158
  371. package/dist/vite-plugins/self-contained.js.map +1 -1
  372. package/dist/vite-plugins/settings-worker-env.d.ts +1 -1
  373. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  374. package/dist/vite-plugins/settings-worker-env.js +4 -4
  375. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  376. package/dist/vite-plugins/settings.d.ts.map +1 -1
  377. package/dist/vite-plugins/settings.js +25 -14
  378. package/dist/vite-plugins/settings.js.map +1 -1
  379. package/dist/vite-plugins/store-links.d.ts.map +1 -1
  380. package/dist/vite-plugins/store-links.js +9 -5
  381. package/dist/vite-plugins/store-links.js.map +1 -1
  382. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  383. package/dist/vite-plugins/undeclared-library.js +18 -15
  384. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  385. package/dist/vite-plugins/worker.d.ts.map +1 -1
  386. package/dist/vite-plugins/worker.js +21 -13
  387. package/dist/vite-plugins/worker.js.map +1 -1
  388. package/dist/vitest-plugin.d.ts +4 -3
  389. package/dist/vitest-plugin.d.ts.map +1 -1
  390. package/dist/vitest-plugin.js +12 -8
  391. package/dist/vitest-plugin.js.map +1 -1
  392. package/env.d.ts +9 -0
  393. package/package.json +18 -13
  394. package/src/builder.ts +45 -12
  395. package/src/cli.ts +15 -2
  396. package/src/codegen/config-dependencies.ts +470 -0
  397. package/src/codegen/freshness.ts +5 -1
  398. package/src/codegen/reference.ts +1 -0
  399. package/src/codegen/run-codegen.ts +51 -21
  400. package/src/codegen/store-resolver.ts +9 -4
  401. package/src/commands/build.ts +13 -2
  402. package/src/commands/cleanup.ts +48 -0
  403. package/src/commands/codegen.ts +6 -5
  404. package/src/commands/deploy.ts +10 -2
  405. package/src/commands/dev.ts +45 -4
  406. package/src/commands/docs.ts +1 -0
  407. package/src/deploy/depends.ts +30 -3
  408. package/src/deploy/download.ts +33 -24
  409. package/src/deploy/freedesktop/metainfo.ts +73 -21
  410. package/src/deploy/freedesktop/validate.ts +80 -15
  411. package/src/deploy/native-addon.ts +183 -0
  412. package/src/deploy/nfpm/config.ts +13 -4
  413. package/src/deploy/nfpm/contents.ts +8 -0
  414. package/src/deploy/node-runtime/download.ts +2 -2
  415. package/src/deploy/node-runtime/elf.ts +46 -5
  416. package/src/deploy/node-runtime/guard.ts +10 -14
  417. package/src/deploy/node-runtime/index.ts +148 -12
  418. package/src/deploy/node-runtime/sonames.ts +17 -0
  419. package/src/deploy/notices/node-runtime.ts +2 -2
  420. package/src/deploy/payload/launcher.ts +20 -1
  421. package/src/deploy/payload/stage.ts +76 -5
  422. package/src/deploy/run-deploy.ts +227 -72
  423. package/src/deploy/settings/arch.ts +40 -8
  424. package/src/deploy/settings/build-manifest.ts +28 -3
  425. package/src/deploy/settings/extra-files.ts +30 -4
  426. package/src/deploy/settings/index.ts +7 -2
  427. package/src/deploy/settings/libraries.ts +2 -1
  428. package/src/deploy/settings/paths.ts +80 -13
  429. package/src/deploy/targets/appimage.ts +1 -0
  430. package/src/deploy/targets/flatpak-pnpm.ts +4 -4
  431. package/src/deploy/targets/flatpak-source.ts +15 -2
  432. package/src/deploy/targets/flatpak.ts +1 -0
  433. package/src/deploy/targets/nfpm-target.ts +14 -6
  434. package/src/deploy/types.ts +5 -1
  435. package/src/deploy/vendored/appimagetool.ts +2 -2
  436. package/src/deploy/vendored/nfpm.ts +1 -1
  437. package/src/dev/catalog-writes.ts +35 -0
  438. package/src/dev/entry-env.ts +2 -1
  439. package/src/dev/font-dir.ts +11 -0
  440. package/src/dev/headless.ts +40 -0
  441. package/src/dev/runner-deps.ts +20 -7
  442. package/src/dev/runner-main.ts +12 -3
  443. package/src/dev/runner.ts +37 -7
  444. package/src/dev/supervisor.ts +183 -32
  445. package/src/dev/vite-dev-server.ts +20 -2
  446. package/src/dev/watch-ignore.ts +16 -0
  447. package/src/i18n/catalogs.ts +21 -8
  448. package/src/i18n/source-messages.ts +1446 -29
  449. package/src/internal/agent-rules.ts +7 -2
  450. package/src/internal/banner.ts +27 -6
  451. package/src/internal/build-manifest.ts +25 -1
  452. package/src/internal/build-output.ts +171 -0
  453. package/src/internal/cache-root.ts +12 -0
  454. package/src/internal/compile-cache-store.ts +50 -0
  455. package/src/internal/compile-cache.ts +20 -0
  456. package/src/internal/deploy-out-dir.ts +8 -0
  457. package/src/internal/docs-elements.ts +10 -4
  458. package/src/internal/entry-arg.ts +8 -1
  459. package/src/internal/errors.ts +1 -1
  460. package/src/internal/font-path.ts +15 -0
  461. package/src/internal/font-staging.ts +131 -0
  462. package/src/internal/icon-staging.ts +58 -0
  463. package/src/internal/import-scan.ts +206 -0
  464. package/src/internal/module-hash.ts +22 -0
  465. package/src/internal/output-directory.ts +699 -0
  466. package/src/internal/parent-process.ts +110 -0
  467. package/src/internal/prepare-project.ts +11 -5
  468. package/src/internal/react-compiler-cache.ts +246 -0
  469. package/src/internal/source-imports.ts +57 -12
  470. package/src/internal/staging-file.ts +42 -0
  471. package/src/internal/xdg-banner.ts +13 -0
  472. package/src/internal/xdg-data-dirs.ts +1 -1
  473. package/src/mcp/client.ts +2 -2
  474. package/src/settings/schema.ts +4 -10
  475. package/src/vite-plugins/asset-extensions.ts +2 -0
  476. package/src/vite-plugins/asset-imports.ts +23 -5
  477. package/src/vite-plugins/asset-specifier.ts +17 -0
  478. package/src/vite-plugins/build-manifest.ts +7 -1
  479. package/src/vite-plugins/built-url.ts +6 -2
  480. package/src/vite-plugins/css.ts +16 -5
  481. package/src/vite-plugins/ensure-store.ts +2 -2
  482. package/src/vite-plugins/fast-refresh/refresh-filter.ts +10 -1
  483. package/src/vite-plugins/fast-refresh/swc-refresh.ts +33 -14
  484. package/src/vite-plugins/font-name.ts +582 -0
  485. package/src/vite-plugins/font-worker-env.ts +25 -0
  486. package/src/vite-plugins/font.ts +180 -0
  487. package/src/vite-plugins/i18n.ts +122 -11
  488. package/src/vite-plugins/icon-worker-env.ts +36 -0
  489. package/src/vite-plugins/icons.ts +4 -10
  490. package/src/vite-plugins/index.ts +34 -9
  491. package/src/vite-plugins/native.ts +0 -5
  492. package/src/vite-plugins/react-compiler.ts +83 -19
  493. package/src/vite-plugins/resource-shared.ts +4 -0
  494. package/src/vite-plugins/resources.ts +11 -5
  495. package/src/vite-plugins/self-contained.ts +184 -185
  496. package/src/vite-plugins/settings-worker-env.ts +4 -4
  497. package/src/vite-plugins/settings.ts +36 -16
  498. package/src/vite-plugins/store-links.ts +10 -5
  499. package/src/vite-plugins/undeclared-library.ts +19 -15
  500. package/src/vite-plugins/worker.ts +31 -15
  501. package/src/vitest-plugin.ts +12 -8
@@ -8,6 +8,8 @@ const ICON_NAME_SEPARATOR = "\0icon=";
8
8
  const REFRESH_EXPORT = "__refresh";
9
9
  const REGISTER_REFRESH_EXPORT = "__registerRefresh";
10
10
  const RESOURCE_PATH_EXPORT = "path";
11
+ const VIRTUAL_ID_RE = new RegExp(`^${VIRTUAL_PREFIX}`);
12
+ const VIRTUAL_INIT_RE = new RegExp(`^${VIRTUAL_INIT}$`);
11
13
  const { isVirtual, toVirtualId, fromVirtualId } = createVirtualNamespace(VIRTUAL_PREFIX);
12
14
 
13
15
  const escapeXml = (value: string): string =>
@@ -32,7 +34,9 @@ const escapeXml = (value: string): string =>
32
34
  });
33
35
 
34
36
  export {
37
+ VIRTUAL_ID_RE,
35
38
  VIRTUAL_INIT,
39
+ VIRTUAL_INIT_RE,
36
40
  BUNDLE_FILENAME,
37
41
  REL_SEPARATOR,
38
42
  ICON_NAME_SEPARATOR,
@@ -1,6 +1,6 @@
1
1
  import type { ConfigLoader } from "@gtkx/config";
2
2
  import type { ModuleNode, Plugin, ResolvedConfig, Rolldown, UserConfig, ViteDevServer } from "vite";
3
- import { createConfigLoader, resourceBasePath } from "@gtkx/config/internal";
3
+ import { createConfigLoader, resourceBasePath, viteProjectRoot } from "@gtkx/config/internal";
4
4
  import { error, info, isPathInside, isRecord, sortStrings, toPosixPath } from "@gtkx/utils";
5
5
  import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
6
6
  import { basename, dirname, extname, isAbsolute, join, posix, relative, sep } from "node:path";
@@ -27,7 +27,9 @@ import {
27
27
  REL_SEPARATOR,
28
28
  RESOURCE_PATH_EXPORT,
29
29
  toVirtualId,
30
+ VIRTUAL_ID_RE,
30
31
  VIRTUAL_INIT,
32
+ VIRTUAL_INIT_RE,
31
33
  } from "./resource-shared.js";
32
34
  import { stripQuery } from "./strip-query.js";
33
35
 
@@ -1283,7 +1285,7 @@ const reconcileImporter = async (ctx: ResolveContext, state: PluginState, id: st
1283
1285
  };
1284
1286
 
1285
1287
  const resolveResourceConfig = async (state: PluginState, config: UserConfig, loadConfig: ConfigLoader) => {
1286
- const loaded = await loadConfig.load(config.root ?? process.cwd());
1288
+ const loaded = await loadConfig.load(viteProjectRoot(config));
1287
1289
  state.prefix = resourceBasePath(loaded.config.applicationId);
1288
1290
  state.root = loaded.root;
1289
1291
 
@@ -1383,7 +1385,7 @@ const rejectInvalidSpecifier = (source: string): void => {
1383
1385
  if (isBareRelativeAsset(source)) {
1384
1386
  throw new Error(
1385
1387
  `${JSON.stringify(source)} must choose ?resource for a GResource, ?icon for a themed icon, ` +
1386
- "or ?url for an emitted file",
1388
+ "?font for a bundled font, or ?url for an emitted file",
1387
1389
  );
1388
1390
  }
1389
1391
  };
@@ -1504,8 +1506,12 @@ const createResourcesPlugin = (state: PluginState, loadConfig: ConfigLoader): Pl
1504
1506
  return resolveResourceId(this, state, { source, importer, options });
1505
1507
  },
1506
1508
 
1507
- load(id) {
1508
- return loadResourceModule(state, id);
1509
+ load: {
1510
+ filter: { id: { include: [VIRTUAL_INIT_RE, VIRTUAL_ID_RE] } },
1511
+
1512
+ handler(id) {
1513
+ return loadResourceModule(state, id);
1514
+ },
1509
1515
  },
1510
1516
 
1511
1517
  async transform(code, id) {
@@ -1,18 +1,13 @@
1
- import type { ESTree, Plugin, VisitorObject } from "vite";
1
+ import type { Plugin } from "vite";
2
+ import { type NodePath, parseSync, type Scope, traverse } from "@babel/core";
2
3
  import { isBuiltin } from "node:module";
3
4
  import { posix } from "node:path";
4
- import { parseSync, Visitor } from "vite";
5
5
 
6
- type Bindings = {
7
- declarations: Map<string, number>;
8
- factories: Set<string>;
9
- requires: Set<string>;
10
- urls: Set<string>;
11
- };
6
+ type BindingKind = "factory" | "module" | "require" | "url";
7
+
8
+ type ResolvedBinding = NonNullable<ReturnType<Scope["getBinding"]>>;
12
9
 
13
10
  type Scan = {
14
- bindings: Bindings;
15
- calls: ESTree.CallExpression[];
16
11
  sources: string[];
17
12
  };
18
13
 
@@ -21,199 +16,208 @@ type Chunk = {
21
16
  code: string;
22
17
  };
23
18
 
24
- type PatternItem =
25
- | ESTree.BindingPattern |
26
- ESTree.BindingProperty |
27
- ESTree.BindingRestElement |
28
- ESTree.FormalParameterRest |
29
- ESTree.TSParameterProperty |
30
- null;
31
-
32
19
  const REQUIRE_FACTORY = "createRequire";
33
20
  const REQUIRE_BINDING = "require";
34
21
  const RESOLVE_PROPERTY = "resolve";
35
- const MODULE_BUILTIN = "node:module";
22
+ const URL_PROPERTY = "url";
23
+ const MODULE_BUILTINS = new Set(["module", "node:module"]);
36
24
  const OUTPUT_DIRECTORY = ".";
37
25
  const RELATIVE_SPECIFIER = /^\.\.?(?:\/|$)/;
38
26
 
39
- const exportName = (name: ESTree.ModuleExportName): string | null => (name.type === "Identifier" ? name.name : null);
40
- const referenceName = (node: ESTree.Argument): string | null => (node.type === "Identifier" ? node.name : null);
41
-
42
- const countName = (declarations: Map<string, number>, name: string | null): void => {
43
- if (name !== null) {
44
- declarations.set(name, (declarations.get(name) ?? 0) + 1);
27
+ const importedName = (path: NodePath): string | null => {
28
+ if (!path.isImportSpecifier()) {
29
+ return null;
45
30
  }
31
+
32
+ const { imported } = path.node;
33
+
34
+ return imported.type === "Identifier" ? imported.name : imported.value;
46
35
  };
47
36
 
48
- const boundPattern = (item: PatternItem): ESTree.BindingPattern | null => {
49
- if (item === null) {
37
+ const importKind = (path: NodePath): BindingKind | null => {
38
+ const declaration = path.parentPath;
39
+
40
+ if (!declaration.isImportDeclaration() || !MODULE_BUILTINS.has(declaration.node.source.value)) {
50
41
  return null;
51
42
  }
52
43
 
53
- if (item.type === "Property") {
54
- return item.value;
44
+ if (importedName(path) === REQUIRE_FACTORY) {
45
+ return "factory";
55
46
  }
56
47
 
57
- if (item.type === "RestElement") {
58
- return item.argument;
48
+ return path.isImportNamespaceSpecifier() || path.isImportDefaultSpecifier() ? "module" : null;
49
+ };
50
+
51
+ const memberName = (path: NodePath): string | null => {
52
+ if (!path.isMemberExpression()) {
53
+ return null;
59
54
  }
60
55
 
61
- return item.type === "TSParameterProperty" ? item.parameter : item;
62
- };
56
+ const property = path.get("property");
63
57
 
64
- const countPatterns = (declarations: Map<string, number>, items: PatternItem[]): void => {
65
- for (const item of items) {
66
- countPattern(declarations, boundPattern(item));
58
+ if (path.node.computed) {
59
+ return property.isStringLiteral() ? property.node.value : null;
67
60
  }
61
+
62
+ return property.isIdentifier() ? property.node.name : null;
68
63
  };
69
64
 
70
- const countPattern = (declarations: Map<string, number>, pattern: ESTree.BindingPattern | null): void => {
71
- if (pattern === null) {
72
- return;
65
+ const isImportMeta = (path: NodePath): boolean =>
66
+ path.isMetaProperty() && path.node.meta.name === "import" && path.node.property.name === "meta";
67
+
68
+ const isDirectMetaUrl = (path: NodePath): boolean => {
69
+ if (!path.isMemberExpression() || memberName(path) !== URL_PROPERTY) {
70
+ return false;
73
71
  }
74
72
 
75
- if (pattern.type === "Identifier") {
76
- countName(declarations, pattern.name);
73
+ const object = path.get("object");
77
74
 
78
- return;
75
+ return isImportMeta(object);
76
+ };
77
+
78
+ const bindingKind = (binding: ResolvedBinding, seen: Set<ResolvedBinding>): BindingKind | null => {
79
+ if (seen.has(binding)) {
80
+ return null;
79
81
  }
80
82
 
81
- if (pattern.type === "AssignmentPattern") {
82
- countPattern(declarations, pattern.left);
83
+ const next = new Set(seen).add(binding);
84
+ const imported = importKind(binding.path);
83
85
 
84
- return;
86
+ if (imported !== null) {
87
+ return imported;
88
+ }
89
+
90
+ if (!binding.path.isVariableDeclarator()) {
91
+ return null;
85
92
  }
86
93
 
87
- countPatterns(declarations, pattern.type === "ObjectPattern" ? pattern.properties : pattern.elements);
94
+ const initializer = binding.path.get("init");
95
+
96
+ return initializer.node === null ? null : expressionKind(initializer, next);
88
97
  };
89
98
 
90
- const countFunction = (
91
- declarations: Map<string, number>,
92
- node: ESTree.ArrowFunctionExpression | ESTree.Function,
93
- ): void => {
94
- countPattern(declarations, node.id);
95
- countPatterns(declarations, node.params);
99
+ const nameKind = (scope: Scope, name: string, seen: Set<ResolvedBinding>): BindingKind | null => {
100
+ const binding = scope.getBinding(name);
101
+
102
+ if (binding !== undefined) {
103
+ return bindingKind(binding, seen);
104
+ }
105
+
106
+ if (name === REQUIRE_FACTORY) {
107
+ return "factory";
108
+ }
109
+
110
+ return name === REQUIRE_BINDING ? "require" : null;
96
111
  };
97
112
 
98
- const declarationVisitor = (declarations: Map<string, number>): VisitorObject => ({
99
- ArrowFunctionExpression: (node) => {
100
- countFunction(declarations, node);
101
- },
102
- CatchClause: (node) => {
103
- countPattern(declarations, node.param);
104
- },
105
- ClassDeclaration: (node) => {
106
- countPattern(declarations, node.id);
107
- },
108
- ClassExpression: (node) => {
109
- countPattern(declarations, node.id);
110
- },
111
- ExportSpecifier: (node) => {
112
- countName(declarations, exportName(node.local));
113
- },
114
- FunctionDeclaration: (node) => {
115
- countFunction(declarations, node);
116
- },
117
- FunctionExpression: (node) => {
118
- countFunction(declarations, node);
119
- },
120
- ImportDefaultSpecifier: (node) => {
121
- countPattern(declarations, node.local);
122
- },
123
- ImportNamespaceSpecifier: (node) => {
124
- countPattern(declarations, node.local);
125
- },
126
- ImportSpecifier: (node) => {
127
- countPattern(declarations, node.local);
128
- },
129
- VariableDeclarator: (node) => {
130
- countPattern(declarations, node.id);
131
- },
132
- });
133
-
134
- const isUnshadowed = (name: string, bindings: Bindings): boolean => (bindings.declarations.get(name) ?? 0) <= 1;
135
-
136
- const templateString = (node: ESTree.TemplateLiteral): string | null => {
137
- const [quasi] = node.quasis;
138
-
139
- return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;
113
+ const isModuleExpression = (path: NodePath, seen: Set<ResolvedBinding>): boolean => {
114
+ if (path.isIdentifier()) {
115
+ return nameKind(path.scope, path.node.name, seen) === "module";
116
+ }
117
+
118
+ if (!path.isCallExpression()) {
119
+ return false;
120
+ }
121
+
122
+ const [source] = path.get("arguments");
123
+ const callee = path.get("callee");
124
+ const sourceName = source === undefined ? null : literalString(source);
125
+
126
+ return (
127
+ sourceName !== null &&
128
+ MODULE_BUILTINS.has(sourceName) &&
129
+ isRequireExpression(callee, seen)
130
+ );
140
131
  };
141
132
 
142
- const literalString = (node: ESTree.Argument | null): string | null => {
143
- if (node?.type === "TemplateLiteral") {
144
- return templateString(node);
133
+ const isFactoryExpression = (path: NodePath, seen: Set<ResolvedBinding>): boolean => {
134
+ if (path.isIdentifier()) {
135
+ return nameKind(path.scope, path.node.name, seen) === "factory";
145
136
  }
146
137
 
147
- return node?.type === "Literal" && typeof node.value === "string" ? node.value : null;
138
+ if (!path.isMemberExpression() || memberName(path) !== REQUIRE_FACTORY) {
139
+ return false;
140
+ }
141
+
142
+ return isModuleExpression(path.get("object"), seen);
148
143
  };
149
144
 
150
- const isMetaUrl = (node: ESTree.Argument, bindings: Bindings): boolean => {
151
- if (node.type === "MemberExpression") {
152
- return node.object.type === "MetaProperty";
145
+ const isRequireFactoryCall = (path: NodePath, seen: Set<ResolvedBinding>): boolean => {
146
+ if (!path.isCallExpression()) {
147
+ return false;
153
148
  }
154
149
 
155
- const name = referenceName(node);
150
+ const callee = path.get("callee");
156
151
 
157
- return name !== null && bindings.urls.has(name) && isUnshadowed(name, bindings);
152
+ return isFactoryExpression(callee, seen);
158
153
  };
159
154
 
160
- const hasMetaUrl = (node: ESTree.CallExpression, bindings: Bindings): boolean =>
161
- node.arguments.some((argument) => isMetaUrl(argument, bindings));
155
+ const expressionKind = (path: NodePath, seen: Set<ResolvedBinding>): BindingKind | null => {
156
+ if (isDirectMetaUrl(path)) {
157
+ return "url";
158
+ }
162
159
 
163
- const isRequireName = (name: string | null, bindings: Bindings): boolean =>
164
- name !== null && (name === REQUIRE_BINDING || bindings.requires.has(name)) && isUnshadowed(name, bindings);
160
+ if (path.isIdentifier()) {
161
+ return nameKind(path.scope, path.node.name, seen);
162
+ }
165
163
 
166
- const isFactoryName = (name: string | null, bindings: Bindings): boolean =>
167
- name !== null && (name === REQUIRE_FACTORY || bindings.factories.has(name)) && isUnshadowed(name, bindings);
164
+ if (isFactoryExpression(path, seen)) {
165
+ return "factory";
166
+ }
168
167
 
169
- const isRequireFactory = (node: ESTree.Argument, bindings: Bindings): boolean =>
170
- node.type === "CallExpression" &&
171
- (isFactoryName(referenceName(node.callee), bindings) || hasMetaUrl(node, bindings));
168
+ if (isModuleExpression(path, seen)) {
169
+ return "module";
170
+ }
172
171
 
173
- const isResolveTarget = (object: ESTree.Expression, bindings: Bindings): boolean =>
174
- object.type === "MetaProperty" ||
175
- isRequireName(referenceName(object), bindings) ||
176
- isRequireFactory(object, bindings);
172
+ return isRequireFactoryCall(path, seen) ? "require" : null;
173
+ };
177
174
 
178
- const isResolveMember = (callee: ESTree.Expression, bindings: Bindings): boolean =>
179
- callee.type === "MemberExpression" &&
180
- !callee.computed &&
181
- callee.property.type === "Identifier" &&
182
- callee.property.name === RESOLVE_PROPERTY &&
183
- isResolveTarget(callee.object, bindings);
175
+ const isMetaUrl = (path: NodePath): boolean =>
176
+ isDirectMetaUrl(path) ||
177
+ (path.isIdentifier() && nameKind(path.scope, path.node.name, new Set()) === "url");
184
178
 
185
- const isResolvingCall = (call: ESTree.CallExpression, bindings: Bindings): boolean =>
186
- hasMetaUrl(call, bindings) ||
187
- isRequireName(referenceName(call.callee), bindings) ||
188
- isRequireFactory(call.callee, bindings) ||
189
- isResolveMember(call.callee, bindings);
179
+ const isRequireExpression = (path: NodePath, seen: Set<ResolvedBinding> = new Set()): boolean =>
180
+ isRequireFactoryCall(path, seen) ||
181
+ (path.isIdentifier() && nameKind(path.scope, path.node.name, seen) === "require");
190
182
 
191
- const collectFactories = (node: ESTree.ImportDeclaration, bindings: Bindings): void => {
192
- if (node.source.value !== MODULE_BUILTIN) {
193
- return;
183
+ const hasMetaUrlArgument = (path: NodePath): boolean => {
184
+ if (!path.isCallExpression()) {
185
+ return false;
194
186
  }
195
187
 
196
- for (const specifier of node.specifiers) {
197
- if (specifier.type === "ImportSpecifier" && exportName(specifier.imported) === REQUIRE_FACTORY) {
198
- bindings.factories.add(specifier.local.name);
199
- }
200
- }
188
+ return path.get("arguments").some((argument) => isMetaUrl(argument));
201
189
  };
202
190
 
203
- const collectBinding = (node: ESTree.VariableDeclarator, bindings: Bindings): void => {
204
- const { id, init } = node;
191
+ const isResolveMember = (path: NodePath): boolean => {
192
+ if (!path.isMemberExpression() || memberName(path) !== RESOLVE_PROPERTY) {
193
+ return false;
194
+ }
205
195
 
206
- if (init === null || id.type !== "Identifier") {
207
- return;
196
+ const object = path.get("object");
197
+
198
+ return isImportMeta(object) || isRequireExpression(object);
199
+ };
200
+
201
+ const isResolvingCall = (path: NodePath): boolean => {
202
+ if (!path.isCallExpression()) {
203
+ return false;
208
204
  }
209
205
 
210
- if (isMetaUrl(init, bindings)) {
211
- bindings.urls.add(id.name);
206
+ const callee = path.get("callee");
207
+
208
+ return hasMetaUrlArgument(path) || isRequireExpression(callee) || isResolveMember(callee);
209
+ };
210
+
211
+ const literalString = (path: NodePath): string | null => {
212
+ if (path.isStringLiteral()) {
213
+ return path.node.value;
212
214
  }
213
215
 
214
- if (isRequireFactory(init, bindings)) {
215
- bindings.requires.add(id.name);
216
+ if (!path.isTemplateLiteral() || path.node.expressions.length > 0) {
217
+ return null;
216
218
  }
219
+
220
+ return path.node.quasis[0]?.value.cooked ?? null;
217
221
  };
218
222
 
219
223
  const collectSource = (scan: Scan, source: string | null): void => {
@@ -222,55 +226,51 @@ const collectSource = (scan: Scan, source: string | null): void => {
222
226
  }
223
227
  };
224
228
 
225
- const collectCall = (scan: Scan, node: ESTree.CallExpression): void => {
226
- if (node.arguments.some((argument) => literalString(argument) !== null)) {
227
- scan.calls.push(node);
229
+ const collectCallSources = (scan: Scan, path: NodePath): void => {
230
+ if (!isResolvingCall(path) || !path.isCallExpression()) {
231
+ return;
228
232
  }
229
- };
230
233
 
231
- const scanVisitor = (scan: Scan): VisitorObject => ({
232
- CallExpression: (node) => {
233
- collectCall(scan, node);
234
- },
235
- ExportAllDeclaration: (node) => {
236
- collectSource(scan, node.source.value);
237
- },
238
- ExportNamedDeclaration: (node) => {
239
- collectSource(scan, node.source?.value ?? null);
240
- },
241
- ImportDeclaration: (node) => {
242
- collectFactories(node, scan.bindings);
243
- collectSource(scan, node.source.value);
244
- },
245
- ImportExpression: (node) => {
246
- collectSource(scan, literalString(node.source));
247
- },
248
- VariableDeclarator: (node) => {
249
- collectBinding(node, scan.bindings);
250
- },
251
- });
234
+ for (const argument of path.get("arguments")) {
235
+ collectSource(scan, literalString(argument));
236
+ }
237
+ };
252
238
 
253
239
  const scanChunk = (chunk: Chunk): Scan => {
254
- const scan: Scan = {
255
- bindings: { declarations: new Map(), factories: new Set(), requires: new Set(), urls: new Set() },
256
- calls: [],
257
- sources: [],
258
- };
240
+ const scan: Scan = { sources: [] };
241
+ const ast = parseSync(chunk.code, {
242
+ ast: true,
243
+ babelrc: false,
244
+ configFile: false,
245
+ filename: chunk.fileName,
246
+ sourceType: "module",
247
+ });
248
+
249
+ if (ast === null) {
250
+ throw new Error(`Cannot inspect ${chunk.fileName}`);
251
+ }
259
252
 
260
- const { program } = parseSync(chunk.fileName, chunk.code);
261
- new Visitor(declarationVisitor(scan.bindings.declarations)).visit(program);
262
- new Visitor(scanVisitor(scan)).visit(program);
253
+ traverse(ast, {
254
+ CallExpression: (path) => {
255
+ collectCallSources(scan, path);
256
+ },
257
+ ExportAllDeclaration: (path) => {
258
+ collectSource(scan, path.node.source.value);
259
+ },
260
+ ExportNamedDeclaration: (path) => {
261
+ collectSource(scan, path.node.source?.value ?? null);
262
+ },
263
+ ImportDeclaration: (path) => {
264
+ collectSource(scan, path.node.source.value);
265
+ },
266
+ ImportExpression: (path) => {
267
+ collectSource(scan, literalString(path.get("source")));
268
+ },
269
+ });
263
270
 
264
271
  return scan;
265
272
  };
266
273
 
267
- const callSpecifiers = (scan: Scan): string[] =>
268
- scan.calls
269
- .filter((call) => isResolvingCall(call, scan.bindings))
270
- .flatMap((call) => call.arguments)
271
- .map((argument) => literalString(argument))
272
- .filter((specifier) => specifier !== null);
273
-
274
274
  const isReachable = (specifier: string, directory: string, emitted: Set<string>): boolean => {
275
275
  if (isBuiltin(specifier)) {
276
276
  return true;
@@ -286,10 +286,9 @@ const isReachable = (specifier: string, directory: string, emitted: Set<string>)
286
286
  };
287
287
 
288
288
  const unreachableSpecifiers = (chunk: Chunk, emitted: Set<string>): string[] => {
289
- const scan = scanChunk(chunk);
290
289
  const directory = posix.dirname(chunk.fileName);
291
290
 
292
- return new Set([...scan.sources, ...callSpecifiers(scan)])
291
+ return new Set(scanChunk(chunk).sources)
293
292
  .values()
294
293
  .filter((specifier) => !isReachable(specifier, directory, emitted))
295
294
  .toArray()
@@ -1,17 +1,17 @@
1
1
  import type { UserConfig } from "vite";
2
2
  import type { Plugin } from "vitest/config";
3
- import { createConfigLoader } from "@gtkx/config/internal";
3
+ import { createConfigLoader, viteProjectRoot } from "@gtkx/config/internal";
4
4
  import { prependSchemaDir, stageAndCompileProjectSchemas } from "../settings/schema.js";
5
5
 
6
- function gtkxSettingsWorkerEnv(): Plugin {
7
- const loadConfig = createConfigLoader();
6
+ function gtkxSettingsWorkerEnv(configFile?: string): Plugin {
7
+ const loadConfig = createConfigLoader({ configFile });
8
8
 
9
9
  return {
10
10
  name: "gtkx:settings-worker-env",
11
11
  enforce: "pre",
12
12
 
13
13
  async config(config: UserConfig) {
14
- const loaded = await loadConfig.load(config.root ?? process.cwd());
14
+ const loaded = await loadConfig.load(viteProjectRoot(config));
15
15
  const dir = stageAndCompileProjectSchemas(loaded.root);
16
16
 
17
17
  if (dir === null) {
@@ -1,10 +1,10 @@
1
- import type { ModuleNode, Plugin, ResolvedConfig, ViteDevServer } from "vite";
1
+ import type { ModuleNode, Plugin, ResolvedConfig, Rollup, ViteDevServer } from "vite";
2
2
  import { error, errorMessage, info, sortStrings } from "@gtkx/utils";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { basename, join } from "node:path";
5
5
  import type { BuildManifestCollector } from "../internal/build-manifest.js";
6
6
  import type { AssetEmitter } from "./asset-emitter.js";
7
- import { prependBanner } from "../internal/banner.js";
7
+ import { outputRootUrlExpression, prependBanner } from "../internal/banner.js";
8
8
  import { createRetainedStagingDir, type RetainedStagingDir, withStagingDir } from "../internal/staging-dir.js";
9
9
  import { compileSchemas } from "../settings/compile.js";
10
10
  import { parseSchemaXml, SchemaParseError } from "../settings/parser.js";
@@ -32,16 +32,21 @@ type PluginContext = AssetEmitter & {
32
32
  error: (message: string) => never;
33
33
  };
34
34
 
35
+ type SchemaResolveContext = Parameters<typeof resolveToVirtual>[0];
36
+ type SchemaResolveRequest = Parameters<typeof resolveToVirtual>[1];
37
+
35
38
  const VIRTUAL_PREFIX = "\0gtkx-settings:";
36
39
  const SCHEMA_STAGING_PREFIX = "schemas";
37
40
  const SOURCE_MODULE_RE = /\.[cm]?[jt]sx?$/;
41
+ const SCHEMA_ID_RE = /\.gschema\.xml$/;
38
42
  const SCHEMA_ENV_DEBOUNCE_MS = 50;
43
+ const VIRTUAL_ID_RE = new RegExp(`^${VIRTUAL_PREFIX}`);
39
44
  const { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);
40
45
 
41
- const SCHEMA_ENV_BANNER = [
42
- "process.env.GSETTINGS_SCHEMA_DIR = [",
43
- " decodeURIComponent(new URL(\".\", import.meta.url).pathname),",
44
- " process.env.GSETTINGS_SCHEMA_DIR,",
46
+ const schemaEnvBanner = (chunk: Rollup.RenderedChunk): string => [
47
+ "globalThis.process.env.GSETTINGS_SCHEMA_DIR = [",
48
+ ` ${outputRootUrlExpression(chunk)},`,
49
+ " globalThis.process.env.GSETTINGS_SCHEMA_DIR,",
45
50
  "]",
46
51
  " .filter(Boolean)",
47
52
  " .join(\":\");",
@@ -168,6 +173,19 @@ const rejectLegacySchemaSpecifier = (source: string): void => {
168
173
  }
169
174
  };
170
175
 
176
+ const resolveSchemaId = async (
177
+ ctx: SchemaResolveContext,
178
+ request: SchemaResolveRequest,
179
+ ): Promise<string | undefined> => {
180
+ if (!request.source.endsWith(SCHEMA_SUFFIX)) {
181
+ return;
182
+ }
183
+
184
+ rejectLegacySchemaSpecifier(request.source);
185
+
186
+ return resolveToVirtual(ctx, request);
187
+ };
188
+
171
189
  const buildSchemaPaths = (rootDir: string, schemaFiles: string[]): string[] =>
172
190
  schemaFiles.map((filePath) => {
173
191
  const rel = projectRelativeSchemaPath(rootDir, filePath);
@@ -284,21 +302,23 @@ function gtkxSettings(buildManifest?: BuildManifestCollector): Plugin {
284
302
  return;
285
303
  }
286
304
 
287
- return prependBanner(options, SCHEMA_ENV_BANNER);
305
+ return prependBanner(options, schemaEnvBanner);
288
306
  },
289
307
 
290
- async resolveId(source, importer, options) {
291
- if (!source.endsWith(SCHEMA_SUFFIX)) {
292
- return;
293
- }
308
+ resolveId: {
309
+ filter: { id: SCHEMA_ID_RE },
294
310
 
295
- rejectLegacySchemaSpecifier(source);
296
-
297
- return resolveToVirtual(this, { source, importer, options });
311
+ handler(source, importer, options) {
312
+ return resolveSchemaId(this, { source, importer, options });
313
+ },
298
314
  },
299
315
 
300
- load(id) {
301
- return loadSchemaModule(this, state, id);
316
+ load: {
317
+ filter: { id: VIRTUAL_ID_RE },
318
+
319
+ handler(id) {
320
+ return loadSchemaModule(this, state, id);
321
+ },
302
322
  },
303
323
 
304
324
  buildEnd() {