@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
package/src/dev/runner.ts CHANGED
@@ -1,23 +1,37 @@
1
+ import type { ApplicationInstance } from "@gtkx/runtime/internal";
1
2
  import type { InlineConfig, Plugin } from "vite";
2
- import { error } from "@gtkx/utils";
3
+ import { error, warn } from "@gtkx/utils";
4
+ import { loadModuleExclusively, withExclusiveLoad } from "../internal/module-loads.js";
5
+ import { createChangeQueue, type WatchedChange } from "./change-queue.js";
6
+ import { createFailureTracker, type FailureTracker } from "./failure-tracker.js";
7
+ import { isMissingImport, missingImportName } from "./missing-import.js";
3
8
  import { createRefreshTracker, type RefreshTracker } from "./refresh-tracker.js";
4
9
  import { RESTART_EXIT_CODE } from "./supervisor.js";
5
- import { createDevServerConfig, type DevServer } from "./vite-dev-server.js";
10
+ import {
11
+ createDevServerConfig,
12
+ type DevServer,
13
+ type DevServerChangedModule,
14
+ type DevServerWatchEvent,
15
+ isServerConfigFile,
16
+ } from "./vite-dev-server.js";
17
+
18
+ type LoadAppModule = (id: string) => Promise<Record<string, unknown>>;
6
19
 
7
20
  type DevRunnerDeps = {
8
21
  createServer(config: InlineConfig): Promise<DevServer>;
9
- waitForApplicationId(timeoutMs: number): Promise<string | null>;
22
+ waitForApplicationId(timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null>;
10
23
  getConfiguredApplicationId(root: string): Promise<string | undefined>;
11
- startMcpClient(
12
- applicationId: string,
13
- loadAppModule: (id: string) => Promise<Record<string, unknown>>,
14
- ): Promise<unknown>;
24
+ startMcpClient(applicationId: string, loadAppModule: LoadAppModule): Promise<unknown>;
15
25
  stopMcpClient(): void;
16
26
  watchApplicationShutdown(onShutdown: () => void): void;
27
+ watchUncaughtErrors(onUncaughtError: (cause: unknown) => void): void;
28
+ getApplicationInstance(): ApplicationInstance;
17
29
  installShutdownHandlers(onSignal: () => void | Promise<void>): void;
18
30
  quitDefaultApplication(): void;
19
31
  performRefresh: () => void;
20
32
  isRefreshBoundary(module: Record<string, unknown>): boolean;
33
+ staleExportName(previous: Record<string, unknown>, current: Record<string, unknown>): string | null;
34
+ readFileRevision(path: string): Promise<string>;
21
35
  plugins(): Plugin[];
22
36
  log(message: string): void;
23
37
  exit(code: number): never;
@@ -32,48 +46,304 @@ type ShutdownController = {
32
46
  shutdown: (quitApplication: () => void) => Promise<void>;
33
47
  };
34
48
 
49
+ type DevSession = {
50
+ server: DevServer;
51
+ deps: DevRunnerDeps;
52
+ controller: ShutdownController;
53
+ refreshTracker: RefreshTracker;
54
+ failure: FailureTracker;
55
+ pendingSaves: Map<string, string>;
56
+ };
57
+
58
+ type SettledLoad = {
59
+ loadedExports: Record<string, unknown>;
60
+ isSettled: boolean;
61
+ };
62
+
63
+ type SettleAttempt = {
64
+ loadedExports: Record<string, unknown> | null;
65
+ module: DevServerChangedModule;
66
+ };
67
+
35
68
  const APPLICATION_MOUNT_TIMEOUT_MS = 10_000;
69
+ const OWNED_ID_EXIT_CODE = 1;
70
+ const LOAD_ATTEMPT_LIMIT = 5;
71
+ const WATCH_EVENTS: DevServerWatchEvent[] = ["add", "change", "unlink"];
72
+ const SKIP_REASON = `did not settle in ${String(LOAD_ATTEMPT_LIMIT)} attempts; save it again to patch the window.`;
73
+ const DROPPED_REFRESH = "Fast Refresh dropped";
74
+ const SAVE_ACTION = "File changed";
75
+ const RETRY_ACTION = "Retrying pending save";
76
+
77
+ const announceFailure = (server: DevServer, cause: unknown): void => {
78
+ if (cause instanceof Error) {
79
+ server.ssrFixStacktrace(cause);
80
+ }
81
+
82
+ error("Application error; keeping the dev server up. Fix the error and save again.", cause);
83
+ };
84
+
85
+ const parkSession = (session: DevSession): void => {
86
+ session.deps.log("Waiting for a change to restart the application...");
87
+ };
88
+
89
+ const requestRestart = async (session: DevSession): Promise<never> => {
90
+ session.deps.log("Full restart (process restart)");
91
+
92
+ try {
93
+ await session.server.close();
94
+ } catch (error_) {
95
+ error("Error closing server before the restart:", error_);
96
+ }
97
+
98
+ return session.deps.exit(RESTART_EXIT_CODE);
99
+ };
100
+
101
+ const requiresRestart = (session: DevSession, module: DevServerChangedModule): boolean => {
102
+ if (session.failure.isDown()) {
103
+ return true;
104
+ }
105
+
106
+ const loadedExports = module.ssrModule;
107
+
108
+ if (!loadedExports) {
109
+ return false;
110
+ }
111
+
112
+ return !session.deps.isRefreshBoundary(loadedExports);
113
+ };
114
+
115
+ const invalidateChangedModule = (session: DevSession, module: DevServerChangedModule): void => {
116
+ session.server.moduleGraph.invalidateModule(module);
117
+
118
+ for (const importer of module.importers) {
119
+ session.server.moduleGraph.invalidateModule(importer);
120
+ }
121
+ };
122
+
123
+ const isEvaluationCurrent = (
124
+ session: DevSession,
125
+ changedPath: string,
126
+ loadedExports: Record<string, unknown>,
127
+ ): boolean => {
128
+ const evaluated = session.server.moduleGraph.getModuleById(changedPath);
129
+
130
+ if (!evaluated?.ssrTransformResult) {
131
+ return false;
132
+ }
133
+
134
+ return evaluated.ssrModule === loadedExports;
135
+ };
136
+
137
+ const loadInvalidatedModule = (
138
+ session: DevSession,
139
+ changedPath: string,
140
+ module: DevServerChangedModule,
141
+ ): Promise<SettledLoad> =>
142
+ withExclusiveLoad(session.server, async () => {
143
+ const revision = await session.deps.readFileRevision(changedPath);
144
+ invalidateChangedModule(session, module);
145
+ const loadedExports = await session.server.ssrLoadModule(changedPath);
146
+ const settledRevision = await session.deps.readFileRevision(changedPath);
147
+
148
+ return {
149
+ loadedExports,
150
+ isSettled: settledRevision === revision && isEvaluationCurrent(session, changedPath, loadedExports),
151
+ };
152
+ });
153
+
154
+ const settleAttempt = async (
155
+ session: DevSession,
156
+ changedPath: string,
157
+ module: DevServerChangedModule,
158
+ ): Promise<SettleAttempt> => {
159
+ const { loadedExports, isSettled } = await loadInvalidatedModule(session, changedPath, module);
160
+
161
+ if (isSettled) {
162
+ return { loadedExports, module };
163
+ }
164
+
165
+ return { loadedExports: null, module: session.server.moduleGraph.getModuleById(changedPath) ?? module };
166
+ };
167
+
168
+ const loadSettledExports = async (
169
+ session: DevSession,
170
+ changedPath: string,
171
+ changedModule: DevServerChangedModule,
172
+ ): Promise<Record<string, unknown> | null> => {
173
+ let module = changedModule;
174
+
175
+ for (let round = 0; round < LOAD_ATTEMPT_LIMIT && !session.controller.isShuttingDown(); round++) {
176
+ const attempt = await settleAttempt(session, changedPath, module);
177
+
178
+ if (attempt.loadedExports) {
179
+ return attempt.loadedExports;
180
+ }
181
+
182
+ module = attempt.module;
183
+ }
184
+
185
+ return null;
186
+ };
187
+
188
+ const droppedExportName = (previous: Record<string, unknown>, current: Record<string, unknown>): string | null => {
189
+ const kept = new Set(Object.keys(current));
190
+
191
+ for (const name of Object.keys(previous)) {
192
+ if (!kept.has(name)) {
193
+ return name;
194
+ }
195
+ }
196
+
197
+ return null;
198
+ };
36
199
 
37
- const requestRestart = async (server: DevServer, deps: DevRunnerDeps): Promise<never> => {
38
- deps.log("Full restart (process restart)");
39
- await server.close();
200
+ const unpatchedExportReason = (
201
+ session: DevSession,
202
+ previous: Record<string, unknown> | null,
203
+ current: Record<string, unknown>,
204
+ ): string | null => {
205
+ if (!previous) {
206
+ return null;
207
+ }
208
+
209
+ const dropped = droppedExportName(previous, current);
210
+
211
+ if (dropped !== null) {
212
+ return `no longer exports ${dropped}, which its importers still hold`;
213
+ }
40
214
 
41
- return deps.exit(RESTART_EXIT_CODE);
215
+ const stale = session.deps.staleExportName(previous, current);
216
+
217
+ if (stale === null) {
218
+ return null;
219
+ }
220
+
221
+ return `renamed the component it exports as ${stale}, which the window is still rendering`;
42
222
  };
43
223
 
44
- const handleFileChange = async (server: DevServer, deps: DevRunnerDeps, changedPath: string): Promise<void> => {
45
- const module = server.moduleGraph.getModuleById(changedPath);
224
+ const refreshChangedModule = async (
225
+ session: DevSession,
226
+ changedPath: string,
227
+ changedModule: DevServerChangedModule,
228
+ previous: Record<string, unknown> | null,
229
+ ): Promise<void> => {
230
+ const loadedExports = await loadSettledExports(session, changedPath, changedModule);
231
+
232
+ if (session.controller.isShuttingDown()) {
233
+ return;
234
+ }
235
+
236
+ if (!loadedExports) {
237
+ warn(`Fast Refresh skipped: ${changedPath} ${SKIP_REASON}`);
238
+
239
+ return;
240
+ }
241
+
242
+ if (!session.deps.isRefreshBoundary(loadedExports)) {
243
+ await requestRestart(session);
244
+
245
+ return;
246
+ }
247
+
248
+ const unpatched = unpatchedExportReason(session, previous, loadedExports);
249
+
250
+ if (unpatched !== null) {
251
+ warn(`${DROPPED_REFRESH}: ${changedPath} ${unpatched}`);
252
+ await requestRestart(session);
253
+
254
+ return;
255
+ }
256
+
257
+ session.pendingSaves.delete(changedPath);
258
+ session.deps.log("Running Fast Refresh...");
259
+ session.deps.performRefresh();
260
+ session.deps.log("Fast Refresh complete");
261
+ };
262
+
263
+ const applyModuleChange = async (session: DevSession, changedPath: string, action: string): Promise<void> => {
264
+ const module = session.server.moduleGraph.getModuleById(changedPath);
46
265
 
47
266
  if (!module) {
48
267
  return;
49
268
  }
50
269
 
51
- deps.log(`File changed: ${changedPath}`);
52
- const loadedExports = module.ssrModule;
270
+ session.deps.log(`${action}: ${changedPath}`);
53
271
 
54
- if (loadedExports && !deps.isRefreshBoundary(loadedExports)) {
55
- await requestRestart(server, deps);
272
+ if (requiresRestart(session, module)) {
273
+ await requestRestart(session);
56
274
 
57
275
  return;
58
276
  }
59
277
 
60
- server.moduleGraph.invalidateModule(module);
278
+ await refreshChangedModule(session, changedPath, module, module.ssrModule ?? null);
279
+ };
61
280
 
62
- for (const importer of module.importers) {
63
- server.moduleGraph.invalidateModule(importer);
281
+ const awaitMissingImport = (session: DevSession, changedPath: string, cause: unknown): void => {
282
+ const missingName = missingImportName(cause);
283
+
284
+ if (missingName === null) {
285
+ session.pendingSaves.delete(changedPath);
286
+
287
+ return;
64
288
  }
65
289
 
66
- const newMod = await server.ssrLoadModule(changedPath);
290
+ session.pendingSaves.set(changedPath, missingName);
291
+ };
67
292
 
68
- if (deps.isRefreshBoundary(newMod)) {
69
- deps.log("Running Fast Refresh...");
70
- deps.performRefresh();
71
- deps.log("Fast Refresh complete");
293
+ const applySave = async (session: DevSession, changedPath: string, action: string): Promise<void> => {
294
+ try {
295
+ await applyModuleChange(session, changedPath, action);
296
+ } catch (error_) {
297
+ if (session.controller.isShuttingDown()) {
298
+ return;
299
+ }
300
+
301
+ awaitMissingImport(session, changedPath, error_);
302
+ error("Hot reload failed:", error_);
303
+ }
304
+ };
305
+
306
+ const savesAwaiting = (session: DevSession, createdPath: string): string[] =>
307
+ [...session.pendingSaves]
308
+ .filter(([, missingName]) => isMissingImport(createdPath, missingName))
309
+ .map(([changedPath]) => changedPath);
310
+
311
+ const retryPendingSaves = async (session: DevSession, waiting: string[]): Promise<void> => {
312
+ for (const changedPath of waiting) {
313
+ if (session.controller.isShuttingDown()) {
314
+ return;
315
+ }
316
+
317
+ session.pendingSaves.delete(changedPath);
318
+ await applySave(session, changedPath, RETRY_ACTION);
319
+ }
320
+ };
321
+
322
+ const handleFileCreate = async (session: DevSession, createdPath: string): Promise<void> => {
323
+ const waiting = savesAwaiting(session, createdPath);
324
+
325
+ if (waiting.length === 0) {
326
+ return;
327
+ }
328
+
329
+ session.deps.log(`File created: ${createdPath}`);
330
+
331
+ if (session.failure.isDown()) {
332
+ await requestRestart(session);
72
333
 
73
334
  return;
74
335
  }
75
336
 
76
- await requestRestart(server, deps);
337
+ await retryPendingSaves(session, waiting);
338
+ };
339
+
340
+ const handleFileRemove = async (session: DevSession, removedPath: string): Promise<void> => {
341
+ if (!session.server.moduleGraph.getModuleById(removedPath)) {
342
+ return;
343
+ }
344
+
345
+ session.deps.log(`File removed: ${removedPath}`);
346
+ await requestRestart(session);
77
347
  };
78
348
 
79
349
  const createShutdownController = (server: DevServer, deps: DevRunnerDeps): ShutdownController => {
@@ -94,92 +364,257 @@ const createShutdownController = (server: DevServer, deps: DevRunnerDeps): Shutd
94
364
  };
95
365
  };
96
366
 
97
- const reloadChangedFile = async (server: DevServer, deps: DevRunnerDeps, changedPath: string): Promise<void> => {
98
- try {
99
- await handleFileChange(server, deps, changedPath);
100
- } catch (error_) {
101
- error("Hot reload failed:", error_);
367
+ const restartForServerConfig = async (session: DevSession, changedPath: string): Promise<void> => {
368
+ session.deps.log(`Server config changed: ${changedPath}`);
369
+ await requestRestart(session);
370
+ };
371
+
372
+ const applyChange = async (session: DevSession, change: WatchedChange): Promise<void> => {
373
+ if (session.controller.isShuttingDown()) {
374
+ return;
102
375
  }
376
+
377
+ if (isServerConfigFile(session.server.config, change.path)) {
378
+ await restartForServerConfig(session, change.path);
379
+
380
+ return;
381
+ }
382
+
383
+ if (change.event === "add") {
384
+ await handleFileCreate(session, change.path);
385
+
386
+ return;
387
+ }
388
+
389
+ if (change.event === "unlink") {
390
+ await handleFileRemove(session, change.path);
391
+
392
+ return;
393
+ }
394
+
395
+ await applySave(session, change.path, SAVE_ACTION);
103
396
  };
104
397
 
105
- const onFileChange =
106
- (server: DevServer, deps: DevRunnerDeps, controller: ShutdownController): ((changedPath: string) => void) =>
107
- (changedPath) => {
108
- if (controller.isShuttingDown()) {
109
- return;
110
- }
398
+ const watchProjectFiles = (session: DevSession): void => {
399
+ const queue = createChangeQueue((change) => applyChange(session, change));
111
400
 
112
- void reloadChangedFile(server, deps, changedPath);
113
- };
401
+ for (const event of WATCH_EVENTS) {
402
+ session.server.watcher.on(event, (path) => {
403
+ queue.enqueue({ event, path });
404
+ });
405
+ }
406
+ };
114
407
 
115
- const onShutdownSignal =
116
- (deps: DevRunnerDeps, controller: ShutdownController): (() => Promise<void>) =>
117
- async () => {
118
- if (controller.isShuttingDown()) {
119
- return;
120
- }
408
+ const onShutdownSignal = (session: DevSession): (() => Promise<void>) => async () => {
409
+ if (session.controller.isShuttingDown()) {
410
+ return;
411
+ }
121
412
 
122
- deps.log("Received shutdown signal - stopping dev runner...");
413
+ session.deps.log("Received shutdown signal - stopping dev runner...");
123
414
 
124
- await controller.shutdown(() => {
125
- deps.quitDefaultApplication();
126
- });
127
- };
415
+ await session.controller.shutdown(() => {
416
+ session.deps.quitDefaultApplication();
417
+ });
418
+ };
128
419
 
129
- const closeAndExit = async (deps: DevRunnerDeps, controller: ShutdownController): Promise<never> => {
420
+ const closeAndExit = async (session: DevSession, code = 0): Promise<never> => {
130
421
  try {
131
- await controller.shutdown((): void => undefined);
422
+ await session.controller.shutdown((): void => undefined);
132
423
  } catch (error_) {
133
424
  error("Error closing server:", error_);
134
425
 
135
- return deps.exit(1);
426
+ return session.deps.exit(1);
136
427
  }
137
428
 
138
- return deps.exit(0);
429
+ return session.deps.exit(code);
139
430
  };
140
431
 
141
- const onApplicationShutdown =
142
- (deps: DevRunnerDeps, refreshTracker: RefreshTracker, controller: ShutdownController): (() => void) =>
143
- () => {
144
- if (controller.isShuttingDown()) {
145
- return;
146
- }
432
+ const isSessionInactive = (session: DevSession): boolean => {
433
+ if (session.controller.isShuttingDown()) {
434
+ return true;
435
+ }
436
+
437
+ if (!session.failure.isDown()) {
438
+ return false;
439
+ }
147
440
 
148
- if (refreshTracker.isRefreshing()) {
149
- deps.log("Application unmounted during Fast Refresh - restarting dev runner...");
441
+ parkSession(session);
150
442
 
151
- return deps.exit(RESTART_EXIT_CODE);
152
- }
443
+ return true;
444
+ };
153
445
 
154
- deps.log("Application quit - stopping dev runner...");
155
- void closeAndExit(deps, controller);
156
- };
446
+ const stopForApplicationQuit = (session: DevSession): Promise<never> => {
447
+ session.deps.log("Application quit - stopping dev runner...");
448
+
449
+ return closeAndExit(session);
450
+ };
451
+
452
+ const settleUnmount = (session: DevSession, wasRefreshing: boolean): void => {
453
+ if (isSessionInactive(session)) {
454
+ return;
455
+ }
456
+
457
+ if (!wasRefreshing) {
458
+ void stopForApplicationQuit(session);
459
+
460
+ return;
461
+ }
462
+
463
+ session.deps.log("Application unmounted during Fast Refresh - restarting dev runner...");
464
+ session.deps.exit(RESTART_EXIT_CODE);
465
+ };
466
+
467
+ const handleApplicationShutdown = (session: DevSession): void => {
468
+ if (isSessionInactive(session)) {
469
+ return;
470
+ }
471
+
472
+ const wasRefreshing = session.refreshTracker.isRefreshing();
473
+
474
+ session.failure.settleUnmount(() => {
475
+ settleUnmount(session, wasRefreshing);
476
+ });
477
+ };
478
+
479
+ const onApplicationShutdown = (session: DevSession): (() => void) => () => {
480
+ handleApplicationShutdown(session);
481
+ };
482
+
483
+ const refusedExitCode = (): number => (process.exitCode === undefined ? 1 : Number(process.exitCode));
484
+
485
+ const connectApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {
486
+ const { deps, server } = session;
487
+ deps.watchApplicationShutdown(onApplicationShutdown(session));
488
+ const applicationId = (await deps.getConfiguredApplicationId(process.cwd())) ?? liveApplicationId;
489
+ deps.log(`Connected application ID: ${applicationId}`);
490
+ await deps.startMcpClient(applicationId, (id) => loadModuleExclusively(server, id));
491
+ };
492
+
493
+ const stopForOwnedApplicationId = async (session: DevSession, liveApplicationId: string): Promise<void> => {
494
+ session.deps.log(
495
+ `Another process already owns ${liveApplicationId}, so this session can never show a window - ` +
496
+ "stopping dev runner. Quit that instance or change applicationId, then start gtkx dev again.",
497
+ );
498
+
499
+ await closeAndExit(session, OWNED_ID_EXIT_CODE);
500
+ };
501
+
502
+ const stopForStoppedApplication = async (session: DevSession, instance: ApplicationInstance): Promise<void> => {
503
+ if (session.failure.hasReported()) {
504
+ session.deps.log("Application stopped before the dev runner attached.");
505
+ session.failure.fail();
506
+
507
+ return;
508
+ }
509
+
510
+ if (instance === "shutDown") {
511
+ await stopForApplicationQuit(session);
512
+
513
+ return;
514
+ }
515
+
516
+ session.deps.log("Application refused its command line - stopping dev runner...");
517
+ await closeAndExit(session, refusedExitCode());
518
+ };
519
+
520
+ const connectLiveApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {
521
+ const instance = session.deps.getApplicationInstance();
522
+
523
+ if (instance === "primary") {
524
+ await connectApplication(session, liveApplicationId);
525
+
526
+ return;
527
+ }
528
+
529
+ if (instance === "remote") {
530
+ await stopForOwnedApplicationId(session, liveApplicationId);
531
+
532
+ return;
533
+ }
534
+
535
+ await stopForStoppedApplication(session, instance);
536
+ };
537
+
538
+ const attachApplication = async (session: DevSession): Promise<void> => {
539
+ const { deps, failure } = session;
540
+
541
+ const liveApplicationId = await deps.waitForApplicationId(
542
+ APPLICATION_MOUNT_TIMEOUT_MS,
543
+ () => !failure.isDown(),
544
+ );
545
+
546
+ if (failure.isDown()) {
547
+ return;
548
+ }
549
+
550
+ if (liveApplicationId === null) {
551
+ deps.log("Entry did not mount an application - MCP client not started.");
552
+
553
+ return;
554
+ }
555
+
556
+ await connectLiveApplication(session, liveApplicationId);
557
+ };
558
+
559
+ const loadEntry = async (session: DevSession, entryPath: string): Promise<void> => {
560
+ session.deps.log(`Loading entry: ${entryPath}`);
561
+
562
+ try {
563
+ await loadModuleExclusively(session.server, entryPath);
564
+ } catch (error_) {
565
+ awaitMissingImport(session, entryPath, error_);
566
+ session.failure.fail(error_);
567
+ }
568
+ };
569
+
570
+ const hasApplicationStopped = (instance: ApplicationInstance): boolean =>
571
+ instance === "shutDown" || instance === "unregistered";
572
+
573
+ const isApplicationLost = (session: DevSession): boolean =>
574
+ session.failure.hasReported() && hasApplicationStopped(session.deps.getApplicationInstance());
575
+
576
+ const announceReady = (session: DevSession): void => {
577
+ if (isApplicationLost(session)) {
578
+ session.failure.fail();
579
+ }
580
+
581
+ if (isSessionInactive(session)) {
582
+ return;
583
+ }
584
+
585
+ session.deps.log("HMR enabled - watching for changes...");
586
+ };
587
+
588
+ const createSession = (server: DevServer, deps: DevRunnerDeps): DevSession => {
589
+ const refreshTracker = createRefreshTracker(deps.performRefresh);
590
+
591
+ return {
592
+ server,
593
+ deps: { ...deps, performRefresh: refreshTracker.performRefresh },
594
+ controller: createShutdownController(server, deps),
595
+ refreshTracker,
596
+ failure: createFailureTracker((cause) => {
597
+ announceFailure(server, cause);
598
+ }, refreshTracker.isRefreshing),
599
+ pendingSaves: new Map(),
600
+ };
601
+ };
157
602
 
158
603
  const createDevRunner = (deps: DevRunnerDeps): DevRunner => ({
159
604
  async run(entryPath: string): Promise<void> {
160
- const root = process.cwd();
161
- const server = await deps.createServer(createDevServerConfig(root, deps.plugins()));
162
- const refreshTracker = createRefreshTracker(deps.performRefresh);
163
- const refreshTrackingDeps: DevRunnerDeps = { ...deps, performRefresh: refreshTracker.performRefresh };
164
- const controller = createShutdownController(server, deps);
165
- deps.installShutdownHandlers(onShutdownSignal(deps, controller));
166
- server.watcher.on("change", onFileChange(server, refreshTrackingDeps, controller));
167
- deps.log(`Loading entry: ${entryPath}`);
168
- await server.ssrLoadModule(entryPath);
169
- const liveApplicationId = await deps.waitForApplicationId(APPLICATION_MOUNT_TIMEOUT_MS);
170
-
171
- if (liveApplicationId) {
172
- deps.watchApplicationShutdown(onApplicationShutdown(deps, refreshTracker, controller));
173
- const applicationId = (await deps.getConfiguredApplicationId(root)) ?? liveApplicationId;
174
- deps.log(`Connected application ID: ${applicationId}`);
175
- await deps.startMcpClient(applicationId, (id) => server.ssrLoadModule(id));
176
- } else {
177
- deps.log("Entry did not mount an application - MCP client not started.");
178
- }
179
-
180
- deps.log("HMR enabled - watching for changes...");
605
+ const server = await deps.createServer(createDevServerConfig(process.cwd(), deps.plugins()));
606
+ const session = createSession(server, deps);
607
+ deps.installShutdownHandlers(onShutdownSignal(session));
608
+
609
+ deps.watchUncaughtErrors((cause) => {
610
+ session.failure.report(cause);
611
+ });
612
+
613
+ watchProjectFiles(session);
614
+ await loadEntry(session, entryPath);
615
+ await attachApplication(session);
616
+ announceReady(session);
181
617
  },
182
618
  });
183
619
 
184
- export type { DevServer } from "./vite-dev-server.js";
185
620
  export { createDevRunner, type DevRunnerDeps };