@gtkx/cli 1.0.0 → 1.2.0

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 (458) hide show
  1. package/README.md +1 -1
  2. package/dist/builder.d.ts +1 -1
  3. package/dist/builder.d.ts.map +1 -1
  4. package/dist/builder.js +20 -3
  5. package/dist/builder.js.map +1 -1
  6. package/dist/cli.js +6 -2
  7. package/dist/cli.js.map +1 -1
  8. package/dist/codegen/freshness.js +2 -2
  9. package/dist/codegen/freshness.js.map +1 -1
  10. package/dist/codegen/report.d.ts.map +1 -1
  11. package/dist/codegen/report.js +3 -0
  12. package/dist/codegen/report.js.map +1 -1
  13. package/dist/codegen/run-codegen.d.ts +9 -5
  14. package/dist/codegen/run-codegen.d.ts.map +1 -1
  15. package/dist/codegen/run-codegen.js +31 -20
  16. package/dist/codegen/run-codegen.js.map +1 -1
  17. package/dist/codegen/store-resolver.d.ts +1 -1
  18. package/dist/codegen/store-resolver.d.ts.map +1 -1
  19. package/dist/codegen/store-resolver.js.map +1 -1
  20. package/dist/commands/build.d.ts.map +1 -1
  21. package/dist/commands/build.js +5 -6
  22. package/dist/commands/build.js.map +1 -1
  23. package/dist/commands/codegen.d.ts.map +1 -1
  24. package/dist/commands/codegen.js +11 -1
  25. package/dist/commands/codegen.js.map +1 -1
  26. package/dist/commands/deploy.d.ts +22 -0
  27. package/dist/commands/deploy.d.ts.map +1 -0
  28. package/dist/commands/deploy.js +44 -0
  29. package/dist/commands/deploy.js.map +1 -0
  30. package/dist/commands/dev.d.ts.map +1 -1
  31. package/dist/commands/dev.js +4 -4
  32. package/dist/commands/dev.js.map +1 -1
  33. package/dist/commands/docs.d.ts +2 -2
  34. package/dist/commands/docs.d.ts.map +1 -1
  35. package/dist/commands/docs.js +28 -4
  36. package/dist/commands/docs.js.map +1 -1
  37. package/dist/deploy/depends.d.ts +8 -0
  38. package/dist/deploy/depends.d.ts.map +1 -0
  39. package/dist/deploy/depends.js +27 -0
  40. package/dist/deploy/depends.js.map +1 -0
  41. package/dist/deploy/download.d.ts +20 -0
  42. package/dist/deploy/download.d.ts.map +1 -0
  43. package/dist/deploy/download.js +98 -0
  44. package/dist/deploy/download.js.map +1 -0
  45. package/dist/deploy/freedesktop/copyright.d.ts +4 -0
  46. package/dist/deploy/freedesktop/copyright.d.ts.map +1 -0
  47. package/dist/deploy/freedesktop/copyright.js +33 -0
  48. package/dist/deploy/freedesktop/copyright.js.map +1 -0
  49. package/dist/deploy/freedesktop/dbus-service.d.ts +4 -0
  50. package/dist/deploy/freedesktop/dbus-service.d.ts.map +1 -0
  51. package/dist/deploy/freedesktop/dbus-service.js +15 -0
  52. package/dist/deploy/freedesktop/dbus-service.js.map +1 -0
  53. package/dist/deploy/freedesktop/desktop-entry.d.ts +4 -0
  54. package/dist/deploy/freedesktop/desktop-entry.d.ts.map +1 -0
  55. package/dist/deploy/freedesktop/desktop-entry.js +73 -0
  56. package/dist/deploy/freedesktop/desktop-entry.js.map +1 -0
  57. package/dist/deploy/freedesktop/ini.d.ts +7 -0
  58. package/dist/deploy/freedesktop/ini.d.ts.map +1 -0
  59. package/dist/deploy/freedesktop/ini.js +22 -0
  60. package/dist/deploy/freedesktop/ini.js.map +1 -0
  61. package/dist/deploy/freedesktop/metainfo-sections.d.ts +13 -0
  62. package/dist/deploy/freedesktop/metainfo-sections.d.ts.map +1 -0
  63. package/dist/deploy/freedesktop/metainfo-sections.js +73 -0
  64. package/dist/deploy/freedesktop/metainfo-sections.js.map +1 -0
  65. package/dist/deploy/freedesktop/metainfo.d.ts +4 -0
  66. package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -0
  67. package/dist/deploy/freedesktop/metainfo.js +29 -0
  68. package/dist/deploy/freedesktop/metainfo.js.map +1 -0
  69. package/dist/deploy/freedesktop/mime-package.d.ts +4 -0
  70. package/dist/deploy/freedesktop/mime-package.d.ts.map +1 -0
  71. package/dist/deploy/freedesktop/mime-package.js +16 -0
  72. package/dist/deploy/freedesktop/mime-package.js.map +1 -0
  73. package/dist/deploy/freedesktop/validate.d.ts +4 -0
  74. package/dist/deploy/freedesktop/validate.d.ts.map +1 -0
  75. package/dist/deploy/freedesktop/validate.js +81 -0
  76. package/dist/deploy/freedesktop/validate.js.map +1 -0
  77. package/dist/deploy/freedesktop/xml.d.ts +11 -0
  78. package/dist/deploy/freedesktop/xml.d.ts.map +1 -0
  79. package/dist/deploy/freedesktop/xml.js +33 -0
  80. package/dist/deploy/freedesktop/xml.js.map +1 -0
  81. package/dist/deploy/git.d.ts +4 -0
  82. package/dist/deploy/git.d.ts.map +1 -0
  83. package/dist/deploy/git.js +17 -0
  84. package/dist/deploy/git.js.map +1 -0
  85. package/dist/deploy/install-hints.d.ts +5 -0
  86. package/dist/deploy/install-hints.d.ts.map +1 -0
  87. package/dist/deploy/install-hints.js +88 -0
  88. package/dist/deploy/install-hints.js.map +1 -0
  89. package/dist/deploy/nfpm/config.d.ts +8 -0
  90. package/dist/deploy/nfpm/config.d.ts.map +1 -0
  91. package/dist/deploy/nfpm/config.js +119 -0
  92. package/dist/deploy/nfpm/config.js.map +1 -0
  93. package/dist/deploy/nfpm/contents.d.ts +12 -0
  94. package/dist/deploy/nfpm/contents.d.ts.map +1 -0
  95. package/dist/deploy/nfpm/contents.js +48 -0
  96. package/dist/deploy/nfpm/contents.js.map +1 -0
  97. package/dist/deploy/nfpm/description.d.ts +5 -0
  98. package/dist/deploy/nfpm/description.d.ts.map +1 -0
  99. package/dist/deploy/nfpm/description.js +5 -0
  100. package/dist/deploy/nfpm/description.js.map +1 -0
  101. package/dist/deploy/nfpm/optional.d.ts +5 -0
  102. package/dist/deploy/nfpm/optional.d.ts.map +1 -0
  103. package/dist/deploy/nfpm/optional.js +4 -0
  104. package/dist/deploy/nfpm/optional.js.map +1 -0
  105. package/dist/deploy/nfpm/pack.d.ts +5 -0
  106. package/dist/deploy/nfpm/pack.d.ts.map +1 -0
  107. package/dist/deploy/nfpm/pack.js +32 -0
  108. package/dist/deploy/nfpm/pack.js.map +1 -0
  109. package/dist/deploy/node-runtime/download.d.ts +3 -0
  110. package/dist/deploy/node-runtime/download.d.ts.map +1 -0
  111. package/dist/deploy/node-runtime/download.js +39 -0
  112. package/dist/deploy/node-runtime/download.js.map +1 -0
  113. package/dist/deploy/node-runtime/elf.d.ts +7 -0
  114. package/dist/deploy/node-runtime/elf.d.ts.map +1 -0
  115. package/dist/deploy/node-runtime/elf.js +100 -0
  116. package/dist/deploy/node-runtime/elf.js.map +1 -0
  117. package/dist/deploy/node-runtime/guard.d.ts +4 -0
  118. package/dist/deploy/node-runtime/guard.d.ts.map +1 -0
  119. package/dist/deploy/node-runtime/guard.js +22 -0
  120. package/dist/deploy/node-runtime/guard.js.map +1 -0
  121. package/dist/deploy/node-runtime/index.d.ts +4 -0
  122. package/dist/deploy/node-runtime/index.d.ts.map +1 -0
  123. package/dist/deploy/node-runtime/index.js +61 -0
  124. package/dist/deploy/node-runtime/index.js.map +1 -0
  125. package/dist/deploy/payload/copy-tree.d.ts +7 -0
  126. package/dist/deploy/payload/copy-tree.d.ts.map +1 -0
  127. package/dist/deploy/payload/copy-tree.js +36 -0
  128. package/dist/deploy/payload/copy-tree.js.map +1 -0
  129. package/dist/deploy/payload/icons.d.ts +6 -0
  130. package/dist/deploy/payload/icons.d.ts.map +1 -0
  131. package/dist/deploy/payload/icons.js +53 -0
  132. package/dist/deploy/payload/icons.js.map +1 -0
  133. package/dist/deploy/payload/launcher.d.ts +5 -0
  134. package/dist/deploy/payload/launcher.d.ts.map +1 -0
  135. package/dist/deploy/payload/launcher.js +22 -0
  136. package/dist/deploy/payload/launcher.js.map +1 -0
  137. package/dist/deploy/payload/schemas.d.ts +4 -0
  138. package/dist/deploy/payload/schemas.d.ts.map +1 -0
  139. package/dist/deploy/payload/schemas.js +17 -0
  140. package/dist/deploy/payload/schemas.js.map +1 -0
  141. package/dist/deploy/payload/stage.d.ts +15 -0
  142. package/dist/deploy/payload/stage.d.ts.map +1 -0
  143. package/dist/deploy/payload/stage.js +100 -0
  144. package/dist/deploy/payload/stage.js.map +1 -0
  145. package/dist/deploy/registry.d.ts +7 -0
  146. package/dist/deploy/registry.d.ts.map +1 -0
  147. package/dist/deploy/registry.js +30 -0
  148. package/dist/deploy/registry.js.map +1 -0
  149. package/dist/deploy/run-deploy.d.ts +11 -0
  150. package/dist/deploy/run-deploy.d.ts.map +1 -0
  151. package/dist/deploy/run-deploy.js +157 -0
  152. package/dist/deploy/run-deploy.js.map +1 -0
  153. package/dist/deploy/settings/arch.d.ts +4 -0
  154. package/dist/deploy/settings/arch.d.ts.map +1 -0
  155. package/dist/deploy/settings/arch.js +13 -0
  156. package/dist/deploy/settings/arch.js.map +1 -0
  157. package/dist/deploy/settings/categories.d.ts +4 -0
  158. package/dist/deploy/settings/categories.d.ts.map +1 -0
  159. package/dist/deploy/settings/categories.js +29 -0
  160. package/dist/deploy/settings/categories.js.map +1 -0
  161. package/dist/deploy/settings/exec.d.ts +6 -0
  162. package/dist/deploy/settings/exec.d.ts.map +1 -0
  163. package/dist/deploy/settings/exec.js +20 -0
  164. package/dist/deploy/settings/exec.js.map +1 -0
  165. package/dist/deploy/settings/identity.d.ts +18 -0
  166. package/dist/deploy/settings/identity.d.ts.map +1 -0
  167. package/dist/deploy/settings/identity.js +73 -0
  168. package/dist/deploy/settings/identity.js.map +1 -0
  169. package/dist/deploy/settings/index.d.ts +11 -0
  170. package/dist/deploy/settings/index.d.ts.map +1 -0
  171. package/dist/deploy/settings/index.js +103 -0
  172. package/dist/deploy/settings/index.js.map +1 -0
  173. package/dist/deploy/settings/package-manifest.d.ts +16 -0
  174. package/dist/deploy/settings/package-manifest.d.ts.map +1 -0
  175. package/dist/deploy/settings/package-manifest.js +42 -0
  176. package/dist/deploy/settings/package-manifest.js.map +1 -0
  177. package/dist/deploy/settings/paths.d.ts +9 -0
  178. package/dist/deploy/settings/paths.d.ts.map +1 -0
  179. package/dist/deploy/settings/paths.js +82 -0
  180. package/dist/deploy/settings/paths.js.map +1 -0
  181. package/dist/deploy/settings/screenshots.d.ts +8 -0
  182. package/dist/deploy/settings/screenshots.d.ts.map +1 -0
  183. package/dist/deploy/settings/screenshots.js +79 -0
  184. package/dist/deploy/settings/screenshots.js.map +1 -0
  185. package/dist/deploy/settings/starter.d.ts +4 -0
  186. package/dist/deploy/settings/starter.d.ts.map +1 -0
  187. package/dist/deploy/settings/starter.js +28 -0
  188. package/dist/deploy/settings/starter.js.map +1 -0
  189. package/dist/deploy/settings/version.d.ts +9 -0
  190. package/dist/deploy/settings/version.d.ts.map +1 -0
  191. package/dist/deploy/settings/version.js +37 -0
  192. package/dist/deploy/settings/version.js.map +1 -0
  193. package/dist/deploy/targets/appimage.d.ts +4 -0
  194. package/dist/deploy/targets/appimage.d.ts.map +1 -0
  195. package/dist/deploy/targets/appimage.js +105 -0
  196. package/dist/deploy/targets/appimage.js.map +1 -0
  197. package/dist/deploy/targets/deb.d.ts +4 -0
  198. package/dist/deploy/targets/deb.d.ts.map +1 -0
  199. package/dist/deploy/targets/deb.js +4 -0
  200. package/dist/deploy/targets/deb.js.map +1 -0
  201. package/dist/deploy/targets/flatpak-manifest.d.ts +6 -0
  202. package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -0
  203. package/dist/deploy/targets/flatpak-manifest.js +48 -0
  204. package/dist/deploy/targets/flatpak-manifest.js.map +1 -0
  205. package/dist/deploy/targets/flatpak-pnpm.d.ts +15 -0
  206. package/dist/deploy/targets/flatpak-pnpm.d.ts.map +1 -0
  207. package/dist/deploy/targets/flatpak-pnpm.js +69 -0
  208. package/dist/deploy/targets/flatpak-pnpm.js.map +1 -0
  209. package/dist/deploy/targets/flatpak-prebuilt.d.ts +8 -0
  210. package/dist/deploy/targets/flatpak-prebuilt.d.ts.map +1 -0
  211. package/dist/deploy/targets/flatpak-prebuilt.js +43 -0
  212. package/dist/deploy/targets/flatpak-prebuilt.js.map +1 -0
  213. package/dist/deploy/targets/flatpak-source.d.ts +5 -0
  214. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -0
  215. package/dist/deploy/targets/flatpak-source.js +119 -0
  216. package/dist/deploy/targets/flatpak-source.js.map +1 -0
  217. package/dist/deploy/targets/flatpak-sources.d.ts +19 -0
  218. package/dist/deploy/targets/flatpak-sources.d.ts.map +1 -0
  219. package/dist/deploy/targets/flatpak-sources.js +122 -0
  220. package/dist/deploy/targets/flatpak-sources.js.map +1 -0
  221. package/dist/deploy/targets/flatpak.d.ts +4 -0
  222. package/dist/deploy/targets/flatpak.d.ts.map +1 -0
  223. package/dist/deploy/targets/flatpak.js +113 -0
  224. package/dist/deploy/targets/flatpak.js.map +1 -0
  225. package/dist/deploy/targets/nfpm-target.d.ts +5 -0
  226. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -0
  227. package/dist/deploy/targets/nfpm-target.js +26 -0
  228. package/dist/deploy/targets/nfpm-target.js.map +1 -0
  229. package/dist/deploy/targets/rpm.d.ts +4 -0
  230. package/dist/deploy/targets/rpm.d.ts.map +1 -0
  231. package/dist/deploy/targets/rpm.js +4 -0
  232. package/dist/deploy/targets/rpm.js.map +1 -0
  233. package/dist/deploy/tools.d.ts +20 -0
  234. package/dist/deploy/tools.d.ts.map +1 -0
  235. package/dist/deploy/tools.js +106 -0
  236. package/dist/deploy/tools.js.map +1 -0
  237. package/dist/deploy/types.d.ts +140 -0
  238. package/dist/deploy/types.d.ts.map +1 -0
  239. package/dist/deploy/types.js +2 -0
  240. package/dist/deploy/types.js.map +1 -0
  241. package/dist/deploy/vendored/appimagetool.d.ts +7 -0
  242. package/dist/deploy/vendored/appimagetool.d.ts.map +1 -0
  243. package/dist/deploy/vendored/appimagetool.js +42 -0
  244. package/dist/deploy/vendored/appimagetool.js.map +1 -0
  245. package/dist/deploy/vendored/nfpm.d.ts +3 -0
  246. package/dist/deploy/vendored/nfpm.d.ts.map +1 -0
  247. package/dist/deploy/vendored/nfpm.js +60 -0
  248. package/dist/deploy/vendored/nfpm.js.map +1 -0
  249. package/dist/dev/change-queue.d.ts +11 -0
  250. package/dist/dev/change-queue.d.ts.map +1 -0
  251. package/dist/dev/change-queue.js +34 -0
  252. package/dist/dev/change-queue.js.map +1 -0
  253. package/dist/dev/failure-tracker.d.ts +10 -0
  254. package/dist/dev/failure-tracker.d.ts.map +1 -0
  255. package/dist/dev/failure-tracker.js +61 -0
  256. package/dist/dev/failure-tracker.js.map +1 -0
  257. package/dist/dev/missing-import.d.ts +4 -0
  258. package/dist/dev/missing-import.d.ts.map +1 -0
  259. package/dist/dev/missing-import.js +23 -0
  260. package/dist/dev/missing-import.js.map +1 -0
  261. package/dist/dev/runner-deps.d.ts.map +1 -1
  262. package/dist/dev/runner-deps.js +25 -6
  263. package/dist/dev/runner-deps.js.map +1 -1
  264. package/dist/dev/runner.d.ts +8 -4
  265. package/dist/dev/runner.d.ts.map +1 -1
  266. package/dist/dev/runner.js +334 -66
  267. package/dist/dev/runner.js.map +1 -1
  268. package/dist/dev/supervisor.d.ts +1 -2
  269. package/dist/dev/supervisor.d.ts.map +1 -1
  270. package/dist/dev/supervisor.js +1 -1
  271. package/dist/dev/supervisor.js.map +1 -1
  272. package/dist/dev/vite-dev-server.d.ts +13 -2
  273. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  274. package/dist/dev/vite-dev-server.js +30 -2
  275. package/dist/dev/vite-dev-server.js.map +1 -1
  276. package/dist/internal/entry-arg.d.ts +1 -7
  277. package/dist/internal/entry-arg.d.ts.map +1 -1
  278. package/dist/internal/entry-arg.js +18 -11
  279. package/dist/internal/entry-arg.js.map +1 -1
  280. package/dist/internal/module-loads.d.ts +7 -0
  281. package/dist/internal/module-loads.d.ts.map +1 -0
  282. package/dist/internal/module-loads.js +21 -0
  283. package/dist/internal/module-loads.js.map +1 -0
  284. package/dist/internal/prepare-project.d.ts +16 -0
  285. package/dist/internal/prepare-project.d.ts.map +1 -0
  286. package/dist/internal/prepare-project.js +15 -0
  287. package/dist/internal/prepare-project.js.map +1 -0
  288. package/dist/internal/run-cli-tool.d.ts +2 -1
  289. package/dist/internal/run-cli-tool.d.ts.map +1 -1
  290. package/dist/internal/run-cli-tool.js +15 -6
  291. package/dist/internal/run-cli-tool.js.map +1 -1
  292. package/dist/internal/staging-dir.d.ts +8 -1
  293. package/dist/internal/staging-dir.d.ts.map +1 -1
  294. package/dist/internal/staging-dir.js +38 -2
  295. package/dist/internal/staging-dir.js.map +1 -1
  296. package/dist/mcp/serialize-widget.d.ts +2 -1
  297. package/dist/mcp/serialize-widget.d.ts.map +1 -1
  298. package/dist/mcp/serialize-widget.js +1 -1
  299. package/dist/mcp/serialize-widget.js.map +1 -1
  300. package/dist/mcp/testing-loader.d.ts +5 -2
  301. package/dist/mcp/testing-loader.d.ts.map +1 -1
  302. package/dist/mcp/testing-loader.js +7 -3
  303. package/dist/mcp/testing-loader.js.map +1 -1
  304. package/dist/refresh-runtime.d.ts +2 -1
  305. package/dist/refresh-runtime.d.ts.map +1 -1
  306. package/dist/refresh-runtime.js +32 -2
  307. package/dist/refresh-runtime.js.map +1 -1
  308. package/dist/settings/schema.d.ts +1 -2
  309. package/dist/settings/schema.d.ts.map +1 -1
  310. package/dist/settings/schema.js +1 -1
  311. package/dist/settings/schema.js.map +1 -1
  312. package/dist/vite-plugins/asset-extensions.d.ts +2 -1
  313. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  314. package/dist/vite-plugins/asset-extensions.js +2 -1
  315. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  316. package/dist/vite-plugins/asset-imports.d.ts +4 -0
  317. package/dist/vite-plugins/asset-imports.d.ts.map +1 -0
  318. package/dist/vite-plugins/asset-imports.js +88 -0
  319. package/dist/vite-plugins/asset-imports.js.map +1 -0
  320. package/dist/vite-plugins/asset-specifier.d.ts +5 -0
  321. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -0
  322. package/dist/vite-plugins/asset-specifier.js +7 -0
  323. package/dist/vite-plugins/asset-specifier.js.map +1 -0
  324. package/dist/vite-plugins/esm-extension.d.ts +4 -0
  325. package/dist/vite-plugins/esm-extension.d.ts.map +1 -0
  326. package/dist/vite-plugins/esm-extension.js +4 -0
  327. package/dist/vite-plugins/esm-extension.js.map +1 -0
  328. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +1 -3
  329. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
  330. package/dist/vite-plugins/fast-refresh/swc-refresh.js +1 -1
  331. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
  332. package/dist/vite-plugins/index.d.ts.map +1 -1
  333. package/dist/vite-plugins/index.js +4 -0
  334. package/dist/vite-plugins/index.js.map +1 -1
  335. package/dist/vite-plugins/resource-shared.d.ts +2 -1
  336. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  337. package/dist/vite-plugins/resource-shared.js +2 -1
  338. package/dist/vite-plugins/resource-shared.js.map +1 -1
  339. package/dist/vite-plugins/resources.d.ts.map +1 -1
  340. package/dist/vite-plugins/resources.js +30 -29
  341. package/dist/vite-plugins/resources.js.map +1 -1
  342. package/dist/vite-plugins/self-contained.d.ts +4 -0
  343. package/dist/vite-plugins/self-contained.d.ts.map +1 -0
  344. package/dist/vite-plugins/self-contained.js +244 -0
  345. package/dist/vite-plugins/self-contained.js.map +1 -0
  346. package/dist/vite-plugins/settings.d.ts.map +1 -1
  347. package/dist/vite-plugins/settings.js +19 -40
  348. package/dist/vite-plugins/settings.js.map +1 -1
  349. package/dist/vite-plugins/store-links.d.ts +4 -0
  350. package/dist/vite-plugins/store-links.d.ts.map +1 -0
  351. package/dist/vite-plugins/store-links.js +19 -0
  352. package/dist/vite-plugins/store-links.js.map +1 -0
  353. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  354. package/dist/vite-plugins/undeclared-library.js +51 -12
  355. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  356. package/dist/vite-plugins/worker.d.ts.map +1 -1
  357. package/dist/vite-plugins/worker.js +3 -1
  358. package/dist/vite-plugins/worker.js.map +1 -1
  359. package/env.d.ts +106 -25
  360. package/package.json +20 -13
  361. package/src/builder.ts +22 -4
  362. package/src/cli.ts +7 -2
  363. package/src/codegen/freshness.ts +2 -2
  364. package/src/codegen/report.ts +4 -0
  365. package/src/codegen/run-codegen.ts +48 -24
  366. package/src/codegen/store-resolver.ts +1 -1
  367. package/src/commands/build.ts +5 -6
  368. package/src/commands/codegen.ts +14 -1
  369. package/src/commands/deploy.ts +47 -0
  370. package/src/commands/dev.ts +4 -4
  371. package/src/commands/docs.ts +40 -4
  372. package/src/deploy/depends.ts +42 -0
  373. package/src/deploy/download.ts +148 -0
  374. package/src/deploy/freedesktop/copyright.ts +41 -0
  375. package/src/deploy/freedesktop/dbus-service.ts +19 -0
  376. package/src/deploy/freedesktop/desktop-entry.ts +102 -0
  377. package/src/deploy/freedesktop/ini.ts +39 -0
  378. package/src/deploy/freedesktop/metainfo-sections.ts +116 -0
  379. package/src/deploy/freedesktop/metainfo.ts +46 -0
  380. package/src/deploy/freedesktop/mime-package.ts +28 -0
  381. package/src/deploy/freedesktop/validate.ts +124 -0
  382. package/src/deploy/freedesktop/xml.ts +53 -0
  383. package/src/deploy/git.ts +20 -0
  384. package/src/deploy/install-hints.ts +111 -0
  385. package/src/deploy/nfpm/config.ts +153 -0
  386. package/src/deploy/nfpm/contents.ts +69 -0
  387. package/src/deploy/nfpm/description.ts +11 -0
  388. package/src/deploy/nfpm/optional.ts +8 -0
  389. package/src/deploy/nfpm/pack.ts +44 -0
  390. package/src/deploy/node-runtime/download.ts +48 -0
  391. package/src/deploy/node-runtime/elf.ts +145 -0
  392. package/src/deploy/node-runtime/guard.ts +29 -0
  393. package/src/deploy/node-runtime/index.ts +80 -0
  394. package/src/deploy/payload/copy-tree.ts +51 -0
  395. package/src/deploy/payload/icons.ts +80 -0
  396. package/src/deploy/payload/launcher.ts +27 -0
  397. package/src/deploy/payload/schemas.ts +27 -0
  398. package/src/deploy/payload/stage.ts +145 -0
  399. package/src/deploy/registry.ts +40 -0
  400. package/src/deploy/run-deploy.ts +241 -0
  401. package/src/deploy/settings/arch.ts +18 -0
  402. package/src/deploy/settings/categories.ts +39 -0
  403. package/src/deploy/settings/exec.ts +29 -0
  404. package/src/deploy/settings/identity.ts +133 -0
  405. package/src/deploy/settings/index.ts +189 -0
  406. package/src/deploy/settings/package-manifest.ts +68 -0
  407. package/src/deploy/settings/paths.ts +115 -0
  408. package/src/deploy/settings/screenshots.ts +125 -0
  409. package/src/deploy/settings/starter.ts +41 -0
  410. package/src/deploy/settings/version.ts +59 -0
  411. package/src/deploy/targets/appimage.ts +140 -0
  412. package/src/deploy/targets/deb.ts +6 -0
  413. package/src/deploy/targets/flatpak-manifest.ts +61 -0
  414. package/src/deploy/targets/flatpak-pnpm.ts +115 -0
  415. package/src/deploy/targets/flatpak-prebuilt.ts +59 -0
  416. package/src/deploy/targets/flatpak-source.ts +181 -0
  417. package/src/deploy/targets/flatpak-sources.ts +198 -0
  418. package/src/deploy/targets/flatpak.ts +144 -0
  419. package/src/deploy/targets/nfpm-target.ts +33 -0
  420. package/src/deploy/targets/rpm.ts +6 -0
  421. package/src/deploy/tools.ts +156 -0
  422. package/src/deploy/types.ts +174 -0
  423. package/src/deploy/vendored/appimagetool.ts +57 -0
  424. package/src/deploy/vendored/nfpm.ts +79 -0
  425. package/src/dev/change-queue.ts +59 -0
  426. package/src/dev/failure-tracker.ts +92 -0
  427. package/src/dev/missing-import.ts +32 -0
  428. package/src/dev/runner-deps.ts +34 -6
  429. package/src/dev/runner.ts +506 -102
  430. package/src/dev/supervisor.ts +0 -3
  431. package/src/dev/vite-dev-server.ts +54 -3
  432. package/src/internal/entry-arg.ts +25 -11
  433. package/src/internal/module-loads.ts +32 -0
  434. package/src/internal/prepare-project.ts +23 -0
  435. package/src/internal/run-cli-tool.ts +22 -6
  436. package/src/internal/staging-dir.ts +57 -2
  437. package/src/mcp/serialize-widget.ts +3 -2
  438. package/src/mcp/testing-loader.ts +19 -4
  439. package/src/refresh-runtime.ts +48 -2
  440. package/src/settings/schema.ts +0 -1
  441. package/src/vite-plugins/asset-extensions.ts +2 -1
  442. package/src/vite-plugins/asset-imports.ts +134 -0
  443. package/src/vite-plugins/asset-specifier.ts +9 -0
  444. package/src/vite-plugins/esm-extension.ts +4 -0
  445. package/src/vite-plugins/fast-refresh/swc-refresh.ts +1 -1
  446. package/src/vite-plugins/index.ts +4 -0
  447. package/src/vite-plugins/resource-shared.ts +2 -0
  448. package/src/vite-plugins/resources.ts +33 -33
  449. package/src/vite-plugins/self-contained.ts +352 -0
  450. package/src/vite-plugins/settings.ts +21 -48
  451. package/src/vite-plugins/store-links.ts +25 -0
  452. package/src/vite-plugins/undeclared-library.ts +74 -12
  453. package/src/vite-plugins/worker.ts +4 -1
  454. package/dist/internal.d.ts +0 -3
  455. package/dist/internal.d.ts.map +0 -1
  456. package/dist/internal.js +0 -3
  457. package/dist/internal.js.map +0 -1
  458. package/src/internal.ts +0 -2
@@ -2,15 +2,16 @@ import type { ConfigLoader } from "@gtkx/config";
2
2
  import type { Plugin, ResolvedConfig, UserConfig, ViteDevServer } from "vite";
3
3
  import { createConfigLoader } from "@gtkx/config/internal";
4
4
  import { error, info, sortStrings } from "@gtkx/utils";
5
- import { copyFileSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
6
- import { tmpdir } from "node:os";
5
+ import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
6
  import { dirname, join } from "node:path";
8
7
  import type { AssetEmitter } from "./asset-emitter.js";
9
- import { DATA_IMPORT_PREFIX, resolveDataDir } from "../internal/data-dir.js";
8
+ import { resolveDataDir } from "../internal/data-dir.js";
10
9
  import { type ListedFile, listFilesRecursive } from "../internal/list-files.js";
10
+ import { loadModuleExclusively } from "../internal/module-loads.js";
11
11
  import { runCliTool } from "../internal/run-cli-tool.js";
12
- import { withStagingDir } from "../internal/staging-dir.js";
13
- import { ASSET_PATH_RE, ASSET_RE } from "./asset-extensions.js";
12
+ import { createRetainedStagingDir, type RetainedStagingDir, withStagingDir } from "../internal/staging-dir.js";
13
+ import { ASSET_RE } from "./asset-extensions.js";
14
+ import { DATA_PREFIX, isDataAsset } from "./asset-specifier.js";
14
15
  import { renderInitModule } from "./resource-init-module.js";
15
16
  import {
16
17
  BUNDLE_FILENAME,
@@ -19,10 +20,10 @@ import {
19
20
  isVirtual,
20
21
  REFRESH_EXPORT,
21
22
  REL_SEPARATOR,
23
+ RESOURCE_PATH_EXPORT,
22
24
  toVirtualId,
23
25
  VIRTUAL_INIT,
24
26
  } from "./resource-shared.js";
25
- import { stripQuery } from "./strip-query.js";
26
27
 
27
28
  type ResourceEntry = {
28
29
  sourcePath: string;
@@ -35,16 +36,16 @@ type PluginState = {
35
36
  isBuild: boolean;
36
37
  entries: Map<string, ResourceEntry>;
37
38
  sourcePaths: Set<string>;
38
- devStagingDir: string | null;
39
+ stagingDir: RetainedStagingDir;
39
40
  devBundlePath: string;
40
41
  server: ViteDevServer | null;
41
42
  compiledSignature: string;
42
43
  dataDir: string | null;
43
44
  };
44
45
 
45
- const DATA_PREFIX = `${DATA_IMPORT_PREFIX}/`;
46
46
  const RESOURCE_COMPILER = "glib-compile-resources";
47
47
  const MANIFEST_PREFIX = "/";
48
+ const DEV_STAGING_PREFIX = "resources-dev";
48
49
 
49
50
  const deriveResourcePrefix = (applicationId: string): string => `/${applicationId.replaceAll(".", "/")}`;
50
51
 
@@ -93,12 +94,13 @@ const runCompiler = (sourceDir: string, manifest: string, outputPath: string): B
93
94
  };
94
95
 
95
96
  const ensureStagingDir = (state: PluginState): void => {
96
- if (state.devStagingDir) {
97
- return;
98
- }
97
+ state.devBundlePath = join(state.stagingDir.retain(), BUNDLE_FILENAME);
98
+ };
99
99
 
100
- state.devStagingDir = mkdtempSync(join(tmpdir(), "gtkx-resources-dev-"));
101
- state.devBundlePath = join(state.devStagingDir, BUNDLE_FILENAME);
100
+ const releaseStagingDir = (state: PluginState): void => {
101
+ state.stagingDir.release();
102
+ state.devBundlePath = "";
103
+ state.compiledSignature = "";
102
104
  };
103
105
 
104
106
  const entriesSignature = (state: PluginState): string => sortStrings(state.entries.keys()).join("\0");
@@ -123,7 +125,7 @@ const reregisterDevBundle = async (state: PluginState): Promise<void> => {
123
125
  return;
124
126
  }
125
127
 
126
- const mod = await server.ssrLoadModule(VIRTUAL_INIT);
128
+ const mod = await loadModuleExclusively(server, VIRTUAL_INIT);
127
129
  const refresh: unknown = mod[REFRESH_EXPORT];
128
130
 
129
131
  if (isRefreshHook(refresh)) {
@@ -174,25 +176,15 @@ const registerEntry = (state: PluginState, absPath: string, rel: string): Resour
174
176
 
175
177
  const isTrackedSource = (state: PluginState, file: string): boolean => state.sourcePaths.has(file);
176
178
 
177
- const dataAssetSource = (source: string): string | null => {
178
- const clean = stripQuery(source);
179
-
180
- if (!clean.startsWith(DATA_PREFIX) || !ASSET_PATH_RE.test(clean)) {
181
- return null;
182
- }
183
-
184
- return clean;
185
- };
186
-
187
179
  const resolvedAssetId = (
188
180
  resolved: { id: string; external: boolean | string } | null,
189
- clean: string,
181
+ source: string,
190
182
  ): string | undefined => {
191
183
  if (!resolved || resolved.external) {
192
184
  return undefined;
193
185
  }
194
186
 
195
- return toVirtualId(resolved.id) + REL_SEPARATOR + clean.slice(DATA_PREFIX.length);
187
+ return toVirtualId(resolved.id) + REL_SEPARATOR + source.slice(DATA_PREFIX.length);
196
188
  };
197
189
 
198
190
  const loadInitModule = (state: PluginState): string => {
@@ -219,7 +211,7 @@ const loadAssetModule = (state: PluginState, virtualId: string): string => {
219
211
  `import { ensureRegistered } from ${JSON.stringify(VIRTUAL_INIT)};`,
220
212
  "ensureRegistered();",
221
213
  `export default ${JSON.stringify(uri)};`,
222
- `export const path = ${JSON.stringify(entry.resourcePath)};`,
214
+ `export const ${RESOURCE_PATH_EXPORT} = ${JSON.stringify(entry.resourcePath)};`,
223
215
  ].join("\n");
224
216
  };
225
217
 
@@ -271,6 +263,12 @@ const attachResourceWatcher = (state: PluginState, server: ViteDevServer): void
271
263
  void refreshTrackedSource(state, file);
272
264
  };
273
265
 
266
+ const onClose = (): void => {
267
+ releaseStagingDir(state);
268
+ };
269
+
270
+ server.httpServer?.once("close", onClose);
271
+ server.watcher.once("close", onClose);
274
272
  server.watcher.on("change", onFileEvent);
275
273
  server.watcher.on("add", onFileEvent);
276
274
  };
@@ -304,7 +302,7 @@ function gtkxResources(loadConfig: ConfigLoader = createConfigLoader()): Plugin
304
302
  isBuild: false,
305
303
  entries: new Map(),
306
304
  sourcePaths: new Set(),
307
- devStagingDir: null,
305
+ stagingDir: createRetainedStagingDir(DEV_STAGING_PREFIX),
308
306
  devBundlePath: "",
309
307
  server: null,
310
308
  compiledSignature: "",
@@ -333,15 +331,13 @@ function gtkxResources(loadConfig: ConfigLoader = createConfigLoader()): Plugin
333
331
  return VIRTUAL_INIT;
334
332
  }
335
333
 
336
- const clean = dataAssetSource(source);
337
-
338
- if (clean === null) {
334
+ if (!isDataAsset(source)) {
339
335
  return;
340
336
  }
341
337
 
342
- const resolved = await this.resolve(clean, importer, { ...opts, skipSelf: true });
338
+ const resolved = await this.resolve(source, importer, { ...opts, skipSelf: true });
343
339
 
344
- return resolvedAssetId(resolved, clean);
340
+ return resolvedAssetId(resolved, source);
345
341
  },
346
342
 
347
343
  load(id) {
@@ -351,6 +347,10 @@ function gtkxResources(loadConfig: ConfigLoader = createConfigLoader()): Plugin
351
347
  buildEnd() {
352
348
  emitBuildBundle(this, state);
353
349
  },
350
+
351
+ closeBundle() {
352
+ releaseStagingDir(state);
353
+ },
354
354
  };
355
355
  }
356
356
 
@@ -0,0 +1,352 @@
1
+ import type { Plugin } from "vite";
2
+ import { isRecord } from "@gtkx/utils";
3
+ import { isBuiltin } from "node:module";
4
+ import { posix } from "node:path";
5
+ import { parseSync } from "vite";
6
+
7
+ type AstNode = Record<string, unknown>;
8
+
9
+ type Bindings = {
10
+ declarations: Map<string, number>;
11
+ factories: Set<string>;
12
+ requires: Set<string>;
13
+ urls: Set<string>;
14
+ };
15
+
16
+ type Scan = {
17
+ bindings: Bindings;
18
+ calls: AstNode[];
19
+ sources: string[];
20
+ };
21
+
22
+ type Chunk = {
23
+ fileName: string;
24
+ code: string;
25
+ };
26
+
27
+ const REQUIRE_FACTORY = "createRequire";
28
+ const REQUIRE_BINDING = "require";
29
+ const RESOLVE_PROPERTY = "resolve";
30
+ const MODULE_BUILTIN = "node:module";
31
+ const OUTPUT_DIRECTORY = ".";
32
+ const RELATIVE_SPECIFIER = /^\.\.?(?:\/|$)/;
33
+ const DECLARATION_KEYS = ["id", "local", "param", "params"];
34
+
35
+ const SOURCE_STATEMENTS = new Set([
36
+ "ExportAllDeclaration",
37
+ "ExportNamedDeclaration",
38
+ "ImportDeclaration",
39
+ "ImportExpression",
40
+ ]);
41
+
42
+ const isAstNode = (value: unknown): value is AstNode => isRecord(value) && typeof value.type === "string";
43
+ const nodeType = (node: AstNode): string => (typeof node.type === "string" ? node.type : "");
44
+
45
+ const nodeName = (node: AstNode | null): string | null =>
46
+ node !== null && typeof node.name === "string" ? node.name : null;
47
+
48
+ const childNode = (node: AstNode, key: string): AstNode | null => {
49
+ const value = node[key];
50
+
51
+ return isAstNode(value) ? value : null;
52
+ };
53
+
54
+ const childNodes = (node: AstNode, key: string): AstNode[] => {
55
+ const value = node[key];
56
+
57
+ if (!Array.isArray(value)) {
58
+ return [];
59
+ }
60
+
61
+ const entries: unknown[] = value;
62
+
63
+ return entries.filter(isAstNode);
64
+ };
65
+
66
+ const childValues = (value: unknown): unknown[] => {
67
+ if (Array.isArray(value)) {
68
+ const entries: unknown[] = value;
69
+
70
+ return entries;
71
+ }
72
+
73
+ if (!isAstNode(value)) {
74
+ return [];
75
+ }
76
+
77
+ return Object.values(value).filter((child) => typeof child === "object" && child !== null);
78
+ };
79
+
80
+ const visitNode = (value: unknown, visit: (node: AstNode) => void): void => {
81
+ if (isAstNode(value)) {
82
+ visit(value);
83
+ }
84
+ };
85
+
86
+ const walk = (root: unknown, visit: (node: AstNode) => void): void => {
87
+ const stack: unknown[] = [root];
88
+
89
+ while (stack.length > 0) {
90
+ const current = stack.pop();
91
+ visitNode(current, visit);
92
+
93
+ for (const value of childValues(current)) {
94
+ stack.push(value);
95
+ }
96
+ }
97
+ };
98
+
99
+ const countName = (declarations: Map<string, number>, node: AstNode): void => {
100
+ const name = nodeName(node);
101
+
102
+ if (name !== null) {
103
+ declarations.set(name, (declarations.get(name) ?? 0) + 1);
104
+ }
105
+ };
106
+
107
+ const countDeclarations = (node: AstNode, declarations: Map<string, number>): void => {
108
+ for (const key of DECLARATION_KEYS) {
109
+ walk(node[key], (declared) => {
110
+ countName(declarations, declared);
111
+ });
112
+ }
113
+ };
114
+
115
+ const isUnshadowed = (name: string, bindings: Bindings): boolean => (bindings.declarations.get(name) ?? 0) <= 1;
116
+
117
+ const templateString = (node: AstNode): string | null => {
118
+ if (childNodes(node, "expressions").length > 0) {
119
+ return null;
120
+ }
121
+
122
+ const [quasi] = childNodes(node, "quasis");
123
+ const value = quasi === undefined ? null : quasi.value;
124
+
125
+ return isRecord(value) && typeof value.cooked === "string" ? value.cooked : null;
126
+ };
127
+
128
+ const literalString = (node: AstNode | null): string | null => {
129
+ if (node === null) {
130
+ return null;
131
+ }
132
+
133
+ if (nodeType(node) === "Literal") {
134
+ return typeof node.value === "string" ? node.value : null;
135
+ }
136
+
137
+ return nodeType(node) === "TemplateLiteral" ? templateString(node) : null;
138
+ };
139
+
140
+ const isMetaUrl = (node: AstNode, bindings: Bindings): boolean => {
141
+ if (nodeType(node) === "MemberExpression") {
142
+ const object = childNode(node, "object");
143
+
144
+ return object !== null && nodeType(object) === "MetaProperty";
145
+ }
146
+
147
+ const name = nodeName(node);
148
+
149
+ return name !== null && bindings.urls.has(name) && isUnshadowed(name, bindings);
150
+ };
151
+
152
+ const hasMetaUrl = (node: AstNode, bindings: Bindings): boolean =>
153
+ childNodes(node, "arguments").some((argument) => isMetaUrl(argument, bindings));
154
+
155
+ const isRequireName = (name: string | null, bindings: Bindings): boolean =>
156
+ name !== null && (name === REQUIRE_BINDING || bindings.requires.has(name)) && isUnshadowed(name, bindings);
157
+
158
+ const isFactoryName = (name: string | null, bindings: Bindings): boolean =>
159
+ name !== null && (name === REQUIRE_FACTORY || bindings.factories.has(name)) && isUnshadowed(name, bindings);
160
+
161
+ const isRequireFactory = (node: AstNode, bindings: Bindings): boolean => {
162
+ if (nodeType(node) !== "CallExpression") {
163
+ return false;
164
+ }
165
+
166
+ return isFactoryName(nodeName(childNode(node, "callee")), bindings) || hasMetaUrl(node, bindings);
167
+ };
168
+
169
+ const isResolveTarget = (object: AstNode, bindings: Bindings): boolean =>
170
+ nodeType(object) === "MetaProperty" ||
171
+ isRequireName(nodeName(object), bindings) ||
172
+ isRequireFactory(object, bindings);
173
+
174
+ const isResolveMember = (callee: AstNode, bindings: Bindings): boolean => {
175
+ if (nodeType(callee) !== "MemberExpression" || callee.computed === true) {
176
+ return false;
177
+ }
178
+
179
+ if (nodeName(childNode(callee, "property")) !== RESOLVE_PROPERTY) {
180
+ return false;
181
+ }
182
+
183
+ const object = childNode(callee, "object");
184
+
185
+ return object !== null && isResolveTarget(object, bindings);
186
+ };
187
+
188
+ const isResolvingCall = (call: AstNode, bindings: Bindings): boolean => {
189
+ if (hasMetaUrl(call, bindings)) {
190
+ return true;
191
+ }
192
+
193
+ const callee = childNode(call, "callee");
194
+
195
+ if (callee === null) {
196
+ return false;
197
+ }
198
+
199
+ return (
200
+ isRequireName(nodeName(callee), bindings) ||
201
+ isRequireFactory(callee, bindings) ||
202
+ isResolveMember(callee, bindings)
203
+ );
204
+ };
205
+
206
+ const collectFactories = (node: AstNode, bindings: Bindings): void => {
207
+ if (literalString(childNode(node, "source")) !== MODULE_BUILTIN) {
208
+ return;
209
+ }
210
+
211
+ for (const specifier of childNodes(node, "specifiers")) {
212
+ const local = nodeName(childNode(specifier, "local"));
213
+
214
+ if (local !== null && nodeName(childNode(specifier, "imported")) === REQUIRE_FACTORY) {
215
+ bindings.factories.add(local);
216
+ }
217
+ }
218
+ };
219
+
220
+ const collectBinding = (node: AstNode, bindings: Bindings): void => {
221
+ const name = nodeName(childNode(node, "id"));
222
+ const init = childNode(node, "init");
223
+
224
+ if (name === null || init === null) {
225
+ return;
226
+ }
227
+
228
+ if (isMetaUrl(init, bindings)) {
229
+ bindings.urls.add(name);
230
+ }
231
+
232
+ if (isRequireFactory(init, bindings)) {
233
+ bindings.requires.add(name);
234
+ }
235
+ };
236
+
237
+ const hasStringArgument = (call: AstNode): boolean =>
238
+ childNodes(call, "arguments").some((argument) => literalString(argument) !== null);
239
+
240
+ const collectSource = (scan: Scan, node: AstNode, type: string): void => {
241
+ if (!SOURCE_STATEMENTS.has(type)) {
242
+ return;
243
+ }
244
+
245
+ const source = literalString(childNode(node, "source"));
246
+
247
+ if (source !== null) {
248
+ scan.sources.push(source);
249
+ }
250
+ };
251
+
252
+ const collectCall = (scan: Scan, node: AstNode, type: string): void => {
253
+ if (type === "CallExpression" && hasStringArgument(node)) {
254
+ scan.calls.push(node);
255
+ }
256
+ };
257
+
258
+ const scanNode = (scan: Scan, node: AstNode): void => {
259
+ const type = nodeType(node);
260
+ countDeclarations(node, scan.bindings.declarations);
261
+
262
+ if (type === "ImportDeclaration") {
263
+ collectFactories(node, scan.bindings);
264
+ } else if (type === "VariableDeclarator") {
265
+ collectBinding(node, scan.bindings);
266
+ }
267
+
268
+ collectSource(scan, node, type);
269
+ collectCall(scan, node, type);
270
+ };
271
+
272
+ const scanChunk = (chunk: Chunk): Scan => {
273
+ const scan: Scan = {
274
+ bindings: { declarations: new Map(), factories: new Set(), requires: new Set(), urls: new Set() },
275
+ calls: [],
276
+ sources: [],
277
+ };
278
+
279
+ walk(parseSync(chunk.fileName, chunk.code).program, (node) => {
280
+ scanNode(scan, node);
281
+ });
282
+
283
+ return scan;
284
+ };
285
+
286
+ const callSpecifiers = (scan: Scan): string[] =>
287
+ scan.calls
288
+ .filter((call) => isResolvingCall(call, scan.bindings))
289
+ .flatMap((call) => childNodes(call, "arguments"))
290
+ .map((argument) => literalString(argument))
291
+ .filter((specifier) => specifier !== null);
292
+
293
+ const isReachable = (specifier: string, directory: string, emitted: Set<string>): boolean => {
294
+ if (isBuiltin(specifier)) {
295
+ return true;
296
+ }
297
+
298
+ if (!RELATIVE_SPECIFIER.test(specifier)) {
299
+ return false;
300
+ }
301
+
302
+ const target = posix.normalize(posix.join(directory, specifier));
303
+
304
+ return target === OUTPUT_DIRECTORY || emitted.has(target);
305
+ };
306
+
307
+ const unreachableSpecifiers = (chunk: Chunk, emitted: Set<string>): string[] => {
308
+ const scan = scanChunk(chunk);
309
+ const directory = posix.dirname(chunk.fileName);
310
+
311
+ return new Set([...scan.sources, ...callSpecifiers(scan)])
312
+ .values()
313
+ .filter((specifier) => !isReachable(specifier, directory, emitted))
314
+ .toArray()
315
+ .toSorted((left, right) => left.localeCompare(right));
316
+ };
317
+
318
+ const assertSelfContained = (chunk: Chunk, emitted: Set<string>): void => {
319
+ const specifiers = unreachableSpecifiers(chunk, emitted);
320
+
321
+ if (specifiers.length === 0) {
322
+ return;
323
+ }
324
+
325
+ throw new Error(
326
+ [
327
+ `${chunk.fileName} resolves ${specifiers.join(", ")} at runtime,`,
328
+ "so the built app only starts where that resolution succeeds from wherever it was installed.",
329
+ "The artifact may resolve node: builtins and the files the build emits beside it, nothing else:",
330
+ "bundle the module, emit the file, or read the data at build time.",
331
+ ].join(" "),
332
+ );
333
+ };
334
+
335
+ function gtkxSelfContained(): Plugin {
336
+ return {
337
+ name: "gtkx:self-contained",
338
+ apply: "build",
339
+
340
+ generateBundle(_options, bundle) {
341
+ const emitted = new Set(Object.keys(bundle));
342
+
343
+ for (const output of Object.values(bundle)) {
344
+ if (output.type === "chunk") {
345
+ assertSelfContained({ fileName: output.fileName, code: output.code }, emitted);
346
+ }
347
+ }
348
+ },
349
+ };
350
+ }
351
+
352
+ export { gtkxSelfContained };
@@ -1,12 +1,11 @@
1
1
  import type { ModuleNode, Plugin, ResolvedConfig, UserConfig, ViteDevServer } from "vite";
2
2
  import { error, errorMessage, info } from "@gtkx/utils";
3
- import { mkdtempSync, readFileSync } from "node:fs";
4
- import { tmpdir } from "node:os";
3
+ import { readFileSync } from "node:fs";
5
4
  import { basename, join } from "node:path";
6
5
  import type { AssetEmitter } from "./asset-emitter.js";
7
6
  import { prependBanner } from "../internal/banner.js";
8
7
  import { resolveDataDir } from "../internal/data-dir.js";
9
- import { removeTempDir, withStagingDir } from "../internal/staging-dir.js";
8
+ import { createRetainedStagingDir, type RetainedStagingDir, withStagingDir } from "../internal/staging-dir.js";
10
9
  import { compileSchemas } from "../settings/compile.js";
11
10
  import { parseSchemaXml, SchemaParseError } from "../settings/parser.js";
12
11
  import { renderRuntimeModule } from "../settings/render.js";
@@ -14,13 +13,12 @@ import { emitSchemaEnv, prependSchemaDir, SCHEMA_SUFFIX, stageSchema } from "../
14
13
  import { createVirtualNamespace } from "./virtual-module.js";
15
14
 
16
15
  type PluginState = {
17
- schemaDir: string | null;
16
+ schemaDir: RetainedStagingDir;
18
17
  rootDir: string | null;
19
18
  dataDir: string | null;
20
19
  isBuild: boolean;
21
20
  trackedSchemas: Map<string, string>;
22
21
  buildSchemas: Set<string>;
23
- cleanupProcessExit: (() => void) | null;
24
22
  };
25
23
 
26
24
  type PluginContext = AssetEmitter & {
@@ -28,6 +26,7 @@ type PluginContext = AssetEmitter & {
28
26
  };
29
27
 
30
28
  const VIRTUAL_PREFIX = "\0gtkx-settings:";
29
+ const SCHEMA_STAGING_PREFIX = "schemas";
31
30
  const { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);
32
31
 
33
32
  const SCHEMA_ENV_BANNER = [
@@ -40,50 +39,26 @@ const SCHEMA_ENV_BANNER = [
40
39
  ].join("\n");
41
40
 
42
41
  const ensureSchemaDir = (state: PluginState): string => {
43
- if (!state.schemaDir) {
44
- const runnerDir = process.env.GTKX_DEV_SCHEMA_DIR;
42
+ const existing = state.schemaDir.getPath();
45
43
 
46
- if (runnerDir) {
47
- state.schemaDir = runnerDir;
48
-
49
- return runnerDir;
50
- }
51
-
52
- const dir = mkdtempSync(join(tmpdir(), "gtkx-schemas-"));
53
- state.schemaDir = dir;
54
-
55
- const cleanup = (): void => {
56
- removeTempDir(dir);
57
- };
58
-
59
- state.cleanupProcessExit = cleanup;
60
- process.once("exit", cleanup);
44
+ if (existing !== null) {
45
+ return existing;
61
46
  }
62
47
 
63
- return state.schemaDir;
64
- };
48
+ const runnerDir = process.env.GTKX_DEV_SCHEMA_DIR;
65
49
 
66
- const releaseSchemaDir = (state: PluginState): void => {
67
- if (!state.schemaDir) {
68
- return;
69
- }
70
-
71
- if (state.cleanupProcessExit) {
72
- removeTempDir(state.schemaDir);
73
- process.removeListener("exit", state.cleanupProcessExit);
74
- state.cleanupProcessExit = null;
75
- }
76
-
77
- state.schemaDir = null;
50
+ return runnerDir ? state.schemaDir.adopt(runnerDir) : state.schemaDir.retain();
78
51
  };
79
52
 
80
53
  const compileSchemaDir = (state: PluginState): void => {
81
- if (!state.schemaDir) {
54
+ const dir = state.schemaDir.getPath();
55
+
56
+ if (dir === null) {
82
57
  return;
83
58
  }
84
59
 
85
- compileSchemas(state.schemaDir);
86
- process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(state.schemaDir, process.env.GSETTINGS_SCHEMA_DIR);
60
+ compileSchemas(dir);
61
+ process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR);
87
62
  };
88
63
 
89
64
  const syncSchemaEnv = (state: PluginState): void => {
@@ -204,13 +179,12 @@ const handleSchemaHotUpdate = (state: PluginState, file: string, server: ViteDev
204
179
  };
205
180
 
206
181
  const watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {
207
- server.httpServer?.once("close", () => {
208
- releaseSchemaDir(state);
209
- });
182
+ const onClose = (): void => {
183
+ state.schemaDir.release();
184
+ };
210
185
 
211
- server.watcher.once("close", () => {
212
- releaseSchemaDir(state);
213
- });
186
+ server.httpServer?.once("close", onClose);
187
+ server.watcher.once("close", onClose);
214
188
 
215
189
  const refreshSchemaTypes = (file: string): void => {
216
190
  if (file.endsWith(SCHEMA_SUFFIX)) {
@@ -224,13 +198,12 @@ const watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {
224
198
 
225
199
  function gtkxSettings(): Plugin {
226
200
  const state: PluginState = {
227
- schemaDir: null,
201
+ schemaDir: createRetainedStagingDir(SCHEMA_STAGING_PREFIX),
228
202
  rootDir: null,
229
203
  dataDir: null,
230
204
  isBuild: false,
231
205
  trackedSchemas: new Map(),
232
206
  buildSchemas: new Set(),
233
- cleanupProcessExit: null,
234
207
  };
235
208
 
236
209
  return {
@@ -274,7 +247,7 @@ function gtkxSettings(): Plugin {
274
247
  },
275
248
 
276
249
  closeBundle() {
277
- releaseSchemaDir(state);
250
+ state.schemaDir.release();
278
251
  },
279
252
 
280
253
  handleHotUpdate({ file, server }) {
@@ -0,0 +1,25 @@
1
+ import type { Plugin, UserConfig } from "vite";
2
+ import { ensureStoreLinks } from "@gtkx/codegen/internal";
3
+
4
+ const GENERATED_MODULE_PREFIX = /^@gtkx\/(?:gi|jsx)\//;
5
+
6
+ function gtkxStoreLinks(): Plugin {
7
+ const state = { root: "" };
8
+
9
+ return {
10
+ name: "gtkx:store-links",
11
+ enforce: "pre",
12
+
13
+ config(config: UserConfig) {
14
+ state.root = config.root ?? process.cwd();
15
+ },
16
+
17
+ resolveId(source) {
18
+ if (GENERATED_MODULE_PREFIX.test(source)) {
19
+ ensureStoreLinks(state.root);
20
+ }
21
+ },
22
+ };
23
+ }
24
+
25
+ export { gtkxStoreLinks };