@gtkx/cli 1.0.0-rc.4 → 1.1.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 (520) hide show
  1. package/README.md +5 -5
  2. package/dist/builder.d.ts +2 -2
  3. package/dist/builder.d.ts.map +1 -1
  4. package/dist/builder.js +21 -3
  5. package/dist/builder.js.map +1 -1
  6. package/dist/cli.js +9 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/codegen/freshness.d.ts.map +1 -1
  9. package/dist/codegen/freshness.js +2 -4
  10. package/dist/codegen/freshness.js.map +1 -1
  11. package/dist/codegen/run-codegen.d.ts +8 -5
  12. package/dist/codegen/run-codegen.d.ts.map +1 -1
  13. package/dist/codegen/run-codegen.js +25 -19
  14. package/dist/codegen/run-codegen.js.map +1 -1
  15. package/dist/codegen/store-resolver.d.ts +1 -1
  16. package/dist/codegen/store-resolver.d.ts.map +1 -1
  17. package/dist/codegen/store-resolver.js.map +1 -1
  18. package/dist/commands/build.d.ts.map +1 -1
  19. package/dist/commands/build.js +5 -6
  20. package/dist/commands/build.js.map +1 -1
  21. package/dist/commands/codegen.d.ts.map +1 -1
  22. package/dist/commands/codegen.js +11 -1
  23. package/dist/commands/codegen.js.map +1 -1
  24. package/dist/commands/deploy.d.ts +22 -0
  25. package/dist/commands/deploy.d.ts.map +1 -0
  26. package/dist/commands/deploy.js +44 -0
  27. package/dist/commands/deploy.js.map +1 -0
  28. package/dist/commands/dev.d.ts.map +1 -1
  29. package/dist/commands/dev.js +7 -5
  30. package/dist/commands/dev.js.map +1 -1
  31. package/dist/commands/docs.d.ts +2 -2
  32. package/dist/commands/docs.d.ts.map +1 -1
  33. package/dist/commands/docs.js +27 -4
  34. package/dist/commands/docs.js.map +1 -1
  35. package/dist/deploy/depends.d.ts +8 -0
  36. package/dist/deploy/depends.d.ts.map +1 -0
  37. package/dist/deploy/depends.js +27 -0
  38. package/dist/deploy/depends.js.map +1 -0
  39. package/dist/deploy/download.d.ts +20 -0
  40. package/dist/deploy/download.d.ts.map +1 -0
  41. package/dist/deploy/download.js +98 -0
  42. package/dist/deploy/download.js.map +1 -0
  43. package/dist/deploy/freedesktop/copyright.d.ts +4 -0
  44. package/dist/deploy/freedesktop/copyright.d.ts.map +1 -0
  45. package/dist/deploy/freedesktop/copyright.js +33 -0
  46. package/dist/deploy/freedesktop/copyright.js.map +1 -0
  47. package/dist/deploy/freedesktop/dbus-service.d.ts +4 -0
  48. package/dist/deploy/freedesktop/dbus-service.d.ts.map +1 -0
  49. package/dist/deploy/freedesktop/dbus-service.js +15 -0
  50. package/dist/deploy/freedesktop/dbus-service.js.map +1 -0
  51. package/dist/deploy/freedesktop/desktop-entry.d.ts +4 -0
  52. package/dist/deploy/freedesktop/desktop-entry.d.ts.map +1 -0
  53. package/dist/deploy/freedesktop/desktop-entry.js +73 -0
  54. package/dist/deploy/freedesktop/desktop-entry.js.map +1 -0
  55. package/dist/deploy/freedesktop/ini.d.ts +7 -0
  56. package/dist/deploy/freedesktop/ini.d.ts.map +1 -0
  57. package/dist/deploy/freedesktop/ini.js +22 -0
  58. package/dist/deploy/freedesktop/ini.js.map +1 -0
  59. package/dist/deploy/freedesktop/metainfo-sections.d.ts +13 -0
  60. package/dist/deploy/freedesktop/metainfo-sections.d.ts.map +1 -0
  61. package/dist/deploy/freedesktop/metainfo-sections.js +73 -0
  62. package/dist/deploy/freedesktop/metainfo-sections.js.map +1 -0
  63. package/dist/deploy/freedesktop/metainfo.d.ts +4 -0
  64. package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -0
  65. package/dist/deploy/freedesktop/metainfo.js +29 -0
  66. package/dist/deploy/freedesktop/metainfo.js.map +1 -0
  67. package/dist/deploy/freedesktop/mime-package.d.ts +4 -0
  68. package/dist/deploy/freedesktop/mime-package.d.ts.map +1 -0
  69. package/dist/deploy/freedesktop/mime-package.js +16 -0
  70. package/dist/deploy/freedesktop/mime-package.js.map +1 -0
  71. package/dist/deploy/freedesktop/validate.d.ts +4 -0
  72. package/dist/deploy/freedesktop/validate.d.ts.map +1 -0
  73. package/dist/deploy/freedesktop/validate.js +81 -0
  74. package/dist/deploy/freedesktop/validate.js.map +1 -0
  75. package/dist/deploy/freedesktop/xml.d.ts +11 -0
  76. package/dist/deploy/freedesktop/xml.d.ts.map +1 -0
  77. package/dist/deploy/freedesktop/xml.js +33 -0
  78. package/dist/deploy/freedesktop/xml.js.map +1 -0
  79. package/dist/deploy/git.d.ts +4 -0
  80. package/dist/deploy/git.d.ts.map +1 -0
  81. package/dist/deploy/git.js +17 -0
  82. package/dist/deploy/git.js.map +1 -0
  83. package/dist/deploy/install-hints.d.ts +5 -0
  84. package/dist/deploy/install-hints.d.ts.map +1 -0
  85. package/dist/deploy/install-hints.js +85 -0
  86. package/dist/deploy/install-hints.js.map +1 -0
  87. package/dist/deploy/nfpm/config.d.ts +8 -0
  88. package/dist/deploy/nfpm/config.d.ts.map +1 -0
  89. package/dist/deploy/nfpm/config.js +119 -0
  90. package/dist/deploy/nfpm/config.js.map +1 -0
  91. package/dist/deploy/nfpm/contents.d.ts +12 -0
  92. package/dist/deploy/nfpm/contents.d.ts.map +1 -0
  93. package/dist/deploy/nfpm/contents.js +48 -0
  94. package/dist/deploy/nfpm/contents.js.map +1 -0
  95. package/dist/deploy/nfpm/description.d.ts +5 -0
  96. package/dist/deploy/nfpm/description.d.ts.map +1 -0
  97. package/dist/deploy/nfpm/description.js +5 -0
  98. package/dist/deploy/nfpm/description.js.map +1 -0
  99. package/dist/deploy/nfpm/optional.d.ts +5 -0
  100. package/dist/deploy/nfpm/optional.d.ts.map +1 -0
  101. package/dist/deploy/nfpm/optional.js +4 -0
  102. package/dist/deploy/nfpm/optional.js.map +1 -0
  103. package/dist/deploy/nfpm/pack.d.ts +5 -0
  104. package/dist/deploy/nfpm/pack.d.ts.map +1 -0
  105. package/dist/deploy/nfpm/pack.js +32 -0
  106. package/dist/deploy/nfpm/pack.js.map +1 -0
  107. package/dist/deploy/node-runtime/download.d.ts +3 -0
  108. package/dist/deploy/node-runtime/download.d.ts.map +1 -0
  109. package/dist/deploy/node-runtime/download.js +39 -0
  110. package/dist/deploy/node-runtime/download.js.map +1 -0
  111. package/dist/deploy/node-runtime/elf.d.ts +7 -0
  112. package/dist/deploy/node-runtime/elf.d.ts.map +1 -0
  113. package/dist/deploy/node-runtime/elf.js +100 -0
  114. package/dist/deploy/node-runtime/elf.js.map +1 -0
  115. package/dist/deploy/node-runtime/guard.d.ts +4 -0
  116. package/dist/deploy/node-runtime/guard.d.ts.map +1 -0
  117. package/dist/deploy/node-runtime/guard.js +22 -0
  118. package/dist/deploy/node-runtime/guard.js.map +1 -0
  119. package/dist/deploy/node-runtime/index.d.ts +4 -0
  120. package/dist/deploy/node-runtime/index.d.ts.map +1 -0
  121. package/dist/deploy/node-runtime/index.js +61 -0
  122. package/dist/deploy/node-runtime/index.js.map +1 -0
  123. package/dist/deploy/payload/copy-tree.d.ts +7 -0
  124. package/dist/deploy/payload/copy-tree.d.ts.map +1 -0
  125. package/dist/deploy/payload/copy-tree.js +36 -0
  126. package/dist/deploy/payload/copy-tree.js.map +1 -0
  127. package/dist/deploy/payload/icons.d.ts +6 -0
  128. package/dist/deploy/payload/icons.d.ts.map +1 -0
  129. package/dist/deploy/payload/icons.js +53 -0
  130. package/dist/deploy/payload/icons.js.map +1 -0
  131. package/dist/deploy/payload/launcher.d.ts +5 -0
  132. package/dist/deploy/payload/launcher.d.ts.map +1 -0
  133. package/dist/deploy/payload/launcher.js +22 -0
  134. package/dist/deploy/payload/launcher.js.map +1 -0
  135. package/dist/deploy/payload/schemas.d.ts +4 -0
  136. package/dist/deploy/payload/schemas.d.ts.map +1 -0
  137. package/dist/deploy/payload/schemas.js +17 -0
  138. package/dist/deploy/payload/schemas.js.map +1 -0
  139. package/dist/deploy/payload/stage.d.ts +15 -0
  140. package/dist/deploy/payload/stage.d.ts.map +1 -0
  141. package/dist/deploy/payload/stage.js +100 -0
  142. package/dist/deploy/payload/stage.js.map +1 -0
  143. package/dist/deploy/registry.d.ts +7 -0
  144. package/dist/deploy/registry.d.ts.map +1 -0
  145. package/dist/deploy/registry.js +30 -0
  146. package/dist/deploy/registry.js.map +1 -0
  147. package/dist/deploy/run-deploy.d.ts +11 -0
  148. package/dist/deploy/run-deploy.d.ts.map +1 -0
  149. package/dist/deploy/run-deploy.js +153 -0
  150. package/dist/deploy/run-deploy.js.map +1 -0
  151. package/dist/deploy/settings/arch.d.ts +4 -0
  152. package/dist/deploy/settings/arch.d.ts.map +1 -0
  153. package/dist/deploy/settings/arch.js +13 -0
  154. package/dist/deploy/settings/arch.js.map +1 -0
  155. package/dist/deploy/settings/categories.d.ts +4 -0
  156. package/dist/deploy/settings/categories.d.ts.map +1 -0
  157. package/dist/deploy/settings/categories.js +29 -0
  158. package/dist/deploy/settings/categories.js.map +1 -0
  159. package/dist/deploy/settings/exec.d.ts +6 -0
  160. package/dist/deploy/settings/exec.d.ts.map +1 -0
  161. package/dist/deploy/settings/exec.js +20 -0
  162. package/dist/deploy/settings/exec.js.map +1 -0
  163. package/dist/deploy/settings/identity.d.ts +18 -0
  164. package/dist/deploy/settings/identity.d.ts.map +1 -0
  165. package/dist/deploy/settings/identity.js +73 -0
  166. package/dist/deploy/settings/identity.js.map +1 -0
  167. package/dist/deploy/settings/index.d.ts +11 -0
  168. package/dist/deploy/settings/index.d.ts.map +1 -0
  169. package/dist/deploy/settings/index.js +103 -0
  170. package/dist/deploy/settings/index.js.map +1 -0
  171. package/dist/deploy/settings/package-manifest.d.ts +15 -0
  172. package/dist/deploy/settings/package-manifest.d.ts.map +1 -0
  173. package/dist/deploy/settings/package-manifest.js +41 -0
  174. package/dist/deploy/settings/package-manifest.js.map +1 -0
  175. package/dist/deploy/settings/paths.d.ts +9 -0
  176. package/dist/deploy/settings/paths.d.ts.map +1 -0
  177. package/dist/deploy/settings/paths.js +82 -0
  178. package/dist/deploy/settings/paths.js.map +1 -0
  179. package/dist/deploy/settings/screenshots.d.ts +8 -0
  180. package/dist/deploy/settings/screenshots.d.ts.map +1 -0
  181. package/dist/deploy/settings/screenshots.js +79 -0
  182. package/dist/deploy/settings/screenshots.js.map +1 -0
  183. package/dist/deploy/settings/starter.d.ts +4 -0
  184. package/dist/deploy/settings/starter.d.ts.map +1 -0
  185. package/dist/deploy/settings/starter.js +28 -0
  186. package/dist/deploy/settings/starter.js.map +1 -0
  187. package/dist/deploy/settings/version.d.ts +9 -0
  188. package/dist/deploy/settings/version.d.ts.map +1 -0
  189. package/dist/deploy/settings/version.js +37 -0
  190. package/dist/deploy/settings/version.js.map +1 -0
  191. package/dist/deploy/targets/appimage.d.ts +4 -0
  192. package/dist/deploy/targets/appimage.d.ts.map +1 -0
  193. package/dist/deploy/targets/appimage.js +105 -0
  194. package/dist/deploy/targets/appimage.js.map +1 -0
  195. package/dist/deploy/targets/deb.d.ts +4 -0
  196. package/dist/deploy/targets/deb.d.ts.map +1 -0
  197. package/dist/deploy/targets/deb.js +4 -0
  198. package/dist/deploy/targets/deb.js.map +1 -0
  199. package/dist/deploy/targets/flatpak-manifest.d.ts +6 -0
  200. package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -0
  201. package/dist/deploy/targets/flatpak-manifest.js +48 -0
  202. package/dist/deploy/targets/flatpak-manifest.js.map +1 -0
  203. package/dist/deploy/targets/flatpak-prebuilt.d.ts +8 -0
  204. package/dist/deploy/targets/flatpak-prebuilt.d.ts.map +1 -0
  205. package/dist/deploy/targets/flatpak-prebuilt.js +43 -0
  206. package/dist/deploy/targets/flatpak-prebuilt.js.map +1 -0
  207. package/dist/deploy/targets/flatpak-source.d.ts +5 -0
  208. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -0
  209. package/dist/deploy/targets/flatpak-source.js +110 -0
  210. package/dist/deploy/targets/flatpak-source.js.map +1 -0
  211. package/dist/deploy/targets/flatpak-sources.d.ts +17 -0
  212. package/dist/deploy/targets/flatpak-sources.d.ts.map +1 -0
  213. package/dist/deploy/targets/flatpak-sources.js +108 -0
  214. package/dist/deploy/targets/flatpak-sources.js.map +1 -0
  215. package/dist/deploy/targets/flatpak.d.ts +4 -0
  216. package/dist/deploy/targets/flatpak.d.ts.map +1 -0
  217. package/dist/deploy/targets/flatpak.js +112 -0
  218. package/dist/deploy/targets/flatpak.js.map +1 -0
  219. package/dist/deploy/targets/nfpm-target.d.ts +5 -0
  220. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -0
  221. package/dist/deploy/targets/nfpm-target.js +26 -0
  222. package/dist/deploy/targets/nfpm-target.js.map +1 -0
  223. package/dist/deploy/targets/rpm.d.ts +4 -0
  224. package/dist/deploy/targets/rpm.d.ts.map +1 -0
  225. package/dist/deploy/targets/rpm.js +4 -0
  226. package/dist/deploy/targets/rpm.js.map +1 -0
  227. package/dist/deploy/tools.d.ts +18 -0
  228. package/dist/deploy/tools.d.ts.map +1 -0
  229. package/dist/deploy/tools.js +92 -0
  230. package/dist/deploy/tools.js.map +1 -0
  231. package/dist/deploy/types.d.ts +140 -0
  232. package/dist/deploy/types.d.ts.map +1 -0
  233. package/dist/deploy/types.js +2 -0
  234. package/dist/deploy/types.js.map +1 -0
  235. package/dist/deploy/vendored/appimagetool.d.ts +7 -0
  236. package/dist/deploy/vendored/appimagetool.d.ts.map +1 -0
  237. package/dist/deploy/vendored/appimagetool.js +42 -0
  238. package/dist/deploy/vendored/appimagetool.js.map +1 -0
  239. package/dist/deploy/vendored/nfpm.d.ts +3 -0
  240. package/dist/deploy/vendored/nfpm.d.ts.map +1 -0
  241. package/dist/deploy/vendored/nfpm.js +60 -0
  242. package/dist/deploy/vendored/nfpm.js.map +1 -0
  243. package/dist/dev/change-queue.d.ts +11 -0
  244. package/dist/dev/change-queue.d.ts.map +1 -0
  245. package/dist/dev/change-queue.js +34 -0
  246. package/dist/dev/change-queue.js.map +1 -0
  247. package/dist/dev/entry-env.d.ts +3 -0
  248. package/dist/dev/entry-env.d.ts.map +1 -0
  249. package/dist/dev/entry-env.js +3 -0
  250. package/dist/dev/entry-env.js.map +1 -0
  251. package/dist/dev/failure-tracker.d.ts +10 -0
  252. package/dist/dev/failure-tracker.d.ts.map +1 -0
  253. package/dist/dev/failure-tracker.js +61 -0
  254. package/dist/dev/failure-tracker.js.map +1 -0
  255. package/dist/dev/missing-import.d.ts +4 -0
  256. package/dist/dev/missing-import.d.ts.map +1 -0
  257. package/dist/dev/missing-import.js +23 -0
  258. package/dist/dev/missing-import.js.map +1 -0
  259. package/dist/dev/runner-deps.d.ts.map +1 -1
  260. package/dist/dev/runner-deps.js +25 -5
  261. package/dist/dev/runner-deps.js.map +1 -1
  262. package/dist/dev/runner-main.d.ts.map +1 -1
  263. package/dist/dev/runner-main.js +3 -3
  264. package/dist/dev/runner-main.js.map +1 -1
  265. package/dist/dev/runner.d.ts +8 -3
  266. package/dist/dev/runner.d.ts.map +1 -1
  267. package/dist/dev/runner.js +343 -65
  268. package/dist/dev/runner.js.map +1 -1
  269. package/dist/dev/supervisor.d.ts +10 -4
  270. package/dist/dev/supervisor.d.ts.map +1 -1
  271. package/dist/dev/supervisor.js +23 -4
  272. package/dist/dev/supervisor.js.map +1 -1
  273. package/dist/dev/vite-dev-server.d.ts +13 -2
  274. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  275. package/dist/dev/vite-dev-server.js +30 -2
  276. package/dist/dev/vite-dev-server.js.map +1 -1
  277. package/dist/internal/application-args.d.ts +6 -0
  278. package/dist/internal/application-args.d.ts.map +1 -0
  279. package/dist/internal/application-args.js +10 -0
  280. package/dist/internal/application-args.js.map +1 -0
  281. package/dist/internal/entry-arg.d.ts +1 -7
  282. package/dist/internal/entry-arg.d.ts.map +1 -1
  283. package/dist/internal/entry-arg.js +18 -11
  284. package/dist/internal/entry-arg.js.map +1 -1
  285. package/dist/internal/errors.d.ts +1 -2
  286. package/dist/internal/errors.d.ts.map +1 -1
  287. package/dist/internal/errors.js +1 -1
  288. package/dist/internal/errors.js.map +1 -1
  289. package/dist/internal/module-loads.d.ts +7 -0
  290. package/dist/internal/module-loads.d.ts.map +1 -0
  291. package/dist/internal/module-loads.js +21 -0
  292. package/dist/internal/module-loads.js.map +1 -0
  293. package/dist/internal/prepare-project.d.ts +16 -0
  294. package/dist/internal/prepare-project.d.ts.map +1 -0
  295. package/dist/internal/prepare-project.js +15 -0
  296. package/dist/internal/prepare-project.js.map +1 -0
  297. package/dist/internal/run-cli-tool.d.ts +11 -0
  298. package/dist/internal/run-cli-tool.d.ts.map +1 -0
  299. package/dist/internal/run-cli-tool.js +24 -0
  300. package/dist/internal/run-cli-tool.js.map +1 -0
  301. package/dist/internal/staging-dir.d.ts +8 -1
  302. package/dist/internal/staging-dir.d.ts.map +1 -1
  303. package/dist/internal/staging-dir.js +38 -2
  304. package/dist/internal/staging-dir.js.map +1 -1
  305. package/dist/mcp/client.d.ts +1 -1
  306. package/dist/mcp/client.d.ts.map +1 -1
  307. package/dist/mcp/client.js.map +1 -1
  308. package/dist/mcp/handlers.d.ts +1 -1
  309. package/dist/mcp/handlers.d.ts.map +1 -1
  310. package/dist/mcp/handlers.js +78 -41
  311. package/dist/mcp/handlers.js.map +1 -1
  312. package/dist/mcp/index.d.ts.map +1 -1
  313. package/dist/mcp/index.js +1 -0
  314. package/dist/mcp/index.js.map +1 -1
  315. package/dist/mcp/serialize-widget.d.ts +4 -3
  316. package/dist/mcp/serialize-widget.d.ts.map +1 -1
  317. package/dist/mcp/serialize-widget.js +47 -17
  318. package/dist/mcp/serialize-widget.js.map +1 -1
  319. package/dist/mcp/testing-loader.d.ts +5 -2
  320. package/dist/mcp/testing-loader.d.ts.map +1 -1
  321. package/dist/mcp/testing-loader.js +7 -3
  322. package/dist/mcp/testing-loader.js.map +1 -1
  323. package/dist/mcp/widget-properties.d.ts +6 -0
  324. package/dist/mcp/widget-properties.d.ts.map +1 -0
  325. package/dist/mcp/widget-properties.js +102 -0
  326. package/dist/mcp/widget-properties.js.map +1 -0
  327. package/dist/refresh-runtime.d.ts +2 -1
  328. package/dist/refresh-runtime.d.ts.map +1 -1
  329. package/dist/refresh-runtime.js +32 -2
  330. package/dist/refresh-runtime.js.map +1 -1
  331. package/dist/settings/compile.d.ts.map +1 -1
  332. package/dist/settings/compile.js +8 -12
  333. package/dist/settings/compile.js.map +1 -1
  334. package/dist/settings/schema.d.ts +1 -2
  335. package/dist/settings/schema.d.ts.map +1 -1
  336. package/dist/settings/schema.js +1 -1
  337. package/dist/settings/schema.js.map +1 -1
  338. package/dist/vite-plugins/asset-emitter.d.ts +9 -0
  339. package/dist/vite-plugins/asset-emitter.d.ts.map +1 -0
  340. package/dist/vite-plugins/asset-emitter.js +2 -0
  341. package/dist/vite-plugins/asset-emitter.js.map +1 -0
  342. package/dist/vite-plugins/asset-extensions.d.ts +2 -2
  343. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  344. package/dist/vite-plugins/asset-extensions.js +2 -1
  345. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  346. package/dist/vite-plugins/asset-imports.d.ts +4 -0
  347. package/dist/vite-plugins/asset-imports.d.ts.map +1 -0
  348. package/dist/vite-plugins/asset-imports.js +88 -0
  349. package/dist/vite-plugins/asset-imports.js.map +1 -0
  350. package/dist/vite-plugins/asset-specifier.d.ts +5 -0
  351. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -0
  352. package/dist/vite-plugins/asset-specifier.js +7 -0
  353. package/dist/vite-plugins/asset-specifier.js.map +1 -0
  354. package/dist/vite-plugins/built-url.d.ts.map +1 -1
  355. package/dist/vite-plugins/built-url.js +14 -10
  356. package/dist/vite-plugins/built-url.js.map +1 -1
  357. package/dist/vite-plugins/ensure-store.d.ts +4 -0
  358. package/dist/vite-plugins/ensure-store.d.ts.map +1 -0
  359. package/dist/vite-plugins/ensure-store.js +10 -0
  360. package/dist/vite-plugins/ensure-store.js.map +1 -0
  361. package/dist/vite-plugins/esm-extension.d.ts +4 -0
  362. package/dist/vite-plugins/esm-extension.d.ts.map +1 -0
  363. package/dist/vite-plugins/esm-extension.js +4 -0
  364. package/dist/vite-plugins/esm-extension.js.map +1 -0
  365. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +1 -3
  366. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
  367. package/dist/vite-plugins/fast-refresh/swc-refresh.js +1 -1
  368. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
  369. package/dist/vite-plugins/icons.d.ts.map +1 -1
  370. package/dist/vite-plugins/icons.js.map +1 -1
  371. package/dist/vite-plugins/index.d.ts.map +1 -1
  372. package/dist/vite-plugins/index.js +4 -0
  373. package/dist/vite-plugins/index.js.map +1 -1
  374. package/dist/vite-plugins/react-compiler.d.ts +1 -1
  375. package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
  376. package/dist/vite-plugins/react-compiler.js.map +1 -1
  377. package/dist/vite-plugins/resource-shared.d.ts +2 -1
  378. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  379. package/dist/vite-plugins/resource-shared.js +2 -1
  380. package/dist/vite-plugins/resource-shared.js.map +1 -1
  381. package/dist/vite-plugins/resources.d.ts +1 -1
  382. package/dist/vite-plugins/resources.d.ts.map +1 -1
  383. package/dist/vite-plugins/resources.js +36 -44
  384. package/dist/vite-plugins/resources.js.map +1 -1
  385. package/dist/vite-plugins/self-contained.d.ts +4 -0
  386. package/dist/vite-plugins/self-contained.d.ts.map +1 -0
  387. package/dist/vite-plugins/self-contained.js +244 -0
  388. package/dist/vite-plugins/self-contained.js.map +1 -0
  389. package/dist/vite-plugins/settings.d.ts.map +1 -1
  390. package/dist/vite-plugins/settings.js +19 -40
  391. package/dist/vite-plugins/settings.js.map +1 -1
  392. package/dist/vite-plugins/store-links.d.ts +4 -0
  393. package/dist/vite-plugins/store-links.d.ts.map +1 -0
  394. package/dist/vite-plugins/store-links.js +19 -0
  395. package/dist/vite-plugins/store-links.js.map +1 -0
  396. package/dist/vite-plugins/undeclared-library.d.ts +1 -1
  397. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  398. package/dist/vite-plugins/undeclared-library.js +51 -12
  399. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  400. package/dist/vite-plugins/worker.d.ts +4 -0
  401. package/dist/vite-plugins/worker.d.ts.map +1 -0
  402. package/dist/vite-plugins/worker.js +138 -0
  403. package/dist/vite-plugins/worker.js.map +1 -0
  404. package/dist/vitest-plugin.d.ts +7 -0
  405. package/dist/vitest-plugin.d.ts.map +1 -1
  406. package/dist/vitest-plugin.js +14 -1
  407. package/dist/vitest-plugin.js.map +1 -1
  408. package/env.d.ts +106 -25
  409. package/package.json +23 -12
  410. package/src/builder.ts +24 -5
  411. package/src/cli.ts +10 -3
  412. package/src/codegen/freshness.ts +2 -4
  413. package/src/codegen/run-codegen.ts +37 -23
  414. package/src/codegen/store-resolver.ts +1 -1
  415. package/src/commands/build.ts +5 -6
  416. package/src/commands/codegen.ts +14 -1
  417. package/src/commands/deploy.ts +47 -0
  418. package/src/commands/dev.ts +7 -5
  419. package/src/commands/docs.ts +39 -4
  420. package/src/deploy/depends.ts +42 -0
  421. package/src/deploy/download.ts +148 -0
  422. package/src/deploy/freedesktop/copyright.ts +41 -0
  423. package/src/deploy/freedesktop/dbus-service.ts +19 -0
  424. package/src/deploy/freedesktop/desktop-entry.ts +102 -0
  425. package/src/deploy/freedesktop/ini.ts +39 -0
  426. package/src/deploy/freedesktop/metainfo-sections.ts +116 -0
  427. package/src/deploy/freedesktop/metainfo.ts +46 -0
  428. package/src/deploy/freedesktop/mime-package.ts +28 -0
  429. package/src/deploy/freedesktop/validate.ts +124 -0
  430. package/src/deploy/freedesktop/xml.ts +53 -0
  431. package/src/deploy/git.ts +20 -0
  432. package/src/deploy/install-hints.ts +108 -0
  433. package/src/deploy/nfpm/config.ts +153 -0
  434. package/src/deploy/nfpm/contents.ts +69 -0
  435. package/src/deploy/nfpm/description.ts +11 -0
  436. package/src/deploy/nfpm/optional.ts +8 -0
  437. package/src/deploy/nfpm/pack.ts +44 -0
  438. package/src/deploy/node-runtime/download.ts +48 -0
  439. package/src/deploy/node-runtime/elf.ts +145 -0
  440. package/src/deploy/node-runtime/guard.ts +29 -0
  441. package/src/deploy/node-runtime/index.ts +80 -0
  442. package/src/deploy/payload/copy-tree.ts +51 -0
  443. package/src/deploy/payload/icons.ts +80 -0
  444. package/src/deploy/payload/launcher.ts +27 -0
  445. package/src/deploy/payload/schemas.ts +27 -0
  446. package/src/deploy/payload/stage.ts +145 -0
  447. package/src/deploy/registry.ts +40 -0
  448. package/src/deploy/run-deploy.ts +235 -0
  449. package/src/deploy/settings/arch.ts +18 -0
  450. package/src/deploy/settings/categories.ts +39 -0
  451. package/src/deploy/settings/exec.ts +29 -0
  452. package/src/deploy/settings/identity.ts +133 -0
  453. package/src/deploy/settings/index.ts +189 -0
  454. package/src/deploy/settings/package-manifest.ts +66 -0
  455. package/src/deploy/settings/paths.ts +115 -0
  456. package/src/deploy/settings/screenshots.ts +125 -0
  457. package/src/deploy/settings/starter.ts +41 -0
  458. package/src/deploy/settings/version.ts +59 -0
  459. package/src/deploy/targets/appimage.ts +140 -0
  460. package/src/deploy/targets/deb.ts +6 -0
  461. package/src/deploy/targets/flatpak-manifest.ts +61 -0
  462. package/src/deploy/targets/flatpak-prebuilt.ts +59 -0
  463. package/src/deploy/targets/flatpak-source.ts +168 -0
  464. package/src/deploy/targets/flatpak-sources.ts +171 -0
  465. package/src/deploy/targets/flatpak.ts +143 -0
  466. package/src/deploy/targets/nfpm-target.ts +33 -0
  467. package/src/deploy/targets/rpm.ts +6 -0
  468. package/src/deploy/tools.ts +135 -0
  469. package/src/deploy/types.ts +174 -0
  470. package/src/deploy/vendored/appimagetool.ts +57 -0
  471. package/src/deploy/vendored/nfpm.ts +79 -0
  472. package/src/dev/change-queue.ts +59 -0
  473. package/src/dev/entry-env.ts +3 -0
  474. package/src/dev/failure-tracker.ts +92 -0
  475. package/src/dev/missing-import.ts +32 -0
  476. package/src/dev/runner-deps.ts +34 -5
  477. package/src/dev/runner-main.ts +3 -4
  478. package/src/dev/runner.ts +524 -89
  479. package/src/dev/supervisor.ts +51 -11
  480. package/src/dev/vite-dev-server.ts +54 -3
  481. package/src/internal/application-args.ts +13 -0
  482. package/src/internal/entry-arg.ts +25 -11
  483. package/src/internal/errors.ts +1 -1
  484. package/src/internal/module-loads.ts +32 -0
  485. package/src/internal/prepare-project.ts +23 -0
  486. package/src/internal/run-cli-tool.ts +38 -0
  487. package/src/internal/staging-dir.ts +57 -2
  488. package/src/mcp/client.ts +1 -1
  489. package/src/mcp/handlers.ts +123 -56
  490. package/src/mcp/index.ts +1 -0
  491. package/src/mcp/serialize-widget.ts +73 -22
  492. package/src/mcp/testing-loader.ts +19 -4
  493. package/src/mcp/widget-properties.ts +153 -0
  494. package/src/refresh-runtime.ts +48 -2
  495. package/src/settings/compile.ts +8 -11
  496. package/src/settings/schema.ts +0 -1
  497. package/src/vite-plugins/asset-emitter.ts +5 -0
  498. package/src/vite-plugins/asset-extensions.ts +2 -1
  499. package/src/vite-plugins/asset-imports.ts +134 -0
  500. package/src/vite-plugins/asset-specifier.ts +9 -0
  501. package/src/vite-plugins/built-url.ts +19 -13
  502. package/src/vite-plugins/ensure-store.ts +14 -0
  503. package/src/vite-plugins/esm-extension.ts +4 -0
  504. package/src/vite-plugins/fast-refresh/swc-refresh.ts +1 -1
  505. package/src/vite-plugins/icons.ts +2 -5
  506. package/src/vite-plugins/index.ts +4 -0
  507. package/src/vite-plugins/react-compiler.ts +2 -1
  508. package/src/vite-plugins/resource-shared.ts +2 -0
  509. package/src/vite-plugins/resources.ts +43 -52
  510. package/src/vite-plugins/self-contained.ts +352 -0
  511. package/src/vite-plugins/settings.ts +23 -50
  512. package/src/vite-plugins/store-links.ts +25 -0
  513. package/src/vite-plugins/undeclared-library.ts +75 -13
  514. package/src/vite-plugins/worker.ts +238 -0
  515. package/src/vitest-plugin.ts +15 -1
  516. package/dist/internal/resolve-cli-tool.d.ts +0 -3
  517. package/dist/internal/resolve-cli-tool.d.ts.map +0 -1
  518. package/dist/internal/resolve-cli-tool.js +0 -27
  519. package/dist/internal/resolve-cli-tool.js.map +0 -1
  520. package/src/internal/resolve-cli-tool.ts +0 -37
@@ -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,11 +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";
5
+ import type { AssetEmitter } from "./asset-emitter.js";
6
6
  import { prependBanner } from "../internal/banner.js";
7
7
  import { resolveDataDir } from "../internal/data-dir.js";
8
- import { removeTempDir, withStagingDir } from "../internal/staging-dir.js";
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";
11
11
  import { renderRuntimeModule } from "../settings/render.js";
@@ -13,21 +13,20 @@ import { emitSchemaEnv, prependSchemaDir, SCHEMA_SUFFIX, stageSchema } from "../
13
13
  import { createVirtualNamespace } from "./virtual-module.js";
14
14
 
15
15
  type PluginState = {
16
- schemaDir: string | null;
16
+ schemaDir: RetainedStagingDir;
17
17
  rootDir: string | null;
18
18
  dataDir: string | null;
19
19
  isBuild: boolean;
20
20
  trackedSchemas: Map<string, string>;
21
21
  buildSchemas: Set<string>;
22
- cleanupProcessExit: (() => void) | null;
23
22
  };
24
23
 
25
- type PluginContext = {
24
+ type PluginContext = AssetEmitter & {
26
25
  error: (message: string) => never;
27
- emitFile: (file: { type: "asset"; fileName: string; source: Buffer }) => void;
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 };
@@ -1,7 +1,10 @@
1
- import type { ConfigLoader } from "@gtkx/config/internal";
1
+ import type { StoreOptions } from "@gtkx/codegen";
2
+ import type { ConfigLoader } from "@gtkx/config";
2
3
  import type { Plugin, UserConfig } from "vite";
3
- import { discoverGirNamespaces, resolveGirPath } from "@gtkx/codegen";
4
+ import { discoverGirNamespaces, resolveGirPath, resolveStore } from "@gtkx/codegen";
4
5
  import { createConfigLoader } from "@gtkx/config/internal";
6
+ import { existsSync, readFileSync } from "node:fs";
7
+ import { join } from "node:path";
5
8
 
6
9
  type PluginState = {
7
10
  root: string;
@@ -9,7 +12,14 @@ type PluginState = {
9
12
  girPath: string[] | null;
10
13
  };
11
14
 
12
- const GENERATED_MODULE_PATTERN = /^@gtkx\/(?:gi|jsx)\/([a-z0-9]+)$/;
15
+ type GeneratedModule = {
16
+ source: string;
17
+ kind: string;
18
+ namespace: string;
19
+ importer: string;
20
+ };
21
+
22
+ const GENERATED_MODULE_PATTERN = /^@gtkx\/(gi|jsx)\/([a-z0-9]+)$/;
13
23
 
14
24
  const girSearchPaths = async (state: PluginState): Promise<string[]> => {
15
25
  if (state.girPath === null) {
@@ -25,24 +35,76 @@ const getNamespace = (identifier: string): string => identifier.slice(0, identif
25
35
  const findGirIdentifier = (girPath: string[], namespace: string): string | undefined =>
26
36
  discoverGirNamespaces(girPath).find((identifier) => getNamespace(identifier) === namespace);
27
37
 
28
- const undeclaredLibraryError = (source: string, namespace: string, girPath: string[]): Error => {
29
- const identifier = findGirIdentifier(girPath, namespace);
38
+ const parseGeneratedModule = (source: string, importer: string | undefined): GeneratedModule | null => {
39
+ const matched = GENERATED_MODULE_PATTERN.exec(source);
40
+ const kind = matched?.[1];
41
+ const namespace = matched?.[2];
42
+
43
+ if (kind === undefined || namespace === undefined) {
44
+ return null;
45
+ }
46
+
47
+ return { source, kind, namespace, importer: importer ?? "the project's sources" };
48
+ };
49
+
50
+ const getStoreOptions = (root: string, kind: string): StoreOptions | null => {
51
+ try {
52
+ const store = resolveStore(root);
53
+
54
+ return kind === "gi" ? store.gi : store.jsx;
55
+ } catch {
56
+ return null;
57
+ }
58
+ };
59
+
60
+ const hasNamespaceModule = (storeDir: string, namespace: string): boolean => {
61
+ const manifest = join(storeDir, "package.json");
62
+
63
+ if (!existsSync(manifest)) {
64
+ return false;
65
+ }
66
+
67
+ const { exports } = JSON.parse(readFileSync(manifest, "utf8")) as { exports?: Record<string, unknown> };
68
+
69
+ return exports?.[`./${namespace}`] !== undefined;
70
+ };
71
+
72
+ const unreachableStoreError = (generated: GeneratedModule, options: StoreOptions): Error =>
73
+ new Error(
74
+ `Cannot resolve "${generated.source}": the generated store in ${options.storeDir} does provide ` +
75
+ `"${generated.namespace}", but its link at ${options.linkDir} is not on the module resolution path of ` +
76
+ `${generated.importer}. Codegen writes the store into the node_modules the installed @gtkx packages ` +
77
+ "resolve from; install them where the importing file reaches them, then run gtkx codegen again.",
78
+ );
79
+
80
+ const undeclaredLibraryError = (generated: GeneratedModule, girPath: string[]): Error => {
81
+ const identifier = findGirIdentifier(girPath, generated.namespace);
30
82
 
31
83
  if (identifier === undefined) {
32
84
  return new Error(
33
- `Cannot resolve "${source}": the binding store has no "${namespace}" module, and no GIR data for it ` +
34
- `was found in [${girPath.join(", ")}]. If "${namespace}" is a library, install its ` +
35
- "gobject-introspection data package and add its GIR identifier to `libraries` in gtkx.config.ts. " +
36
- "Otherwise run gtkx codegen to regenerate the store.",
85
+ `Cannot resolve "${generated.source}": the binding store has no "${generated.namespace}" module, and no ` +
86
+ `GIR data for it was found in [${girPath.join(", ")}]. If "${generated.namespace}" is a library, ` +
87
+ "install its gobject-introspection data package and add its GIR identifier to `libraries` in " +
88
+ "gtkx.config.ts. Otherwise run gtkx codegen to regenerate the store.",
37
89
  );
38
90
  }
39
91
 
40
92
  return new Error(
41
- `Cannot resolve "${source}": the "${identifier}" bindings have not been generated. ` +
93
+ `Cannot resolve "${generated.source}": the "${identifier}" bindings have not been generated. ` +
42
94
  `Add "${identifier}" to \`libraries\` in gtkx.config.ts, then run gtkx dev or gtkx build again.`,
43
95
  );
44
96
  };
45
97
 
98
+ const unresolvedModuleError = async (state: PluginState, generated: GeneratedModule): Promise<Error> => {
99
+ const options = getStoreOptions(state.root, generated.kind);
100
+
101
+ if (options !== null && hasNamespaceModule(options.storeDir, generated.namespace)) {
102
+ return unreachableStoreError(generated, options);
103
+ }
104
+
105
+ return undeclaredLibraryError(generated, await girSearchPaths(state));
106
+ };
107
+
46
108
  function gtkxUndeclaredLibrary(loadConfig: ConfigLoader = createConfigLoader()): Plugin {
47
109
  const state: PluginState = {
48
110
  root: "",
@@ -59,9 +121,9 @@ function gtkxUndeclaredLibrary(loadConfig: ConfigLoader = createConfigLoader()):
59
121
  },
60
122
 
61
123
  async resolveId(source, importer, options) {
62
- const namespace = GENERATED_MODULE_PATTERN.exec(source)?.[1];
124
+ const generated = parseGeneratedModule(source, importer);
63
125
 
64
- if (namespace === undefined) {
126
+ if (generated === null) {
65
127
  return;
66
128
  }
67
129
 
@@ -71,7 +133,7 @@ function gtkxUndeclaredLibrary(loadConfig: ConfigLoader = createConfigLoader()):
71
133
  return;
72
134
  }
73
135
 
74
- throw undeclaredLibraryError(source, namespace, await girSearchPaths(state));
136
+ throw await unresolvedModuleError(state, generated);
75
137
  },
76
138
  };
77
139
  }