@gtkx/cli 1.0.0 → 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 (449) 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/run-codegen.d.ts +8 -5
  11. package/dist/codegen/run-codegen.d.ts.map +1 -1
  12. package/dist/codegen/run-codegen.js +24 -19
  13. package/dist/codegen/run-codegen.js.map +1 -1
  14. package/dist/codegen/store-resolver.d.ts +1 -1
  15. package/dist/codegen/store-resolver.d.ts.map +1 -1
  16. package/dist/codegen/store-resolver.js.map +1 -1
  17. package/dist/commands/build.d.ts.map +1 -1
  18. package/dist/commands/build.js +5 -6
  19. package/dist/commands/build.js.map +1 -1
  20. package/dist/commands/codegen.d.ts.map +1 -1
  21. package/dist/commands/codegen.js +11 -1
  22. package/dist/commands/codegen.js.map +1 -1
  23. package/dist/commands/deploy.d.ts +22 -0
  24. package/dist/commands/deploy.d.ts.map +1 -0
  25. package/dist/commands/deploy.js +44 -0
  26. package/dist/commands/deploy.js.map +1 -0
  27. package/dist/commands/dev.d.ts.map +1 -1
  28. package/dist/commands/dev.js +4 -4
  29. package/dist/commands/dev.js.map +1 -1
  30. package/dist/commands/docs.d.ts +2 -2
  31. package/dist/commands/docs.d.ts.map +1 -1
  32. package/dist/commands/docs.js +27 -4
  33. package/dist/commands/docs.js.map +1 -1
  34. package/dist/deploy/depends.d.ts +8 -0
  35. package/dist/deploy/depends.d.ts.map +1 -0
  36. package/dist/deploy/depends.js +27 -0
  37. package/dist/deploy/depends.js.map +1 -0
  38. package/dist/deploy/download.d.ts +20 -0
  39. package/dist/deploy/download.d.ts.map +1 -0
  40. package/dist/deploy/download.js +98 -0
  41. package/dist/deploy/download.js.map +1 -0
  42. package/dist/deploy/freedesktop/copyright.d.ts +4 -0
  43. package/dist/deploy/freedesktop/copyright.d.ts.map +1 -0
  44. package/dist/deploy/freedesktop/copyright.js +33 -0
  45. package/dist/deploy/freedesktop/copyright.js.map +1 -0
  46. package/dist/deploy/freedesktop/dbus-service.d.ts +4 -0
  47. package/dist/deploy/freedesktop/dbus-service.d.ts.map +1 -0
  48. package/dist/deploy/freedesktop/dbus-service.js +15 -0
  49. package/dist/deploy/freedesktop/dbus-service.js.map +1 -0
  50. package/dist/deploy/freedesktop/desktop-entry.d.ts +4 -0
  51. package/dist/deploy/freedesktop/desktop-entry.d.ts.map +1 -0
  52. package/dist/deploy/freedesktop/desktop-entry.js +73 -0
  53. package/dist/deploy/freedesktop/desktop-entry.js.map +1 -0
  54. package/dist/deploy/freedesktop/ini.d.ts +7 -0
  55. package/dist/deploy/freedesktop/ini.d.ts.map +1 -0
  56. package/dist/deploy/freedesktop/ini.js +22 -0
  57. package/dist/deploy/freedesktop/ini.js.map +1 -0
  58. package/dist/deploy/freedesktop/metainfo-sections.d.ts +13 -0
  59. package/dist/deploy/freedesktop/metainfo-sections.d.ts.map +1 -0
  60. package/dist/deploy/freedesktop/metainfo-sections.js +73 -0
  61. package/dist/deploy/freedesktop/metainfo-sections.js.map +1 -0
  62. package/dist/deploy/freedesktop/metainfo.d.ts +4 -0
  63. package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -0
  64. package/dist/deploy/freedesktop/metainfo.js +29 -0
  65. package/dist/deploy/freedesktop/metainfo.js.map +1 -0
  66. package/dist/deploy/freedesktop/mime-package.d.ts +4 -0
  67. package/dist/deploy/freedesktop/mime-package.d.ts.map +1 -0
  68. package/dist/deploy/freedesktop/mime-package.js +16 -0
  69. package/dist/deploy/freedesktop/mime-package.js.map +1 -0
  70. package/dist/deploy/freedesktop/validate.d.ts +4 -0
  71. package/dist/deploy/freedesktop/validate.d.ts.map +1 -0
  72. package/dist/deploy/freedesktop/validate.js +81 -0
  73. package/dist/deploy/freedesktop/validate.js.map +1 -0
  74. package/dist/deploy/freedesktop/xml.d.ts +11 -0
  75. package/dist/deploy/freedesktop/xml.d.ts.map +1 -0
  76. package/dist/deploy/freedesktop/xml.js +33 -0
  77. package/dist/deploy/freedesktop/xml.js.map +1 -0
  78. package/dist/deploy/git.d.ts +4 -0
  79. package/dist/deploy/git.d.ts.map +1 -0
  80. package/dist/deploy/git.js +17 -0
  81. package/dist/deploy/git.js.map +1 -0
  82. package/dist/deploy/install-hints.d.ts +5 -0
  83. package/dist/deploy/install-hints.d.ts.map +1 -0
  84. package/dist/deploy/install-hints.js +85 -0
  85. package/dist/deploy/install-hints.js.map +1 -0
  86. package/dist/deploy/nfpm/config.d.ts +8 -0
  87. package/dist/deploy/nfpm/config.d.ts.map +1 -0
  88. package/dist/deploy/nfpm/config.js +119 -0
  89. package/dist/deploy/nfpm/config.js.map +1 -0
  90. package/dist/deploy/nfpm/contents.d.ts +12 -0
  91. package/dist/deploy/nfpm/contents.d.ts.map +1 -0
  92. package/dist/deploy/nfpm/contents.js +48 -0
  93. package/dist/deploy/nfpm/contents.js.map +1 -0
  94. package/dist/deploy/nfpm/description.d.ts +5 -0
  95. package/dist/deploy/nfpm/description.d.ts.map +1 -0
  96. package/dist/deploy/nfpm/description.js +5 -0
  97. package/dist/deploy/nfpm/description.js.map +1 -0
  98. package/dist/deploy/nfpm/optional.d.ts +5 -0
  99. package/dist/deploy/nfpm/optional.d.ts.map +1 -0
  100. package/dist/deploy/nfpm/optional.js +4 -0
  101. package/dist/deploy/nfpm/optional.js.map +1 -0
  102. package/dist/deploy/nfpm/pack.d.ts +5 -0
  103. package/dist/deploy/nfpm/pack.d.ts.map +1 -0
  104. package/dist/deploy/nfpm/pack.js +32 -0
  105. package/dist/deploy/nfpm/pack.js.map +1 -0
  106. package/dist/deploy/node-runtime/download.d.ts +3 -0
  107. package/dist/deploy/node-runtime/download.d.ts.map +1 -0
  108. package/dist/deploy/node-runtime/download.js +39 -0
  109. package/dist/deploy/node-runtime/download.js.map +1 -0
  110. package/dist/deploy/node-runtime/elf.d.ts +7 -0
  111. package/dist/deploy/node-runtime/elf.d.ts.map +1 -0
  112. package/dist/deploy/node-runtime/elf.js +100 -0
  113. package/dist/deploy/node-runtime/elf.js.map +1 -0
  114. package/dist/deploy/node-runtime/guard.d.ts +4 -0
  115. package/dist/deploy/node-runtime/guard.d.ts.map +1 -0
  116. package/dist/deploy/node-runtime/guard.js +22 -0
  117. package/dist/deploy/node-runtime/guard.js.map +1 -0
  118. package/dist/deploy/node-runtime/index.d.ts +4 -0
  119. package/dist/deploy/node-runtime/index.d.ts.map +1 -0
  120. package/dist/deploy/node-runtime/index.js +61 -0
  121. package/dist/deploy/node-runtime/index.js.map +1 -0
  122. package/dist/deploy/payload/copy-tree.d.ts +7 -0
  123. package/dist/deploy/payload/copy-tree.d.ts.map +1 -0
  124. package/dist/deploy/payload/copy-tree.js +36 -0
  125. package/dist/deploy/payload/copy-tree.js.map +1 -0
  126. package/dist/deploy/payload/icons.d.ts +6 -0
  127. package/dist/deploy/payload/icons.d.ts.map +1 -0
  128. package/dist/deploy/payload/icons.js +53 -0
  129. package/dist/deploy/payload/icons.js.map +1 -0
  130. package/dist/deploy/payload/launcher.d.ts +5 -0
  131. package/dist/deploy/payload/launcher.d.ts.map +1 -0
  132. package/dist/deploy/payload/launcher.js +22 -0
  133. package/dist/deploy/payload/launcher.js.map +1 -0
  134. package/dist/deploy/payload/schemas.d.ts +4 -0
  135. package/dist/deploy/payload/schemas.d.ts.map +1 -0
  136. package/dist/deploy/payload/schemas.js +17 -0
  137. package/dist/deploy/payload/schemas.js.map +1 -0
  138. package/dist/deploy/payload/stage.d.ts +15 -0
  139. package/dist/deploy/payload/stage.d.ts.map +1 -0
  140. package/dist/deploy/payload/stage.js +100 -0
  141. package/dist/deploy/payload/stage.js.map +1 -0
  142. package/dist/deploy/registry.d.ts +7 -0
  143. package/dist/deploy/registry.d.ts.map +1 -0
  144. package/dist/deploy/registry.js +30 -0
  145. package/dist/deploy/registry.js.map +1 -0
  146. package/dist/deploy/run-deploy.d.ts +11 -0
  147. package/dist/deploy/run-deploy.d.ts.map +1 -0
  148. package/dist/deploy/run-deploy.js +153 -0
  149. package/dist/deploy/run-deploy.js.map +1 -0
  150. package/dist/deploy/settings/arch.d.ts +4 -0
  151. package/dist/deploy/settings/arch.d.ts.map +1 -0
  152. package/dist/deploy/settings/arch.js +13 -0
  153. package/dist/deploy/settings/arch.js.map +1 -0
  154. package/dist/deploy/settings/categories.d.ts +4 -0
  155. package/dist/deploy/settings/categories.d.ts.map +1 -0
  156. package/dist/deploy/settings/categories.js +29 -0
  157. package/dist/deploy/settings/categories.js.map +1 -0
  158. package/dist/deploy/settings/exec.d.ts +6 -0
  159. package/dist/deploy/settings/exec.d.ts.map +1 -0
  160. package/dist/deploy/settings/exec.js +20 -0
  161. package/dist/deploy/settings/exec.js.map +1 -0
  162. package/dist/deploy/settings/identity.d.ts +18 -0
  163. package/dist/deploy/settings/identity.d.ts.map +1 -0
  164. package/dist/deploy/settings/identity.js +73 -0
  165. package/dist/deploy/settings/identity.js.map +1 -0
  166. package/dist/deploy/settings/index.d.ts +11 -0
  167. package/dist/deploy/settings/index.d.ts.map +1 -0
  168. package/dist/deploy/settings/index.js +103 -0
  169. package/dist/deploy/settings/index.js.map +1 -0
  170. package/dist/deploy/settings/package-manifest.d.ts +15 -0
  171. package/dist/deploy/settings/package-manifest.d.ts.map +1 -0
  172. package/dist/deploy/settings/package-manifest.js +41 -0
  173. package/dist/deploy/settings/package-manifest.js.map +1 -0
  174. package/dist/deploy/settings/paths.d.ts +9 -0
  175. package/dist/deploy/settings/paths.d.ts.map +1 -0
  176. package/dist/deploy/settings/paths.js +82 -0
  177. package/dist/deploy/settings/paths.js.map +1 -0
  178. package/dist/deploy/settings/screenshots.d.ts +8 -0
  179. package/dist/deploy/settings/screenshots.d.ts.map +1 -0
  180. package/dist/deploy/settings/screenshots.js +79 -0
  181. package/dist/deploy/settings/screenshots.js.map +1 -0
  182. package/dist/deploy/settings/starter.d.ts +4 -0
  183. package/dist/deploy/settings/starter.d.ts.map +1 -0
  184. package/dist/deploy/settings/starter.js +28 -0
  185. package/dist/deploy/settings/starter.js.map +1 -0
  186. package/dist/deploy/settings/version.d.ts +9 -0
  187. package/dist/deploy/settings/version.d.ts.map +1 -0
  188. package/dist/deploy/settings/version.js +37 -0
  189. package/dist/deploy/settings/version.js.map +1 -0
  190. package/dist/deploy/targets/appimage.d.ts +4 -0
  191. package/dist/deploy/targets/appimage.d.ts.map +1 -0
  192. package/dist/deploy/targets/appimage.js +105 -0
  193. package/dist/deploy/targets/appimage.js.map +1 -0
  194. package/dist/deploy/targets/deb.d.ts +4 -0
  195. package/dist/deploy/targets/deb.d.ts.map +1 -0
  196. package/dist/deploy/targets/deb.js +4 -0
  197. package/dist/deploy/targets/deb.js.map +1 -0
  198. package/dist/deploy/targets/flatpak-manifest.d.ts +6 -0
  199. package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -0
  200. package/dist/deploy/targets/flatpak-manifest.js +48 -0
  201. package/dist/deploy/targets/flatpak-manifest.js.map +1 -0
  202. package/dist/deploy/targets/flatpak-prebuilt.d.ts +8 -0
  203. package/dist/deploy/targets/flatpak-prebuilt.d.ts.map +1 -0
  204. package/dist/deploy/targets/flatpak-prebuilt.js +43 -0
  205. package/dist/deploy/targets/flatpak-prebuilt.js.map +1 -0
  206. package/dist/deploy/targets/flatpak-source.d.ts +5 -0
  207. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -0
  208. package/dist/deploy/targets/flatpak-source.js +110 -0
  209. package/dist/deploy/targets/flatpak-source.js.map +1 -0
  210. package/dist/deploy/targets/flatpak-sources.d.ts +17 -0
  211. package/dist/deploy/targets/flatpak-sources.d.ts.map +1 -0
  212. package/dist/deploy/targets/flatpak-sources.js +108 -0
  213. package/dist/deploy/targets/flatpak-sources.js.map +1 -0
  214. package/dist/deploy/targets/flatpak.d.ts +4 -0
  215. package/dist/deploy/targets/flatpak.d.ts.map +1 -0
  216. package/dist/deploy/targets/flatpak.js +112 -0
  217. package/dist/deploy/targets/flatpak.js.map +1 -0
  218. package/dist/deploy/targets/nfpm-target.d.ts +5 -0
  219. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -0
  220. package/dist/deploy/targets/nfpm-target.js +26 -0
  221. package/dist/deploy/targets/nfpm-target.js.map +1 -0
  222. package/dist/deploy/targets/rpm.d.ts +4 -0
  223. package/dist/deploy/targets/rpm.d.ts.map +1 -0
  224. package/dist/deploy/targets/rpm.js +4 -0
  225. package/dist/deploy/targets/rpm.js.map +1 -0
  226. package/dist/deploy/tools.d.ts +18 -0
  227. package/dist/deploy/tools.d.ts.map +1 -0
  228. package/dist/deploy/tools.js +92 -0
  229. package/dist/deploy/tools.js.map +1 -0
  230. package/dist/deploy/types.d.ts +140 -0
  231. package/dist/deploy/types.d.ts.map +1 -0
  232. package/dist/deploy/types.js +2 -0
  233. package/dist/deploy/types.js.map +1 -0
  234. package/dist/deploy/vendored/appimagetool.d.ts +7 -0
  235. package/dist/deploy/vendored/appimagetool.d.ts.map +1 -0
  236. package/dist/deploy/vendored/appimagetool.js +42 -0
  237. package/dist/deploy/vendored/appimagetool.js.map +1 -0
  238. package/dist/deploy/vendored/nfpm.d.ts +3 -0
  239. package/dist/deploy/vendored/nfpm.d.ts.map +1 -0
  240. package/dist/deploy/vendored/nfpm.js +60 -0
  241. package/dist/deploy/vendored/nfpm.js.map +1 -0
  242. package/dist/dev/change-queue.d.ts +11 -0
  243. package/dist/dev/change-queue.d.ts.map +1 -0
  244. package/dist/dev/change-queue.js +34 -0
  245. package/dist/dev/change-queue.js.map +1 -0
  246. package/dist/dev/failure-tracker.d.ts +10 -0
  247. package/dist/dev/failure-tracker.d.ts.map +1 -0
  248. package/dist/dev/failure-tracker.js +61 -0
  249. package/dist/dev/failure-tracker.js.map +1 -0
  250. package/dist/dev/missing-import.d.ts +4 -0
  251. package/dist/dev/missing-import.d.ts.map +1 -0
  252. package/dist/dev/missing-import.js +23 -0
  253. package/dist/dev/missing-import.js.map +1 -0
  254. package/dist/dev/runner-deps.d.ts.map +1 -1
  255. package/dist/dev/runner-deps.js +25 -6
  256. package/dist/dev/runner-deps.js.map +1 -1
  257. package/dist/dev/runner.d.ts +8 -4
  258. package/dist/dev/runner.d.ts.map +1 -1
  259. package/dist/dev/runner.js +334 -66
  260. package/dist/dev/runner.js.map +1 -1
  261. package/dist/dev/supervisor.d.ts +1 -2
  262. package/dist/dev/supervisor.d.ts.map +1 -1
  263. package/dist/dev/supervisor.js +1 -1
  264. package/dist/dev/supervisor.js.map +1 -1
  265. package/dist/dev/vite-dev-server.d.ts +13 -2
  266. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  267. package/dist/dev/vite-dev-server.js +30 -2
  268. package/dist/dev/vite-dev-server.js.map +1 -1
  269. package/dist/internal/entry-arg.d.ts +1 -7
  270. package/dist/internal/entry-arg.d.ts.map +1 -1
  271. package/dist/internal/entry-arg.js +18 -11
  272. package/dist/internal/entry-arg.js.map +1 -1
  273. package/dist/internal/module-loads.d.ts +7 -0
  274. package/dist/internal/module-loads.d.ts.map +1 -0
  275. package/dist/internal/module-loads.js +21 -0
  276. package/dist/internal/module-loads.js.map +1 -0
  277. package/dist/internal/prepare-project.d.ts +16 -0
  278. package/dist/internal/prepare-project.d.ts.map +1 -0
  279. package/dist/internal/prepare-project.js +15 -0
  280. package/dist/internal/prepare-project.js.map +1 -0
  281. package/dist/internal/run-cli-tool.d.ts +2 -1
  282. package/dist/internal/run-cli-tool.d.ts.map +1 -1
  283. package/dist/internal/run-cli-tool.js +15 -6
  284. package/dist/internal/run-cli-tool.js.map +1 -1
  285. package/dist/internal/staging-dir.d.ts +8 -1
  286. package/dist/internal/staging-dir.d.ts.map +1 -1
  287. package/dist/internal/staging-dir.js +38 -2
  288. package/dist/internal/staging-dir.js.map +1 -1
  289. package/dist/mcp/serialize-widget.d.ts +2 -1
  290. package/dist/mcp/serialize-widget.d.ts.map +1 -1
  291. package/dist/mcp/serialize-widget.js +1 -1
  292. package/dist/mcp/serialize-widget.js.map +1 -1
  293. package/dist/mcp/testing-loader.d.ts +5 -2
  294. package/dist/mcp/testing-loader.d.ts.map +1 -1
  295. package/dist/mcp/testing-loader.js +7 -3
  296. package/dist/mcp/testing-loader.js.map +1 -1
  297. package/dist/refresh-runtime.d.ts +2 -1
  298. package/dist/refresh-runtime.d.ts.map +1 -1
  299. package/dist/refresh-runtime.js +32 -2
  300. package/dist/refresh-runtime.js.map +1 -1
  301. package/dist/settings/schema.d.ts +1 -2
  302. package/dist/settings/schema.d.ts.map +1 -1
  303. package/dist/settings/schema.js +1 -1
  304. package/dist/settings/schema.js.map +1 -1
  305. package/dist/vite-plugins/asset-extensions.d.ts +2 -1
  306. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  307. package/dist/vite-plugins/asset-extensions.js +2 -1
  308. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  309. package/dist/vite-plugins/asset-imports.d.ts +4 -0
  310. package/dist/vite-plugins/asset-imports.d.ts.map +1 -0
  311. package/dist/vite-plugins/asset-imports.js +88 -0
  312. package/dist/vite-plugins/asset-imports.js.map +1 -0
  313. package/dist/vite-plugins/asset-specifier.d.ts +5 -0
  314. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -0
  315. package/dist/vite-plugins/asset-specifier.js +7 -0
  316. package/dist/vite-plugins/asset-specifier.js.map +1 -0
  317. package/dist/vite-plugins/esm-extension.d.ts +4 -0
  318. package/dist/vite-plugins/esm-extension.d.ts.map +1 -0
  319. package/dist/vite-plugins/esm-extension.js +4 -0
  320. package/dist/vite-plugins/esm-extension.js.map +1 -0
  321. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +1 -3
  322. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
  323. package/dist/vite-plugins/fast-refresh/swc-refresh.js +1 -1
  324. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
  325. package/dist/vite-plugins/index.d.ts.map +1 -1
  326. package/dist/vite-plugins/index.js +4 -0
  327. package/dist/vite-plugins/index.js.map +1 -1
  328. package/dist/vite-plugins/resource-shared.d.ts +2 -1
  329. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  330. package/dist/vite-plugins/resource-shared.js +2 -1
  331. package/dist/vite-plugins/resource-shared.js.map +1 -1
  332. package/dist/vite-plugins/resources.d.ts.map +1 -1
  333. package/dist/vite-plugins/resources.js +30 -29
  334. package/dist/vite-plugins/resources.js.map +1 -1
  335. package/dist/vite-plugins/self-contained.d.ts +4 -0
  336. package/dist/vite-plugins/self-contained.d.ts.map +1 -0
  337. package/dist/vite-plugins/self-contained.js +244 -0
  338. package/dist/vite-plugins/self-contained.js.map +1 -0
  339. package/dist/vite-plugins/settings.d.ts.map +1 -1
  340. package/dist/vite-plugins/settings.js +19 -40
  341. package/dist/vite-plugins/settings.js.map +1 -1
  342. package/dist/vite-plugins/store-links.d.ts +4 -0
  343. package/dist/vite-plugins/store-links.d.ts.map +1 -0
  344. package/dist/vite-plugins/store-links.js +19 -0
  345. package/dist/vite-plugins/store-links.js.map +1 -0
  346. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  347. package/dist/vite-plugins/undeclared-library.js +51 -12
  348. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  349. package/dist/vite-plugins/worker.d.ts.map +1 -1
  350. package/dist/vite-plugins/worker.js +3 -1
  351. package/dist/vite-plugins/worker.js.map +1 -1
  352. package/env.d.ts +106 -25
  353. package/package.json +20 -13
  354. package/src/builder.ts +22 -4
  355. package/src/cli.ts +7 -2
  356. package/src/codegen/freshness.ts +2 -2
  357. package/src/codegen/run-codegen.ts +37 -23
  358. package/src/codegen/store-resolver.ts +1 -1
  359. package/src/commands/build.ts +5 -6
  360. package/src/commands/codegen.ts +14 -1
  361. package/src/commands/deploy.ts +47 -0
  362. package/src/commands/dev.ts +4 -4
  363. package/src/commands/docs.ts +39 -4
  364. package/src/deploy/depends.ts +42 -0
  365. package/src/deploy/download.ts +148 -0
  366. package/src/deploy/freedesktop/copyright.ts +41 -0
  367. package/src/deploy/freedesktop/dbus-service.ts +19 -0
  368. package/src/deploy/freedesktop/desktop-entry.ts +102 -0
  369. package/src/deploy/freedesktop/ini.ts +39 -0
  370. package/src/deploy/freedesktop/metainfo-sections.ts +116 -0
  371. package/src/deploy/freedesktop/metainfo.ts +46 -0
  372. package/src/deploy/freedesktop/mime-package.ts +28 -0
  373. package/src/deploy/freedesktop/validate.ts +124 -0
  374. package/src/deploy/freedesktop/xml.ts +53 -0
  375. package/src/deploy/git.ts +20 -0
  376. package/src/deploy/install-hints.ts +108 -0
  377. package/src/deploy/nfpm/config.ts +153 -0
  378. package/src/deploy/nfpm/contents.ts +69 -0
  379. package/src/deploy/nfpm/description.ts +11 -0
  380. package/src/deploy/nfpm/optional.ts +8 -0
  381. package/src/deploy/nfpm/pack.ts +44 -0
  382. package/src/deploy/node-runtime/download.ts +48 -0
  383. package/src/deploy/node-runtime/elf.ts +145 -0
  384. package/src/deploy/node-runtime/guard.ts +29 -0
  385. package/src/deploy/node-runtime/index.ts +80 -0
  386. package/src/deploy/payload/copy-tree.ts +51 -0
  387. package/src/deploy/payload/icons.ts +80 -0
  388. package/src/deploy/payload/launcher.ts +27 -0
  389. package/src/deploy/payload/schemas.ts +27 -0
  390. package/src/deploy/payload/stage.ts +145 -0
  391. package/src/deploy/registry.ts +40 -0
  392. package/src/deploy/run-deploy.ts +235 -0
  393. package/src/deploy/settings/arch.ts +18 -0
  394. package/src/deploy/settings/categories.ts +39 -0
  395. package/src/deploy/settings/exec.ts +29 -0
  396. package/src/deploy/settings/identity.ts +133 -0
  397. package/src/deploy/settings/index.ts +189 -0
  398. package/src/deploy/settings/package-manifest.ts +66 -0
  399. package/src/deploy/settings/paths.ts +115 -0
  400. package/src/deploy/settings/screenshots.ts +125 -0
  401. package/src/deploy/settings/starter.ts +41 -0
  402. package/src/deploy/settings/version.ts +59 -0
  403. package/src/deploy/targets/appimage.ts +140 -0
  404. package/src/deploy/targets/deb.ts +6 -0
  405. package/src/deploy/targets/flatpak-manifest.ts +61 -0
  406. package/src/deploy/targets/flatpak-prebuilt.ts +59 -0
  407. package/src/deploy/targets/flatpak-source.ts +168 -0
  408. package/src/deploy/targets/flatpak-sources.ts +171 -0
  409. package/src/deploy/targets/flatpak.ts +143 -0
  410. package/src/deploy/targets/nfpm-target.ts +33 -0
  411. package/src/deploy/targets/rpm.ts +6 -0
  412. package/src/deploy/tools.ts +135 -0
  413. package/src/deploy/types.ts +174 -0
  414. package/src/deploy/vendored/appimagetool.ts +57 -0
  415. package/src/deploy/vendored/nfpm.ts +79 -0
  416. package/src/dev/change-queue.ts +59 -0
  417. package/src/dev/failure-tracker.ts +92 -0
  418. package/src/dev/missing-import.ts +32 -0
  419. package/src/dev/runner-deps.ts +34 -6
  420. package/src/dev/runner.ts +506 -102
  421. package/src/dev/supervisor.ts +0 -3
  422. package/src/dev/vite-dev-server.ts +54 -3
  423. package/src/internal/entry-arg.ts +25 -11
  424. package/src/internal/module-loads.ts +32 -0
  425. package/src/internal/prepare-project.ts +23 -0
  426. package/src/internal/run-cli-tool.ts +22 -6
  427. package/src/internal/staging-dir.ts +57 -2
  428. package/src/mcp/serialize-widget.ts +3 -2
  429. package/src/mcp/testing-loader.ts +19 -4
  430. package/src/refresh-runtime.ts +48 -2
  431. package/src/settings/schema.ts +0 -1
  432. package/src/vite-plugins/asset-extensions.ts +2 -1
  433. package/src/vite-plugins/asset-imports.ts +134 -0
  434. package/src/vite-plugins/asset-specifier.ts +9 -0
  435. package/src/vite-plugins/esm-extension.ts +4 -0
  436. package/src/vite-plugins/fast-refresh/swc-refresh.ts +1 -1
  437. package/src/vite-plugins/index.ts +4 -0
  438. package/src/vite-plugins/resource-shared.ts +2 -0
  439. package/src/vite-plugins/resources.ts +33 -33
  440. package/src/vite-plugins/self-contained.ts +352 -0
  441. package/src/vite-plugins/settings.ts +21 -48
  442. package/src/vite-plugins/store-links.ts +25 -0
  443. package/src/vite-plugins/undeclared-library.ts +74 -12
  444. package/src/vite-plugins/worker.ts +4 -1
  445. package/dist/internal.d.ts +0 -3
  446. package/dist/internal.d.ts.map +0 -1
  447. package/dist/internal.js +0 -3
  448. package/dist/internal.js.map +0 -1
  449. package/src/internal.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"runner-deps.d.ts","sourceRoot":"","sources":["../../src/dev/runner-deps.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAyBjD,QAAA,MAAM,oBAAoB,QAAO,aAiC/B,CAAC;AAEH,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"runner-deps.d.ts","sourceRoot":"","sources":["../../src/dev/runner-deps.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsCjD,QAAA,MAAM,oBAAoB,QAAO,aA8C/B,CAAC;AAEH,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -1,26 +1,33 @@
1
1
  import { loadConfig } from "@gtkx/config";
2
2
  import * as Gio from "@gtkx/gi/gio";
3
3
  import { quitApplication } from "@gtkx/runtime";
4
+ import { getApplicationInstance } from "@gtkx/runtime/internal";
4
5
  import { info, installGracefulShutdown } from "@gtkx/utils";
6
+ import { readFile } from "node:fs/promises";
5
7
  import { createServer } from "vite";
6
8
  import { startMcpClient, stopMcpClient } from "../mcp/index.js";
7
- import { setTestingModuleLoader } from "../mcp/testing-loader.js";
8
- import { isRefreshBoundary, performRefresh } from "../refresh-runtime.js";
9
+ import { mergeTestingModule, setTestingModuleLoader, } from "../mcp/testing-loader.js";
10
+ import { isRefreshBoundary, performRefresh, staleExportName } from "../refresh-runtime.js";
9
11
  import { gtkxFastRefresh } from "../vite-plugins/fast-refresh/swc-refresh.js";
10
12
  import { gtkxVitePlugins } from "../vite-plugins/index.js";
11
13
  import { gtkxReactDomPrebundle } from "../vite-plugins/react-dom-prebundle.js";
12
14
  const DEV_MODE = "development";
13
15
  const APPLICATION_POLL_INTERVAL_MS = 50;
14
16
  const currentApplicationId = () => Gio.Application.getDefault()?.applicationId ?? null;
15
- const waitForApplicationId = async (timeoutMs) => {
17
+ const currentApplicationInstance = () => {
18
+ const application = Gio.Application.getDefault();
19
+ return application === null ? "unregistered" : getApplicationInstance(application);
20
+ };
21
+ const waitForApplicationId = async (timeoutMs, shouldKeepWaiting) => {
16
22
  const deadline = Date.now() + timeoutMs;
17
23
  let applicationId = currentApplicationId();
18
- while (applicationId === null && Date.now() < deadline) {
24
+ while (applicationId === null && Date.now() < deadline && shouldKeepWaiting()) {
19
25
  await new Promise((resolve) => setTimeout(resolve, APPLICATION_POLL_INTERVAL_MS));
20
26
  applicationId = currentApplicationId();
21
27
  }
22
28
  return applicationId;
23
29
  };
30
+ const readFileRevision = (path) => readFile(path, "utf8");
24
31
  const defaultDevRunnerDeps = () => ({
25
32
  createServer,
26
33
  waitForApplicationId,
@@ -29,14 +36,24 @@ const defaultDevRunnerDeps = () => ({
29
36
  return loaded.config.applicationId;
30
37
  },
31
38
  startMcpClient: (applicationId, loadAppModule) => {
32
- setTestingModuleLoader(() => loadAppModule("@gtkx/testing"));
39
+ setTestingModuleLoader(async () => {
40
+ const [publicApi, internals] = await Promise.all([
41
+ loadAppModule("@gtkx/testing"),
42
+ loadAppModule("@gtkx/testing/internal"),
43
+ ]);
44
+ return mergeTestingModule(publicApi, internals);
45
+ });
33
46
  return startMcpClient(applicationId);
34
47
  },
35
48
  stopMcpClient,
36
49
  watchApplicationShutdown: (onShutdown) => {
37
50
  Gio.Application.getDefault()?.on("shutdown", onShutdown);
38
51
  },
39
- isApplicationRegistered: () => Gio.Application.getDefault()?.getIsRegistered() === true,
52
+ watchUncaughtErrors: (onUncaughtError) => {
53
+ process.on("uncaughtException", onUncaughtError);
54
+ process.on("unhandledRejection", onUncaughtError);
55
+ },
56
+ getApplicationInstance: currentApplicationInstance,
40
57
  installShutdownHandlers: (onSignal) => {
41
58
  installGracefulShutdown({ onSignal });
42
59
  },
@@ -48,6 +65,8 @@ const defaultDevRunnerDeps = () => ({
48
65
  },
49
66
  performRefresh,
50
67
  isRefreshBoundary,
68
+ staleExportName,
69
+ readFileRevision,
51
70
  plugins: () => [...gtkxVitePlugins(DEV_MODE), ...gtkxFastRefresh(), gtkxReactDomPrebundle()],
52
71
  log: info,
53
72
  exit: (code) => process.exit(code),
@@ -1 +1 @@
1
- {"version":3,"file":"runner-deps.js","sourceRoot":"","sources":["../../src/dev/runner-deps.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadConfig } from \"@gtkx/config\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport { quitApplication } from \"@gtkx/runtime\";\nimport { info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { createServer } from \"vite\";\nimport type { DevRunnerDeps } from \"./runner.js\";\nimport { startMcpClient, stopMcpClient } from \"../mcp/index.js\";\nimport { setTestingModuleLoader } from \"../mcp/testing-loader.js\";\nimport { isRefreshBoundary, performRefresh } from \"../refresh-runtime.js\";\nimport { gtkxFastRefresh } from \"../vite-plugins/fast-refresh/swc-refresh.js\";\nimport { gtkxVitePlugins } from \"../vite-plugins/index.js\";\nimport { gtkxReactDomPrebundle } from \"../vite-plugins/react-dom-prebundle.js\";\n\nconst DEV_MODE = \"development\";\nconst APPLICATION_POLL_INTERVAL_MS = 50;\n\nconst currentApplicationId = (): string | null => Gio.Application.getDefault()?.applicationId ?? null;\n\nconst waitForApplicationId = async (timeoutMs: number): Promise<string | null> => {\n const deadline = Date.now() + timeoutMs;\n let applicationId = currentApplicationId();\n\n while (applicationId === null && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, APPLICATION_POLL_INTERVAL_MS));\n applicationId = currentApplicationId();\n }\n\n return applicationId;\n};\n\nconst defaultDevRunnerDeps = (): DevRunnerDeps => ({\n createServer,\n waitForApplicationId,\n getConfiguredApplicationId: async (root: string) => {\n const loaded = await loadConfig(root, { mode: DEV_MODE });\n\n return loaded.config.applicationId;\n },\n startMcpClient: (applicationId, loadAppModule) => {\n setTestingModuleLoader(() => loadAppModule(\"@gtkx/testing\") as Promise<typeof import(\"@gtkx/testing\")>);\n\n return startMcpClient(applicationId);\n },\n stopMcpClient,\n watchApplicationShutdown: (onShutdown) => {\n Gio.Application.getDefault()?.on(\"shutdown\", onShutdown);\n },\n isApplicationRegistered: () => Gio.Application.getDefault()?.getIsRegistered() === true,\n installShutdownHandlers: (onSignal) => {\n installGracefulShutdown({ onSignal });\n },\n quitDefaultApplication: () => {\n const application = Gio.Application.getDefault();\n\n if (application) {\n quitApplication(application);\n }\n },\n performRefresh,\n isRefreshBoundary,\n plugins: () => [...gtkxVitePlugins(DEV_MODE), ...gtkxFastRefresh(), gtkxReactDomPrebundle()],\n log: info,\n exit: (code: number): never => process.exit(code),\n});\n\nexport { defaultDevRunnerDeps };\n"]}
1
+ {"version":3,"file":"runner-deps.js","sourceRoot":"","sources":["../../src/dev/runner-deps.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadConfig } from \"@gtkx/config\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport { quitApplication } from \"@gtkx/runtime\";\nimport { type ApplicationInstance, getApplicationInstance } from \"@gtkx/runtime/internal\";\nimport { info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { readFile } from \"node:fs/promises\";\nimport { createServer } from \"vite\";\nimport type { DevRunnerDeps } from \"./runner.js\";\nimport { startMcpClient, stopMcpClient } from \"../mcp/index.js\";\nimport {\n mergeTestingModule,\n setTestingModuleLoader,\n type TestingInternalModule,\n type TestingPublicModule,\n} from \"../mcp/testing-loader.js\";\nimport { isRefreshBoundary, performRefresh, staleExportName } from \"../refresh-runtime.js\";\nimport { gtkxFastRefresh } from \"../vite-plugins/fast-refresh/swc-refresh.js\";\nimport { gtkxVitePlugins } from \"../vite-plugins/index.js\";\nimport { gtkxReactDomPrebundle } from \"../vite-plugins/react-dom-prebundle.js\";\n\nconst DEV_MODE = \"development\";\nconst APPLICATION_POLL_INTERVAL_MS = 50;\n\nconst currentApplicationId = (): string | null => Gio.Application.getDefault()?.applicationId ?? null;\n\nconst currentApplicationInstance = (): ApplicationInstance => {\n const application = Gio.Application.getDefault();\n\n return application === null ? \"unregistered\" : getApplicationInstance(application);\n};\n\nconst waitForApplicationId = async (timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null> => {\n const deadline = Date.now() + timeoutMs;\n let applicationId = currentApplicationId();\n\n while (applicationId === null && Date.now() < deadline && shouldKeepWaiting()) {\n await new Promise((resolve) => setTimeout(resolve, APPLICATION_POLL_INTERVAL_MS));\n applicationId = currentApplicationId();\n }\n\n return applicationId;\n};\n\nconst readFileRevision = (path: string): Promise<string> => readFile(path, \"utf8\");\n\nconst defaultDevRunnerDeps = (): DevRunnerDeps => ({\n createServer,\n waitForApplicationId,\n getConfiguredApplicationId: async (root: string) => {\n const loaded = await loadConfig(root, { mode: DEV_MODE });\n\n return loaded.config.applicationId;\n },\n startMcpClient: (applicationId, loadAppModule) => {\n setTestingModuleLoader(async () => {\n const [publicApi, internals] = await Promise.all([\n loadAppModule(\"@gtkx/testing\") as Promise<TestingPublicModule>,\n loadAppModule(\"@gtkx/testing/internal\") as Promise<TestingInternalModule>,\n ]);\n\n return mergeTestingModule(publicApi, internals);\n });\n\n return startMcpClient(applicationId);\n },\n stopMcpClient,\n watchApplicationShutdown: (onShutdown) => {\n Gio.Application.getDefault()?.on(\"shutdown\", onShutdown);\n },\n watchUncaughtErrors: (onUncaughtError) => {\n process.on(\"uncaughtException\", onUncaughtError);\n process.on(\"unhandledRejection\", onUncaughtError);\n },\n getApplicationInstance: currentApplicationInstance,\n installShutdownHandlers: (onSignal) => {\n installGracefulShutdown({ onSignal });\n },\n quitDefaultApplication: () => {\n const application = Gio.Application.getDefault();\n\n if (application) {\n quitApplication(application);\n }\n },\n performRefresh,\n isRefreshBoundary,\n staleExportName,\n readFileRevision,\n plugins: () => [...gtkxVitePlugins(DEV_MODE), ...gtkxFastRefresh(), gtkxReactDomPrebundle()],\n log: info,\n exit: (code: number): never => process.exit(code),\n});\n\nexport { defaultDevRunnerDeps };\n"]}
@@ -1,17 +1,22 @@
1
+ import type { ApplicationInstance } from "@gtkx/runtime/internal";
1
2
  import type { InlineConfig, Plugin } from "vite";
2
3
  import { type DevServer } from "./vite-dev-server.js";
4
+ type LoadAppModule = (id: string) => Promise<Record<string, unknown>>;
3
5
  type DevRunnerDeps = {
4
6
  createServer(config: InlineConfig): Promise<DevServer>;
5
- waitForApplicationId(timeoutMs: number): Promise<string | null>;
7
+ waitForApplicationId(timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null>;
6
8
  getConfiguredApplicationId(root: string): Promise<string | undefined>;
7
- startMcpClient(applicationId: string, loadAppModule: (id: string) => Promise<Record<string, unknown>>): Promise<unknown>;
9
+ startMcpClient(applicationId: string, loadAppModule: LoadAppModule): Promise<unknown>;
8
10
  stopMcpClient(): void;
9
11
  watchApplicationShutdown(onShutdown: () => void): void;
10
- isApplicationRegistered(): boolean;
12
+ watchUncaughtErrors(onUncaughtError: (cause: unknown) => void): void;
13
+ getApplicationInstance(): ApplicationInstance;
11
14
  installShutdownHandlers(onSignal: () => void | Promise<void>): void;
12
15
  quitDefaultApplication(): void;
13
16
  performRefresh: () => void;
14
17
  isRefreshBoundary(module: Record<string, unknown>): boolean;
18
+ staleExportName(previous: Record<string, unknown>, current: Record<string, unknown>): string | null;
19
+ readFileRevision(path: string): Promise<string>;
15
20
  plugins(): Plugin[];
16
21
  log(message: string): void;
17
22
  exit(code: number): never;
@@ -20,6 +25,5 @@ type DevRunner = {
20
25
  run(entryPath: string): Promise<void>;
21
26
  };
22
27
  declare const createDevRunner: (deps: DevRunnerDeps) => DevRunner;
23
- export type { DevServer } from "./vite-dev-server.js";
24
28
  export { createDevRunner, type DevRunnerDeps };
25
29
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAIjD,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE7E,KAAK,aAAa,GAAG;IACjB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChE,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtE,cAAc,CACV,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAChE,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,aAAa,IAAI,IAAI,CAAC;IACtB,wBAAwB,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACvD,uBAAuB,IAAI,OAAO,CAAC;IACnC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,sBAAsB,IAAI,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC5D,OAAO,IAAI,MAAM,EAAE,CAAC;IACpB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CAC7B,CAAC;AAEF,KAAK,SAAS,GAAG;IACb,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,CAAC;AA0KF,QAAA,MAAM,eAAe,GAAI,MAAM,aAAa,KAAG,SAc7C,CAAC;AAEH,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQjD,OAAO,EAEH,KAAK,SAAS,EAIjB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,aAAa,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtE,KAAK,aAAa,GAAG;IACjB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClG,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtE,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,aAAa,IAAI,IAAI,CAAC;IACtB,wBAAwB,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACvD,mBAAmB,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,sBAAsB,IAAI,mBAAmB,CAAC;IAC9C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,sBAAsB,IAAI,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC5D,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,IAAI,MAAM,EAAE,CAAC;IACpB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CAC7B,CAAC;AAEF,KAAK,SAAS,GAAG;IACb,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,CAAC;AAijBF,QAAA,MAAM,eAAe,GAAI,MAAM,aAAa,KAAG,SAe7C,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,CAAC"}
@@ -1,36 +1,198 @@
1
- import { error } from "@gtkx/utils";
1
+ import { error, warn } from "@gtkx/utils";
2
+ import { loadModuleExclusively, withExclusiveLoad } from "../internal/module-loads.js";
3
+ import { createChangeQueue } from "./change-queue.js";
4
+ import { createFailureTracker } from "./failure-tracker.js";
5
+ import { isMissingImport, missingImportName } from "./missing-import.js";
2
6
  import { createRefreshTracker } from "./refresh-tracker.js";
3
7
  import { RESTART_EXIT_CODE } from "./supervisor.js";
4
- import { createDevServerConfig } from "./vite-dev-server.js";
8
+ import { createDevServerConfig, isServerConfigFile, } from "./vite-dev-server.js";
5
9
  const APPLICATION_MOUNT_TIMEOUT_MS = 10_000;
6
- const requestRestart = async (server, deps) => {
7
- deps.log("Full restart (process restart)");
8
- await server.close();
9
- return deps.exit(RESTART_EXIT_CODE);
10
+ const OWNED_ID_EXIT_CODE = 1;
11
+ const LOAD_ATTEMPT_LIMIT = 5;
12
+ const WATCH_EVENTS = ["add", "change", "unlink"];
13
+ const SKIP_REASON = `did not settle in ${String(LOAD_ATTEMPT_LIMIT)} attempts; save it again to patch the window.`;
14
+ const DROPPED_REFRESH = "Fast Refresh dropped";
15
+ const SAVE_ACTION = "File changed";
16
+ const RETRY_ACTION = "Retrying pending save";
17
+ const announceFailure = (server, cause) => {
18
+ if (cause instanceof Error) {
19
+ server.ssrFixStacktrace(cause);
20
+ }
21
+ error("Application error; keeping the dev server up. Fix the error and save again.", cause);
22
+ };
23
+ const parkSession = (session) => {
24
+ session.deps.log("Waiting for a change to restart the application...");
25
+ };
26
+ const requestRestart = async (session) => {
27
+ session.deps.log("Full restart (process restart)");
28
+ try {
29
+ await session.server.close();
30
+ }
31
+ catch (error_) {
32
+ error("Error closing server before the restart:", error_);
33
+ }
34
+ return session.deps.exit(RESTART_EXIT_CODE);
35
+ };
36
+ const requiresRestart = (session, module) => {
37
+ if (session.failure.isDown()) {
38
+ return true;
39
+ }
40
+ const loadedExports = module.ssrModule;
41
+ if (!loadedExports) {
42
+ return false;
43
+ }
44
+ return !session.deps.isRefreshBoundary(loadedExports);
45
+ };
46
+ const invalidateChangedModule = (session, module) => {
47
+ session.server.moduleGraph.invalidateModule(module);
48
+ for (const importer of module.importers) {
49
+ session.server.moduleGraph.invalidateModule(importer);
50
+ }
51
+ };
52
+ const isEvaluationCurrent = (session, changedPath, loadedExports) => {
53
+ const evaluated = session.server.moduleGraph.getModuleById(changedPath);
54
+ if (!evaluated?.ssrTransformResult) {
55
+ return false;
56
+ }
57
+ return evaluated.ssrModule === loadedExports;
10
58
  };
11
- const handleFileChange = async (server, deps, changedPath) => {
12
- const module = server.moduleGraph.getModuleById(changedPath);
59
+ const loadInvalidatedModule = (session, changedPath, module) => withExclusiveLoad(session.server, async () => {
60
+ const revision = await session.deps.readFileRevision(changedPath);
61
+ invalidateChangedModule(session, module);
62
+ const loadedExports = await session.server.ssrLoadModule(changedPath);
63
+ const settledRevision = await session.deps.readFileRevision(changedPath);
64
+ return {
65
+ loadedExports,
66
+ isSettled: settledRevision === revision && isEvaluationCurrent(session, changedPath, loadedExports),
67
+ };
68
+ });
69
+ const settleAttempt = async (session, changedPath, module) => {
70
+ const { loadedExports, isSettled } = await loadInvalidatedModule(session, changedPath, module);
71
+ if (isSettled) {
72
+ return { loadedExports, module };
73
+ }
74
+ return { loadedExports: null, module: session.server.moduleGraph.getModuleById(changedPath) ?? module };
75
+ };
76
+ const loadSettledExports = async (session, changedPath, changedModule) => {
77
+ let module = changedModule;
78
+ for (let round = 0; round < LOAD_ATTEMPT_LIMIT && !session.controller.isShuttingDown(); round++) {
79
+ const attempt = await settleAttempt(session, changedPath, module);
80
+ if (attempt.loadedExports) {
81
+ return attempt.loadedExports;
82
+ }
83
+ module = attempt.module;
84
+ }
85
+ return null;
86
+ };
87
+ const droppedExportName = (previous, current) => {
88
+ const kept = new Set(Object.keys(current));
89
+ for (const name of Object.keys(previous)) {
90
+ if (!kept.has(name)) {
91
+ return name;
92
+ }
93
+ }
94
+ return null;
95
+ };
96
+ const unpatchedExportReason = (session, previous, current) => {
97
+ if (!previous) {
98
+ return null;
99
+ }
100
+ const dropped = droppedExportName(previous, current);
101
+ if (dropped !== null) {
102
+ return `no longer exports ${dropped}, which its importers still hold`;
103
+ }
104
+ const stale = session.deps.staleExportName(previous, current);
105
+ if (stale === null) {
106
+ return null;
107
+ }
108
+ return `renamed the component it exports as ${stale}, which the window is still rendering`;
109
+ };
110
+ const refreshChangedModule = async (session, changedPath, changedModule, previous) => {
111
+ const loadedExports = await loadSettledExports(session, changedPath, changedModule);
112
+ if (session.controller.isShuttingDown()) {
113
+ return;
114
+ }
115
+ if (!loadedExports) {
116
+ warn(`Fast Refresh skipped: ${changedPath} ${SKIP_REASON}`);
117
+ return;
118
+ }
119
+ if (!session.deps.isRefreshBoundary(loadedExports)) {
120
+ await requestRestart(session);
121
+ return;
122
+ }
123
+ const unpatched = unpatchedExportReason(session, previous, loadedExports);
124
+ if (unpatched !== null) {
125
+ warn(`${DROPPED_REFRESH}: ${changedPath} ${unpatched}`);
126
+ await requestRestart(session);
127
+ return;
128
+ }
129
+ session.pendingSaves.delete(changedPath);
130
+ session.deps.log("Running Fast Refresh...");
131
+ session.deps.performRefresh();
132
+ session.deps.log("Fast Refresh complete");
133
+ };
134
+ const applyModuleChange = async (session, changedPath, action) => {
135
+ const module = session.server.moduleGraph.getModuleById(changedPath);
13
136
  if (!module) {
14
137
  return;
15
138
  }
16
- deps.log(`File changed: ${changedPath}`);
17
- const loadedExports = module.ssrModule;
18
- if (loadedExports && !deps.isRefreshBoundary(loadedExports)) {
19
- await requestRestart(server, deps);
139
+ session.deps.log(`${action}: ${changedPath}`);
140
+ if (requiresRestart(session, module)) {
141
+ await requestRestart(session);
20
142
  return;
21
143
  }
22
- server.moduleGraph.invalidateModule(module);
23
- for (const importer of module.importers) {
24
- server.moduleGraph.invalidateModule(importer);
144
+ await refreshChangedModule(session, changedPath, module, module.ssrModule ?? null);
145
+ };
146
+ const awaitMissingImport = (session, changedPath, cause) => {
147
+ const missingName = missingImportName(cause);
148
+ if (missingName === null) {
149
+ session.pendingSaves.delete(changedPath);
150
+ return;
151
+ }
152
+ session.pendingSaves.set(changedPath, missingName);
153
+ };
154
+ const applySave = async (session, changedPath, action) => {
155
+ try {
156
+ await applyModuleChange(session, changedPath, action);
25
157
  }
26
- const newMod = await server.ssrLoadModule(changedPath);
27
- if (deps.isRefreshBoundary(newMod)) {
28
- deps.log("Running Fast Refresh...");
29
- deps.performRefresh();
30
- deps.log("Fast Refresh complete");
158
+ catch (error_) {
159
+ if (session.controller.isShuttingDown()) {
160
+ return;
161
+ }
162
+ awaitMissingImport(session, changedPath, error_);
163
+ error("Hot reload failed:", error_);
164
+ }
165
+ };
166
+ const savesAwaiting = (session, createdPath) => [...session.pendingSaves]
167
+ .filter(([, missingName]) => isMissingImport(createdPath, missingName))
168
+ .map(([changedPath]) => changedPath);
169
+ const retryPendingSaves = async (session, waiting) => {
170
+ for (const changedPath of waiting) {
171
+ if (session.controller.isShuttingDown()) {
172
+ return;
173
+ }
174
+ session.pendingSaves.delete(changedPath);
175
+ await applySave(session, changedPath, RETRY_ACTION);
176
+ }
177
+ };
178
+ const handleFileCreate = async (session, createdPath) => {
179
+ const waiting = savesAwaiting(session, createdPath);
180
+ if (waiting.length === 0) {
31
181
  return;
32
182
  }
33
- await requestRestart(server, deps);
183
+ session.deps.log(`File created: ${createdPath}`);
184
+ if (session.failure.isDown()) {
185
+ await requestRestart(session);
186
+ return;
187
+ }
188
+ await retryPendingSaves(session, waiting);
189
+ };
190
+ const handleFileRemove = async (session, removedPath) => {
191
+ if (!session.server.moduleGraph.getModuleById(removedPath)) {
192
+ return;
193
+ }
194
+ session.deps.log(`File removed: ${removedPath}`);
195
+ await requestRestart(session);
34
196
  };
35
197
  const createShutdownController = (server, deps) => {
36
198
  let isShuttingDown = false;
@@ -47,82 +209,188 @@ const createShutdownController = (server, deps) => {
47
209
  },
48
210
  };
49
211
  };
50
- const reloadChangedFile = async (server, deps, changedPath) => {
51
- try {
52
- await handleFileChange(server, deps, changedPath);
212
+ const restartForServerConfig = async (session, changedPath) => {
213
+ session.deps.log(`Server config changed: ${changedPath}`);
214
+ await requestRestart(session);
215
+ };
216
+ const applyChange = async (session, change) => {
217
+ if (session.controller.isShuttingDown()) {
218
+ return;
53
219
  }
54
- catch (error_) {
55
- error("Hot reload failed:", error_);
220
+ if (isServerConfigFile(session.server.config, change.path)) {
221
+ await restartForServerConfig(session, change.path);
222
+ return;
56
223
  }
57
- };
58
- const onFileChange = (server, deps, controller) => (changedPath) => {
59
- if (controller.isShuttingDown()) {
224
+ if (change.event === "add") {
225
+ await handleFileCreate(session, change.path);
60
226
  return;
61
227
  }
62
- void reloadChangedFile(server, deps, changedPath);
228
+ if (change.event === "unlink") {
229
+ await handleFileRemove(session, change.path);
230
+ return;
231
+ }
232
+ await applySave(session, change.path, SAVE_ACTION);
233
+ };
234
+ const watchProjectFiles = (session) => {
235
+ const queue = createChangeQueue((change) => applyChange(session, change));
236
+ for (const event of WATCH_EVENTS) {
237
+ session.server.watcher.on(event, (path) => {
238
+ queue.enqueue({ event, path });
239
+ });
240
+ }
63
241
  };
64
- const onShutdownSignal = (deps, controller) => async () => {
65
- if (controller.isShuttingDown()) {
242
+ const onShutdownSignal = (session) => async () => {
243
+ if (session.controller.isShuttingDown()) {
66
244
  return;
67
245
  }
68
- deps.log("Received shutdown signal - stopping dev runner...");
69
- await controller.shutdown(() => {
70
- deps.quitDefaultApplication();
246
+ session.deps.log("Received shutdown signal - stopping dev runner...");
247
+ await session.controller.shutdown(() => {
248
+ session.deps.quitDefaultApplication();
71
249
  });
72
250
  };
73
- const closeAndExit = async (deps, controller, code = 0) => {
251
+ const closeAndExit = async (session, code = 0) => {
74
252
  try {
75
- await controller.shutdown(() => undefined);
253
+ await session.controller.shutdown(() => undefined);
76
254
  }
77
255
  catch (error_) {
78
256
  error("Error closing server:", error_);
79
- return deps.exit(1);
257
+ return session.deps.exit(1);
258
+ }
259
+ return session.deps.exit(code);
260
+ };
261
+ const isSessionInactive = (session) => {
262
+ if (session.controller.isShuttingDown()) {
263
+ return true;
264
+ }
265
+ if (!session.failure.isDown()) {
266
+ return false;
80
267
  }
81
- return deps.exit(code);
268
+ parkSession(session);
269
+ return true;
82
270
  };
83
- const onApplicationShutdown = (deps, refreshTracker, controller) => () => {
84
- if (controller.isShuttingDown()) {
271
+ const stopForApplicationQuit = (session) => {
272
+ session.deps.log("Application quit - stopping dev runner...");
273
+ return closeAndExit(session);
274
+ };
275
+ const settleUnmount = (session, wasRefreshing) => {
276
+ if (isSessionInactive(session)) {
277
+ return;
278
+ }
279
+ if (!wasRefreshing) {
280
+ void stopForApplicationQuit(session);
85
281
  return;
86
282
  }
87
- if (refreshTracker.isRefreshing()) {
88
- deps.log("Application unmounted during Fast Refresh - restarting dev runner...");
89
- return deps.exit(RESTART_EXIT_CODE);
283
+ session.deps.log("Application unmounted during Fast Refresh - restarting dev runner...");
284
+ session.deps.exit(RESTART_EXIT_CODE);
285
+ };
286
+ const handleApplicationShutdown = (session) => {
287
+ if (isSessionInactive(session)) {
288
+ return;
90
289
  }
91
- deps.log("Application quit - stopping dev runner...");
92
- void closeAndExit(deps, controller);
290
+ const wasRefreshing = session.refreshTracker.isRefreshing();
291
+ session.failure.settleUnmount(() => {
292
+ settleUnmount(session, wasRefreshing);
293
+ });
294
+ };
295
+ const onApplicationShutdown = (session) => () => {
296
+ handleApplicationShutdown(session);
93
297
  };
94
298
  const refusedExitCode = () => (process.exitCode === undefined ? 1 : Number(process.exitCode));
95
- const connectApplication = async (deps, server, liveApplicationId, tracked) => {
96
- deps.watchApplicationShutdown(onApplicationShutdown(deps, tracked.refreshTracker, tracked.controller));
299
+ const connectApplication = async (session, liveApplicationId) => {
300
+ const { deps, server } = session;
301
+ deps.watchApplicationShutdown(onApplicationShutdown(session));
97
302
  const applicationId = (await deps.getConfiguredApplicationId(process.cwd())) ?? liveApplicationId;
98
303
  deps.log(`Connected application ID: ${applicationId}`);
99
- await deps.startMcpClient(applicationId, (id) => server.ssrLoadModule(id));
304
+ await deps.startMcpClient(applicationId, (id) => loadModuleExclusively(server, id));
305
+ };
306
+ const stopForOwnedApplicationId = async (session, liveApplicationId) => {
307
+ session.deps.log(`Another process already owns ${liveApplicationId}, so this session can never show a window - ` +
308
+ "stopping dev runner. Quit that instance or change applicationId, then start gtkx dev again.");
309
+ await closeAndExit(session, OWNED_ID_EXIT_CODE);
310
+ };
311
+ const stopForStoppedApplication = async (session, instance) => {
312
+ if (session.failure.hasReported()) {
313
+ session.deps.log("Application stopped before the dev runner attached.");
314
+ session.failure.fail();
315
+ return;
316
+ }
317
+ if (instance === "shutDown") {
318
+ await stopForApplicationQuit(session);
319
+ return;
320
+ }
321
+ session.deps.log("Application refused its command line - stopping dev runner...");
322
+ await closeAndExit(session, refusedExitCode());
100
323
  };
101
- const attachApplication = async (deps, server, tracked) => {
102
- const liveApplicationId = await deps.waitForApplicationId(APPLICATION_MOUNT_TIMEOUT_MS);
324
+ const connectLiveApplication = async (session, liveApplicationId) => {
325
+ const instance = session.deps.getApplicationInstance();
326
+ if (instance === "primary") {
327
+ await connectApplication(session, liveApplicationId);
328
+ return;
329
+ }
330
+ if (instance === "remote") {
331
+ await stopForOwnedApplicationId(session, liveApplicationId);
332
+ return;
333
+ }
334
+ await stopForStoppedApplication(session, instance);
335
+ };
336
+ const attachApplication = async (session) => {
337
+ const { deps, failure } = session;
338
+ const liveApplicationId = await deps.waitForApplicationId(APPLICATION_MOUNT_TIMEOUT_MS, () => !failure.isDown());
339
+ if (failure.isDown()) {
340
+ return;
341
+ }
103
342
  if (liveApplicationId === null) {
104
343
  deps.log("Entry did not mount an application - MCP client not started.");
105
344
  return;
106
345
  }
107
- if (!deps.isApplicationRegistered()) {
108
- deps.log("Application refused its command line - stopping dev runner...");
109
- return closeAndExit(deps, tracked.controller, refusedExitCode());
346
+ await connectLiveApplication(session, liveApplicationId);
347
+ };
348
+ const loadEntry = async (session, entryPath) => {
349
+ session.deps.log(`Loading entry: ${entryPath}`);
350
+ try {
351
+ await loadModuleExclusively(session.server, entryPath);
352
+ }
353
+ catch (error_) {
354
+ awaitMissingImport(session, entryPath, error_);
355
+ session.failure.fail(error_);
356
+ }
357
+ };
358
+ const hasApplicationStopped = (instance) => instance === "shutDown" || instance === "unregistered";
359
+ const isApplicationLost = (session) => session.failure.hasReported() && hasApplicationStopped(session.deps.getApplicationInstance());
360
+ const announceReady = (session) => {
361
+ if (isApplicationLost(session)) {
362
+ session.failure.fail();
363
+ }
364
+ if (isSessionInactive(session)) {
365
+ return;
110
366
  }
111
- await connectApplication(deps, server, liveApplicationId, tracked);
367
+ session.deps.log("HMR enabled - watching for changes...");
368
+ };
369
+ const createSession = (server, deps) => {
370
+ const refreshTracker = createRefreshTracker(deps.performRefresh);
371
+ return {
372
+ server,
373
+ deps: { ...deps, performRefresh: refreshTracker.performRefresh },
374
+ controller: createShutdownController(server, deps),
375
+ refreshTracker,
376
+ failure: createFailureTracker((cause) => {
377
+ announceFailure(server, cause);
378
+ }, refreshTracker.isRefreshing),
379
+ pendingSaves: new Map(),
380
+ };
112
381
  };
113
382
  const createDevRunner = (deps) => ({
114
383
  async run(entryPath) {
115
- const root = process.cwd();
116
- const server = await deps.createServer(createDevServerConfig(root, deps.plugins()));
117
- const refreshTracker = createRefreshTracker(deps.performRefresh);
118
- const refreshTrackingDeps = { ...deps, performRefresh: refreshTracker.performRefresh };
119
- const controller = createShutdownController(server, deps);
120
- deps.installShutdownHandlers(onShutdownSignal(deps, controller));
121
- server.watcher.on("change", onFileChange(server, refreshTrackingDeps, controller));
122
- deps.log(`Loading entry: ${entryPath}`);
123
- await server.ssrLoadModule(entryPath);
124
- await attachApplication(deps, server, { refreshTracker, controller });
125
- deps.log("HMR enabled - watching for changes...");
384
+ const server = await deps.createServer(createDevServerConfig(process.cwd(), deps.plugins()));
385
+ const session = createSession(server, deps);
386
+ deps.installShutdownHandlers(onShutdownSignal(session));
387
+ deps.watchUncaughtErrors((cause) => {
388
+ session.failure.report(cause);
389
+ });
390
+ watchProjectFiles(session);
391
+ await loadEntry(session, entryPath);
392
+ await attachApplication(session);
393
+ announceReady(session);
126
394
  },
127
395
  });
128
396
  export { createDevRunner };