@gtkx/cli 1.0.0-rc.1 → 1.0.0-rc.2

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 (286) hide show
  1. package/dist/builder.d.ts +3 -2
  2. package/dist/builder.d.ts.map +1 -1
  3. package/dist/builder.js +2 -1
  4. package/dist/builder.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +21 -6
  8. package/dist/cli.js.map +1 -1
  9. package/dist/codegen/freshness.d.ts +5 -5
  10. package/dist/codegen/freshness.d.ts.map +1 -1
  11. package/dist/codegen/freshness.js +26 -23
  12. package/dist/codegen/freshness.js.map +1 -1
  13. package/dist/codegen/report.d.ts +2 -1
  14. package/dist/codegen/report.d.ts.map +1 -1
  15. package/dist/codegen/report.js +4 -2
  16. package/dist/codegen/report.js.map +1 -1
  17. package/dist/codegen/run-codegen.d.ts +8 -8
  18. package/dist/codegen/run-codegen.d.ts.map +1 -1
  19. package/dist/codegen/run-codegen.js +72 -43
  20. package/dist/codegen/run-codegen.js.map +1 -1
  21. package/dist/codegen/store-resolver.d.ts +8 -5
  22. package/dist/codegen/store-resolver.d.ts.map +1 -1
  23. package/dist/codegen/store-resolver.js +26 -6
  24. package/dist/codegen/store-resolver.js.map +1 -1
  25. package/dist/commands/build.d.ts +4 -3
  26. package/dist/commands/build.d.ts.map +1 -1
  27. package/dist/commands/build.js +2 -1
  28. package/dist/commands/build.js.map +1 -1
  29. package/dist/commands/codegen.d.ts +2 -1
  30. package/dist/commands/codegen.d.ts.map +1 -1
  31. package/dist/commands/codegen.js +6 -4
  32. package/dist/commands/codegen.js.map +1 -1
  33. package/dist/commands/dev.d.ts +2 -1
  34. package/dist/commands/dev.d.ts.map +1 -1
  35. package/dist/commands/dev.js +2 -1
  36. package/dist/commands/dev.js.map +1 -1
  37. package/dist/commands/docs.d.ts +2 -1
  38. package/dist/commands/docs.d.ts.map +1 -1
  39. package/dist/commands/docs.js +22 -7
  40. package/dist/commands/docs.js.map +1 -1
  41. package/dist/dev/icon-dir.d.ts +2 -1
  42. package/dist/dev/icon-dir.d.ts.map +1 -1
  43. package/dist/dev/icon-dir.js +6 -3
  44. package/dist/dev/icon-dir.js.map +1 -1
  45. package/dist/dev/refresh-tracker.d.ts +5 -4
  46. package/dist/dev/refresh-tracker.d.ts.map +1 -1
  47. package/dist/dev/refresh-tracker.js +6 -5
  48. package/dist/dev/refresh-tracker.js.map +1 -1
  49. package/dist/dev/runner-deps.d.ts +2 -1
  50. package/dist/dev/runner-deps.d.ts.map +1 -1
  51. package/dist/dev/runner-deps.js +20 -4
  52. package/dist/dev/runner-deps.js.map +1 -1
  53. package/dist/dev/runner-main.d.ts +2 -1
  54. package/dist/dev/runner-main.d.ts.map +1 -1
  55. package/dist/dev/runner-main.js +3 -2
  56. package/dist/dev/runner-main.js.map +1 -1
  57. package/dist/dev/runner.d.ts +6 -5
  58. package/dist/dev/runner.d.ts.map +1 -1
  59. package/dist/dev/runner.js +69 -38
  60. package/dist/dev/runner.js.map +1 -1
  61. package/dist/dev/schema-dir.d.ts +2 -1
  62. package/dist/dev/schema-dir.d.ts.map +1 -1
  63. package/dist/dev/schema-dir.js +4 -2
  64. package/dist/dev/schema-dir.js.map +1 -1
  65. package/dist/dev/supervisor.d.ts +7 -6
  66. package/dist/dev/supervisor.d.ts.map +1 -1
  67. package/dist/dev/supervisor.js +107 -67
  68. package/dist/dev/supervisor.js.map +1 -1
  69. package/dist/dev/vite-dev-server.d.ts +3 -3
  70. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  71. package/dist/dev/vite-dev-server.js +2 -1
  72. package/dist/dev/vite-dev-server.js.map +1 -1
  73. package/dist/internal/banner.d.ts +2 -1
  74. package/dist/internal/banner.d.ts.map +1 -1
  75. package/dist/internal/banner.js +2 -1
  76. package/dist/internal/banner.js.map +1 -1
  77. package/dist/internal/data-dir.d.ts +3 -2
  78. package/dist/internal/data-dir.d.ts.map +1 -1
  79. package/dist/internal/data-dir.js +29 -14
  80. package/dist/internal/data-dir.js.map +1 -1
  81. package/dist/internal/entry-arg.d.ts +5 -4
  82. package/dist/internal/entry-arg.d.ts.map +1 -1
  83. package/dist/internal/entry-arg.js +10 -7
  84. package/dist/internal/entry-arg.js.map +1 -1
  85. package/dist/internal/errors.d.ts +3 -2
  86. package/dist/internal/errors.d.ts.map +1 -1
  87. package/dist/internal/errors.js +7 -5
  88. package/dist/internal/errors.js.map +1 -1
  89. package/dist/internal/list-files.d.ts +3 -2
  90. package/dist/internal/list-files.d.ts.map +1 -1
  91. package/dist/internal/list-files.js +5 -3
  92. package/dist/internal/list-files.js.map +1 -1
  93. package/dist/internal/resolve-cli-tool.d.ts +2 -1
  94. package/dist/internal/resolve-cli-tool.d.ts.map +1 -1
  95. package/dist/internal/resolve-cli-tool.js +17 -10
  96. package/dist/internal/resolve-cli-tool.js.map +1 -1
  97. package/dist/internal/staging-dir.d.ts +3 -2
  98. package/dist/internal/staging-dir.d.ts.map +1 -1
  99. package/dist/internal/staging-dir.js +3 -2
  100. package/dist/internal/staging-dir.js.map +1 -1
  101. package/dist/internal/xdg-data-dirs.d.ts +2 -1
  102. package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
  103. package/dist/internal/xdg-data-dirs.js +4 -2
  104. package/dist/internal/xdg-data-dirs.js.map +1 -1
  105. package/dist/mcp/client.d.ts +9 -4
  106. package/dist/mcp/client.d.ts.map +1 -1
  107. package/dist/mcp/client.js +106 -81
  108. package/dist/mcp/client.js.map +1 -1
  109. package/dist/mcp/handlers.d.ts +3 -2
  110. package/dist/mcp/handlers.d.ts.map +1 -1
  111. package/dist/mcp/handlers.js +89 -61
  112. package/dist/mcp/handlers.js.map +1 -1
  113. package/dist/mcp/index.d.ts +2 -2
  114. package/dist/mcp/index.d.ts.map +1 -1
  115. package/dist/mcp/index.js +30 -13
  116. package/dist/mcp/index.js.map +1 -1
  117. package/dist/mcp/serialize-widget.d.ts +3 -3
  118. package/dist/mcp/serialize-widget.d.ts.map +1 -1
  119. package/dist/mcp/serialize-widget.js +9 -6
  120. package/dist/mcp/serialize-widget.js.map +1 -1
  121. package/dist/mcp/testing-loader.d.ts +3 -4
  122. package/dist/mcp/testing-loader.d.ts.map +1 -1
  123. package/dist/mcp/testing-loader.js +43 -21
  124. package/dist/mcp/testing-loader.js.map +1 -1
  125. package/dist/mcp/widget-registry.d.ts +3 -2
  126. package/dist/mcp/widget-registry.d.ts.map +1 -1
  127. package/dist/mcp/widget-registry.js +4 -3
  128. package/dist/mcp/widget-registry.js.map +1 -1
  129. package/dist/refresh-globals.d.ts +2 -0
  130. package/dist/refresh-globals.d.ts.map +1 -0
  131. package/dist/refresh-globals.js +8 -0
  132. package/dist/refresh-globals.js.map +1 -0
  133. package/dist/refresh-runtime.d.ts +5 -11
  134. package/dist/refresh-runtime.d.ts.map +1 -1
  135. package/dist/refresh-runtime.js +16 -14
  136. package/dist/refresh-runtime.js.map +1 -1
  137. package/dist/settings/compile.d.ts +2 -1
  138. package/dist/settings/compile.d.ts.map +1 -1
  139. package/dist/settings/compile.js +6 -4
  140. package/dist/settings/compile.js.map +1 -1
  141. package/dist/settings/parser.d.ts +6 -5
  142. package/dist/settings/parser.d.ts.map +1 -1
  143. package/dist/settings/parser.js +26 -22
  144. package/dist/settings/parser.js.map +1 -1
  145. package/dist/settings/render.d.ts +3 -2
  146. package/dist/settings/render.d.ts.map +1 -1
  147. package/dist/settings/render.js +38 -64
  148. package/dist/settings/render.js.map +1 -1
  149. package/dist/settings/schema.d.ts +8 -8
  150. package/dist/settings/schema.d.ts.map +1 -1
  151. package/dist/settings/schema.js +61 -43
  152. package/dist/settings/schema.js.map +1 -1
  153. package/dist/vite-plugins/asset-extensions.d.ts +4 -3
  154. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  155. package/dist/vite-plugins/asset-extensions.js +4 -3
  156. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  157. package/dist/vite-plugins/built-url.d.ts +2 -1
  158. package/dist/vite-plugins/built-url.d.ts.map +1 -1
  159. package/dist/vite-plugins/built-url.js +19 -13
  160. package/dist/vite-plugins/built-url.js.map +1 -1
  161. package/dist/vite-plugins/css.d.ts +2 -1
  162. package/dist/vite-plugins/css.d.ts.map +1 -1
  163. package/dist/vite-plugins/css.js +23 -15
  164. package/dist/vite-plugins/css.js.map +1 -1
  165. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +5 -4
  166. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -1
  167. package/dist/vite-plugins/fast-refresh/refresh-filter.js +11 -7
  168. package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -1
  169. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +4 -3
  170. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
  171. package/dist/vite-plugins/fast-refresh/swc-refresh.js +45 -41
  172. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
  173. package/dist/vite-plugins/icons.d.ts +2 -1
  174. package/dist/vite-plugins/icons.d.ts.map +1 -1
  175. package/dist/vite-plugins/icons.js +24 -20
  176. package/dist/vite-plugins/icons.js.map +1 -1
  177. package/dist/vite-plugins/index.d.ts +2 -1
  178. package/dist/vite-plugins/index.d.ts.map +1 -1
  179. package/dist/vite-plugins/index.js +3 -2
  180. package/dist/vite-plugins/index.js.map +1 -1
  181. package/dist/vite-plugins/native.d.ts +2 -1
  182. package/dist/vite-plugins/native.d.ts.map +1 -1
  183. package/dist/vite-plugins/native.js +6 -4
  184. package/dist/vite-plugins/native.js.map +1 -1
  185. package/dist/vite-plugins/react-compiler.d.ts +3 -2
  186. package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
  187. package/dist/vite-plugins/react-compiler.js +26 -20
  188. package/dist/vite-plugins/react-compiler.js.map +1 -1
  189. package/dist/vite-plugins/react-dom-prebundle.d.ts +2 -1
  190. package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -1
  191. package/dist/vite-plugins/react-dom-prebundle.js +2 -1
  192. package/dist/vite-plugins/react-dom-prebundle.js.map +1 -1
  193. package/dist/vite-plugins/resource-init-module.d.ts +2 -1
  194. package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
  195. package/dist/vite-plugins/resource-init-module.js +39 -38
  196. package/dist/vite-plugins/resource-init-module.js.map +1 -1
  197. package/dist/vite-plugins/resource-shared.d.ts +7 -5
  198. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  199. package/dist/vite-plugins/resource-shared.js +17 -10
  200. package/dist/vite-plugins/resource-shared.js.map +1 -1
  201. package/dist/vite-plugins/resources.d.ts +3 -2
  202. package/dist/vite-plugins/resources.d.ts.map +1 -1
  203. package/dist/vite-plugins/resources.js +94 -54
  204. package/dist/vite-plugins/resources.js.map +1 -1
  205. package/dist/vite-plugins/settings-worker-env.d.ts +2 -1
  206. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  207. package/dist/vite-plugins/settings-worker-env.js +4 -2
  208. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  209. package/dist/vite-plugins/settings.d.ts +2 -1
  210. package/dist/vite-plugins/settings.d.ts.map +1 -1
  211. package/dist/vite-plugins/settings.js +56 -32
  212. package/dist/vite-plugins/settings.js.map +1 -1
  213. package/dist/vite-plugins/strip-query.d.ts +3 -0
  214. package/dist/vite-plugins/strip-query.d.ts.map +1 -0
  215. package/dist/vite-plugins/strip-query.js +6 -0
  216. package/dist/vite-plugins/strip-query.js.map +1 -0
  217. package/dist/vite-plugins/undeclared-library.d.ts +2 -1
  218. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  219. package/dist/vite-plugins/undeclared-library.js +8 -5
  220. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  221. package/dist/vite-plugins/virtual-module.d.ts +2 -2
  222. package/dist/vite-plugins/virtual-module.d.ts.map +1 -1
  223. package/dist/vite-plugins/virtual-module.js +5 -3
  224. package/dist/vite-plugins/virtual-module.js.map +1 -1
  225. package/dist/vitest-plugin.d.ts.map +1 -1
  226. package/dist/vitest-plugin.js.map +1 -1
  227. package/env.d.ts +21 -61
  228. package/package.json +12 -14
  229. package/src/babel-modules.d.ts +0 -2
  230. package/src/builder.ts +7 -6
  231. package/src/cli.ts +26 -6
  232. package/src/codegen/freshness.ts +38 -25
  233. package/src/codegen/report.ts +10 -2
  234. package/src/codegen/run-codegen.ts +135 -60
  235. package/src/codegen/store-resolver.ts +56 -15
  236. package/src/commands/build.ts +3 -2
  237. package/src/commands/codegen.ts +9 -4
  238. package/src/commands/dev.ts +3 -4
  239. package/src/commands/docs.ts +36 -7
  240. package/src/dev/icon-dir.ts +13 -3
  241. package/src/dev/refresh-tracker.ts +12 -8
  242. package/src/dev/runner-deps.ts +30 -7
  243. package/src/dev/runner-main.ts +4 -3
  244. package/src/dev/runner.ts +100 -41
  245. package/src/dev/schema-dir.ts +7 -2
  246. package/src/dev/supervisor.ts +169 -71
  247. package/src/dev/vite-dev-server.ts +4 -2
  248. package/src/internal/banner.ts +5 -1
  249. package/src/internal/data-dir.ts +47 -16
  250. package/src/internal/entry-arg.ts +16 -8
  251. package/src/internal/errors.ts +15 -7
  252. package/src/internal/list-files.ts +10 -4
  253. package/src/internal/resolve-cli-tool.ts +28 -12
  254. package/src/internal/staging-dir.ts +5 -2
  255. package/src/internal/xdg-data-dirs.ts +8 -2
  256. package/src/mcp/client.ts +143 -85
  257. package/src/mcp/handlers.ts +126 -69
  258. package/src/mcp/index.ts +38 -14
  259. package/src/mcp/serialize-widget.ts +15 -8
  260. package/src/mcp/testing-loader.ts +64 -23
  261. package/src/mcp/widget-registry.ts +11 -5
  262. package/src/refresh-globals.ts +10 -0
  263. package/src/refresh-runtime.ts +20 -16
  264. package/src/settings/compile.ts +7 -4
  265. package/src/settings/parser.ts +69 -30
  266. package/src/settings/render.ts +66 -66
  267. package/src/settings/schema.ts +100 -46
  268. package/src/vite-plugins/asset-extensions.ts +4 -3
  269. package/src/vite-plugins/built-url.ts +30 -15
  270. package/src/vite-plugins/css.ts +35 -20
  271. package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -10
  272. package/src/vite-plugins/fast-refresh/swc-refresh.ts +60 -47
  273. package/src/vite-plugins/icons.ts +40 -24
  274. package/src/vite-plugins/index.ts +6 -3
  275. package/src/vite-plugins/native.ts +14 -5
  276. package/src/vite-plugins/react-compiler.ts +44 -30
  277. package/src/vite-plugins/react-dom-prebundle.ts +4 -1
  278. package/src/vite-plugins/resource-init-module.ts +41 -38
  279. package/src/vite-plugins/resource-shared.ts +27 -14
  280. package/src/vite-plugins/resources.ts +153 -59
  281. package/src/vite-plugins/settings-worker-env.ts +7 -2
  282. package/src/vite-plugins/settings.ts +107 -42
  283. package/src/vite-plugins/strip-query.ts +7 -0
  284. package/src/vite-plugins/undeclared-library.ts +21 -12
  285. package/src/vite-plugins/virtual-module.ts +9 -2
  286. package/src/vitest-plugin.ts +1 -2
@@ -1,16 +1,15 @@
1
1
  import type { InlineConfig, Plugin } from "vite";
2
2
  import { type DevServer } from "./vite-dev-server.js";
3
- export type { DevServer } from "./vite-dev-server.js";
4
- export type DevRunnerDeps = {
3
+ type DevRunnerDeps = {
5
4
  createServer(config: InlineConfig): Promise<DevServer>;
6
- getApplicationId(): string | null;
5
+ waitForApplicationId(timeoutMs: number): Promise<string | null>;
7
6
  getConfiguredApplicationId(root: string): Promise<string | undefined>;
8
7
  startMcpClient(applicationId: string, loadAppModule: (id: string) => Promise<Record<string, unknown>>): Promise<unknown>;
9
8
  stopMcpClient(): void;
10
9
  watchApplicationShutdown(onShutdown: () => void): void;
11
10
  installShutdownHandlers(onSignal: () => void | Promise<void>): void;
12
11
  quitDefaultApplication(): void;
13
- performRefresh(): void;
12
+ performRefresh: () => void;
14
13
  isRefreshBoundary(module: Record<string, unknown>): boolean;
15
14
  plugins(): Plugin[];
16
15
  log(message: string): void;
@@ -19,5 +18,7 @@ export type DevRunnerDeps = {
19
18
  type DevRunner = {
20
19
  run(entryPath: string): Promise<void>;
21
20
  };
22
- export declare const createDevRunner: (deps: DevRunnerDeps) => DevRunner;
21
+ declare const createDevRunner: (deps: DevRunnerDeps) => DevRunner;
22
+ export type { DevServer } from "./vite-dev-server.js";
23
+ export { createDevRunner, type DevRunnerDeps };
23
24
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGjD,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE7E,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG;IACxB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAAC;IAClC,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,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,sBAAsB,IAAI,IAAI,CAAC;IAC/B,cAAc,IAAI,IAAI,CAAC;IACvB,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;AAoCF,eAAO,MAAM,eAAe,SAAU,aAAa,KAAG,SA4DpD,CAAC"}
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,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;AAkIF,QAAA,MAAM,eAAe,GAAI,MAAM,aAAa,KAAG,SAwB7C,CAAC;AAEH,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,CAAC"}
@@ -2,6 +2,7 @@ import { error } from "@gtkx/utils";
2
2
  import { createRefreshTracker } from "./refresh-tracker.js";
3
3
  import { RESTART_EXIT_CODE } from "./supervisor.js";
4
4
  import { createDevServerConfig } from "./vite-dev-server.js";
5
+ const APPLICATION_MOUNT_TIMEOUT_MS = 10_000;
5
6
  const requestRestart = async (server, deps) => {
6
7
  deps.log("Full restart (process restart)");
7
8
  await server.close();
@@ -9,8 +10,9 @@ const requestRestart = async (server, deps) => {
9
10
  };
10
11
  const handleFileChange = async (server, deps, changedPath) => {
11
12
  const module = server.moduleGraph.getModuleById(changedPath);
12
- if (!module)
13
+ if (!module) {
13
14
  return;
15
+ }
14
16
  deps.log(`File changed: ${changedPath}`);
15
17
  const loadedExports = module.ssrModule;
16
18
  if (loadedExports && !deps.isRefreshBoundary(loadedExports)) {
@@ -30,51 +32,79 @@ const handleFileChange = async (server, deps, changedPath) => {
30
32
  }
31
33
  await requestRestart(server, deps);
32
34
  };
33
- export const createDevRunner = (deps) => ({
34
- async run(entryPath) {
35
- const root = process.cwd();
36
- const server = await deps.createServer(createDevServerConfig(root, deps.plugins()));
37
- const refreshTracker = createRefreshTracker(deps.performRefresh);
38
- const refreshTrackingDeps = { ...deps, performRefresh: refreshTracker.performRefresh };
39
- let isShuttingDown = false;
40
- const shutdown = async (quitApplication) => {
41
- if (isShuttingDown)
35
+ const createShutdownController = (server, deps) => {
36
+ let isShuttingDown = false;
37
+ return {
38
+ isShuttingDown: () => isShuttingDown,
39
+ shutdown: async (quitApplication) => {
40
+ if (isShuttingDown) {
42
41
  return;
42
+ }
43
43
  isShuttingDown = true;
44
44
  quitApplication();
45
45
  deps.stopMcpClient();
46
46
  await server.close();
47
- };
48
- deps.installShutdownHandlers(async () => {
49
- if (isShuttingDown)
50
- return;
51
- deps.log("Received shutdown signal - stopping dev runner...");
52
- await shutdown(() => deps.quitDefaultApplication());
53
- });
54
- server.watcher.on("change", (changedPath) => {
55
- if (isShuttingDown)
56
- return;
57
- handleFileChange(server, refreshTrackingDeps, changedPath).catch((cause) => {
58
- error("Hot reload failed:", cause);
59
- });
60
- });
47
+ },
48
+ };
49
+ };
50
+ const reloadChangedFile = async (server, deps, changedPath) => {
51
+ try {
52
+ await handleFileChange(server, deps, changedPath);
53
+ }
54
+ catch (error_) {
55
+ error("Hot reload failed:", error_);
56
+ }
57
+ };
58
+ const onFileChange = (server, deps, controller) => (changedPath) => {
59
+ if (controller.isShuttingDown()) {
60
+ return;
61
+ }
62
+ void reloadChangedFile(server, deps, changedPath);
63
+ };
64
+ const onShutdownSignal = (deps, controller) => async () => {
65
+ if (controller.isShuttingDown()) {
66
+ return;
67
+ }
68
+ deps.log("Received shutdown signal - stopping dev runner...");
69
+ await controller.shutdown(() => {
70
+ deps.quitDefaultApplication();
71
+ });
72
+ };
73
+ const closeAndExit = async (deps, controller) => {
74
+ try {
75
+ await controller.shutdown(() => undefined);
76
+ }
77
+ catch (error_) {
78
+ error("Error closing server:", error_);
79
+ return deps.exit(1);
80
+ }
81
+ return deps.exit(0);
82
+ };
83
+ const onApplicationShutdown = (deps, refreshTracker, controller) => () => {
84
+ if (controller.isShuttingDown()) {
85
+ return;
86
+ }
87
+ if (refreshTracker.isRefreshing()) {
88
+ deps.log("Application unmounted during Fast Refresh - restarting dev runner...");
89
+ return deps.exit(RESTART_EXIT_CODE);
90
+ }
91
+ deps.log("Application quit - stopping dev runner...");
92
+ void closeAndExit(deps, controller);
93
+ };
94
+ const createDevRunner = (deps) => ({
95
+ async run(entryPath) {
96
+ const root = process.cwd();
97
+ const server = await deps.createServer(createDevServerConfig(root, deps.plugins()));
98
+ const refreshTracker = createRefreshTracker(deps.performRefresh);
99
+ const refreshTrackingDeps = { ...deps, performRefresh: refreshTracker.performRefresh };
100
+ const controller = createShutdownController(server, deps);
101
+ deps.installShutdownHandlers(onShutdownSignal(deps, controller));
102
+ server.watcher.on("change", onFileChange(server, refreshTrackingDeps, controller));
61
103
  deps.log(`Loading entry: ${entryPath}`);
62
104
  await server.ssrLoadModule(entryPath);
63
- deps.watchApplicationShutdown(() => {
64
- if (isShuttingDown)
65
- return;
66
- if (refreshTracker.isRefreshing()) {
67
- deps.log("Application unmounted during Fast Refresh - restarting dev runner...");
68
- return deps.exit(RESTART_EXIT_CODE);
69
- }
70
- deps.log("Application quit - stopping dev runner...");
71
- shutdown(() => { }).then(() => deps.exit(0), (cause) => {
72
- error("Error closing server:", cause);
73
- return deps.exit(1);
74
- });
75
- });
76
- const liveApplicationId = deps.getApplicationId();
105
+ const liveApplicationId = await deps.waitForApplicationId(APPLICATION_MOUNT_TIMEOUT_MS);
77
106
  if (liveApplicationId) {
107
+ deps.watchApplicationShutdown(onApplicationShutdown(deps, refreshTracker, controller));
78
108
  const applicationId = (await deps.getConfiguredApplicationId(root)) ?? liveApplicationId;
79
109
  deps.log(`Connected application ID: ${applicationId}`);
80
110
  await deps.startMcpClient(applicationId, (id) => server.ssrLoadModule(id));
@@ -85,4 +115,5 @@ export const createDevRunner = (deps) => ({
85
115
  deps.log("HMR enabled - watching for changes...");
86
116
  },
87
117
  });
118
+ export { createDevRunner };
88
119
  //# sourceMappingURL=runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from \"@gtkx/utils\";\nimport type { InlineConfig, Plugin } from \"vite\";\nimport { createRefreshTracker } from \"./refresh-tracker.js\";\nimport { RESTART_EXIT_CODE } from \"./supervisor.js\";\nimport { createDevServerConfig, type DevServer } from \"./vite-dev-server.js\";\n\nexport type { DevServer } from \"./vite-dev-server.js\";\n\nexport type DevRunnerDeps = {\n createServer(config: InlineConfig): Promise<DevServer>;\n getApplicationId(): string | null;\n getConfiguredApplicationId(root: string): Promise<string | undefined>;\n startMcpClient(\n applicationId: string,\n loadAppModule: (id: string) => Promise<Record<string, unknown>>,\n ): Promise<unknown>;\n stopMcpClient(): void;\n watchApplicationShutdown(onShutdown: () => void): void;\n installShutdownHandlers(onSignal: () => void | Promise<void>): void;\n quitDefaultApplication(): void;\n performRefresh(): void;\n isRefreshBoundary(module: Record<string, unknown>): boolean;\n plugins(): Plugin[];\n log(message: string): void;\n exit(code: number): never;\n};\n\ntype DevRunner = {\n run(entryPath: string): Promise<void>;\n};\n\nconst requestRestart = async (server: DevServer, deps: DevRunnerDeps): Promise<never> => {\n deps.log(\"Full restart (process restart)\");\n await server.close();\n return deps.exit(RESTART_EXIT_CODE);\n};\n\nconst handleFileChange = async (server: DevServer, deps: DevRunnerDeps, changedPath: string): Promise<void> => {\n const module = server.moduleGraph.getModuleById(changedPath);\n if (!module) return;\n\n deps.log(`File changed: ${changedPath}`);\n\n const loadedExports = module.ssrModule;\n if (loadedExports && !deps.isRefreshBoundary(loadedExports)) {\n await requestRestart(server, deps);\n return;\n }\n\n server.moduleGraph.invalidateModule(module);\n for (const importer of module.importers) {\n server.moduleGraph.invalidateModule(importer);\n }\n\n const newMod = await server.ssrLoadModule(changedPath);\n if (deps.isRefreshBoundary(newMod)) {\n deps.log(\"Running Fast Refresh...\");\n deps.performRefresh();\n deps.log(\"Fast Refresh complete\");\n return;\n }\n\n await requestRestart(server, deps);\n};\n\nexport const createDevRunner = (deps: DevRunnerDeps): DevRunner => ({\n async run(entryPath: string): Promise<void> {\n const root = process.cwd();\n const server = await deps.createServer(createDevServerConfig(root, deps.plugins()));\n\n const refreshTracker = createRefreshTracker(deps.performRefresh);\n const refreshTrackingDeps: DevRunnerDeps = { ...deps, performRefresh: refreshTracker.performRefresh };\n\n let isShuttingDown = false;\n const shutdown = async (quitApplication: () => void): Promise<void> => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n quitApplication();\n deps.stopMcpClient();\n await server.close();\n };\n\n deps.installShutdownHandlers(async () => {\n if (isShuttingDown) return;\n deps.log(\"Received shutdown signal - stopping dev runner...\");\n await shutdown(() => deps.quitDefaultApplication());\n });\n\n server.watcher.on(\"change\", (changedPath) => {\n if (isShuttingDown) return;\n handleFileChange(server, refreshTrackingDeps, changedPath).catch((cause) => {\n error(\"Hot reload failed:\", cause);\n });\n });\n\n deps.log(`Loading entry: ${entryPath}`);\n await server.ssrLoadModule(entryPath);\n\n deps.watchApplicationShutdown(() => {\n if (isShuttingDown) return;\n if (refreshTracker.isRefreshing()) {\n deps.log(\"Application unmounted during Fast Refresh - restarting dev runner...\");\n return deps.exit(RESTART_EXIT_CODE);\n }\n deps.log(\"Application quit - stopping dev runner...\");\n shutdown(() => {}).then(\n () => deps.exit(0),\n (cause: unknown) => {\n error(\"Error closing server:\", cause);\n return deps.exit(1);\n },\n );\n });\n\n const liveApplicationId = deps.getApplicationId();\n if (liveApplicationId) {\n const applicationId = (await deps.getConfiguredApplicationId(root)) ?? liveApplicationId;\n deps.log(`Connected application ID: ${applicationId}`);\n await deps.startMcpClient(applicationId, (id) => server.ssrLoadModule(id));\n } else {\n deps.log(\"Entry did not mount an application - MCP client not started.\");\n }\n\n deps.log(\"HMR enabled - watching for changes...\");\n },\n});\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InlineConfig, Plugin } from \"vite\";\nimport { error } from \"@gtkx/utils\";\nimport { createRefreshTracker, type RefreshTracker } from \"./refresh-tracker.js\";\nimport { RESTART_EXIT_CODE } from \"./supervisor.js\";\nimport { createDevServerConfig, type DevServer } from \"./vite-dev-server.js\";\n\ntype DevRunnerDeps = {\n createServer(config: InlineConfig): Promise<DevServer>;\n waitForApplicationId(timeoutMs: number): Promise<string | null>;\n getConfiguredApplicationId(root: string): Promise<string | undefined>;\n startMcpClient(\n applicationId: string,\n loadAppModule: (id: string) => Promise<Record<string, unknown>>,\n ): Promise<unknown>;\n stopMcpClient(): void;\n watchApplicationShutdown(onShutdown: () => void): void;\n installShutdownHandlers(onSignal: () => void | Promise<void>): void;\n quitDefaultApplication(): void;\n performRefresh: () => void;\n isRefreshBoundary(module: Record<string, unknown>): boolean;\n plugins(): Plugin[];\n log(message: string): void;\n exit(code: number): never;\n};\n\ntype DevRunner = {\n run(entryPath: string): Promise<void>;\n};\n\ntype ShutdownController = {\n isShuttingDown: () => boolean;\n shutdown: (quitApplication: () => void) => Promise<void>;\n};\n\nconst APPLICATION_MOUNT_TIMEOUT_MS = 10_000;\n\nconst requestRestart = async (server: DevServer, deps: DevRunnerDeps): Promise<never> => {\n deps.log(\"Full restart (process restart)\");\n await server.close();\n\n return deps.exit(RESTART_EXIT_CODE);\n};\n\nconst handleFileChange = async (server: DevServer, deps: DevRunnerDeps, changedPath: string): Promise<void> => {\n const module = server.moduleGraph.getModuleById(changedPath);\n\n if (!module) {\n return;\n }\n\n deps.log(`File changed: ${changedPath}`);\n const loadedExports = module.ssrModule;\n\n if (loadedExports && !deps.isRefreshBoundary(loadedExports)) {\n await requestRestart(server, deps);\n\n return;\n }\n\n server.moduleGraph.invalidateModule(module);\n\n for (const importer of module.importers) {\n server.moduleGraph.invalidateModule(importer);\n }\n\n const newMod = await server.ssrLoadModule(changedPath);\n\n if (deps.isRefreshBoundary(newMod)) {\n deps.log(\"Running Fast Refresh...\");\n deps.performRefresh();\n deps.log(\"Fast Refresh complete\");\n\n return;\n }\n\n await requestRestart(server, deps);\n};\n\nconst createShutdownController = (server: DevServer, deps: DevRunnerDeps): ShutdownController => {\n let isShuttingDown = false;\n\n return {\n isShuttingDown: () => isShuttingDown,\n shutdown: async (quitApplication: () => void): Promise<void> => {\n if (isShuttingDown) {\n return;\n }\n\n isShuttingDown = true;\n quitApplication();\n deps.stopMcpClient();\n await server.close();\n },\n };\n};\n\nconst reloadChangedFile = async (server: DevServer, deps: DevRunnerDeps, changedPath: string): Promise<void> => {\n try {\n await handleFileChange(server, deps, changedPath);\n } catch (error_) {\n error(\"Hot reload failed:\", error_);\n }\n};\n\nconst onFileChange =\n (server: DevServer, deps: DevRunnerDeps, controller: ShutdownController): ((changedPath: string) => void) =>\n (changedPath) => {\n if (controller.isShuttingDown()) {\n return;\n }\n\n void reloadChangedFile(server, deps, changedPath);\n };\n\nconst onShutdownSignal =\n (deps: DevRunnerDeps, controller: ShutdownController): (() => Promise<void>) =>\n async () => {\n if (controller.isShuttingDown()) {\n return;\n }\n\n deps.log(\"Received shutdown signal - stopping dev runner...\");\n\n await controller.shutdown(() => {\n deps.quitDefaultApplication();\n });\n };\n\nconst closeAndExit = async (deps: DevRunnerDeps, controller: ShutdownController): Promise<never> => {\n try {\n await controller.shutdown((): void => undefined);\n } catch (error_) {\n error(\"Error closing server:\", error_);\n\n return deps.exit(1);\n }\n\n return deps.exit(0);\n};\n\nconst onApplicationShutdown =\n (deps: DevRunnerDeps, refreshTracker: RefreshTracker, controller: ShutdownController): (() => void) =>\n () => {\n if (controller.isShuttingDown()) {\n return;\n }\n\n if (refreshTracker.isRefreshing()) {\n deps.log(\"Application unmounted during Fast Refresh - restarting dev runner...\");\n\n return deps.exit(RESTART_EXIT_CODE);\n }\n\n deps.log(\"Application quit - stopping dev runner...\");\n void closeAndExit(deps, controller);\n };\n\nconst createDevRunner = (deps: DevRunnerDeps): DevRunner => ({\n async run(entryPath: string): Promise<void> {\n const root = process.cwd();\n const server = await deps.createServer(createDevServerConfig(root, deps.plugins()));\n const refreshTracker = createRefreshTracker(deps.performRefresh);\n const refreshTrackingDeps: DevRunnerDeps = { ...deps, performRefresh: refreshTracker.performRefresh };\n const controller = createShutdownController(server, deps);\n deps.installShutdownHandlers(onShutdownSignal(deps, controller));\n server.watcher.on(\"change\", onFileChange(server, refreshTrackingDeps, controller));\n deps.log(`Loading entry: ${entryPath}`);\n await server.ssrLoadModule(entryPath);\n const liveApplicationId = await deps.waitForApplicationId(APPLICATION_MOUNT_TIMEOUT_MS);\n\n if (liveApplicationId) {\n deps.watchApplicationShutdown(onApplicationShutdown(deps, refreshTracker, controller));\n const applicationId = (await deps.getConfiguredApplicationId(root)) ?? liveApplicationId;\n deps.log(`Connected application ID: ${applicationId}`);\n await deps.startMcpClient(applicationId, (id) => server.ssrLoadModule(id));\n } else {\n deps.log(\"Entry did not mount an application - MCP client not started.\");\n }\n\n deps.log(\"HMR enabled - watching for changes...\");\n },\n});\n\nexport type { DevServer } from \"./vite-dev-server.js\";\nexport { createDevRunner, type DevRunnerDeps };\n"]}
@@ -1,2 +1,3 @@
1
- export declare const prepareDevSchemaDir: (root: string, dataDir: string | null) => string | null;
1
+ declare const prepareDevSchemaDir: (root: string, dataDir: string | null) => string | null;
2
+ export { prepareDevSchemaDir };
2
3
  //# sourceMappingURL=schema-dir.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-dir.d.ts","sourceRoot":"","sources":["../../src/dev/schema-dir.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,SAAU,MAAM,WAAW,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAQnF,CAAC"}
1
+ {"version":3,"file":"schema-dir.d.ts","sourceRoot":"","sources":["../../src/dev/schema-dir.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAW5E,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1,10 +1,12 @@
1
1
  import { prependSchemaDir, stageAndCompileProjectSchemas } from "../settings/schema.js";
2
- export const prepareDevSchemaDir = (root, dataDir) => {
2
+ const prepareDevSchemaDir = (root, dataDir) => {
3
3
  const dir = stageAndCompileProjectSchemas(root, dataDir);
4
- if (dir === null)
4
+ if (dir === null) {
5
5
  return null;
6
+ }
6
7
  process.env.GTKX_DEV_SCHEMA_DIR = dir;
7
8
  process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR);
8
9
  return dir;
9
10
  };
11
+ export { prepareDevSchemaDir };
10
12
  //# sourceMappingURL=schema-dir.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-dir.js","sourceRoot":"","sources":["../../src/dev/schema-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAExF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,OAAsB,EAAiB,EAAE;IACvF,MAAM,GAAG,GAAG,6BAA6B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAE3F,OAAO,GAAG,CAAC;AACf,CAAC,CAAC","sourcesContent":["import { prependSchemaDir, stageAndCompileProjectSchemas } from \"../settings/schema.js\";\n\nexport const prepareDevSchemaDir = (root: string, dataDir: string | null): string | null => {\n const dir = stageAndCompileProjectSchemas(root, dataDir);\n if (dir === null) return null;\n\n process.env.GTKX_DEV_SCHEMA_DIR = dir;\n process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR);\n\n return dir;\n};\n"]}
1
+ {"version":3,"file":"schema-dir.js","sourceRoot":"","sources":["../../src/dev/schema-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAExF,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,OAAsB,EAAiB,EAAE;IAChF,MAAM,GAAG,GAAG,6BAA6B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEzD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAE3F,OAAO,GAAG,CAAC;AACf,CAAC,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC","sourcesContent":["import { prependSchemaDir, stageAndCompileProjectSchemas } from \"../settings/schema.js\";\n\nconst prepareDevSchemaDir = (root: string, dataDir: string | null): string | null => {\n const dir = stageAndCompileProjectSchemas(root, dataDir);\n\n if (dir === null) {\n return null;\n }\n\n process.env.GTKX_DEV_SCHEMA_DIR = dir;\n process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR);\n\n return dir;\n};\n\nexport { prepareDevSchemaDir };\n"]}
@@ -1,5 +1,4 @@
1
- export declare const RESTART_EXIT_CODE = 75;
2
- export type SupervisedChild = {
1
+ type SupervisedChild = {
3
2
  killed: boolean;
4
3
  pid?: number | undefined;
5
4
  exitCode: number | null;
@@ -7,11 +6,13 @@ export type SupervisedChild = {
7
6
  on(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;
8
7
  once(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;
9
8
  };
10
- export type ForkRunner = (modulePath: string, args: string[], cwd: string) => SupervisedChild;
11
- export declare const defaultForkRunner: ForkRunner;
12
- export type DevWatch = {
9
+ type ForkRunner = (modulePath: string, args: string[], cwd: string) => SupervisedChild;
10
+ type DevWatch = {
13
11
  paths: string[];
14
12
  regenerate: () => Promise<void>;
15
13
  };
16
- export declare const runDevSupervisor: (entryPath: string, cwd: string, watch?: DevWatch, fork?: ForkRunner) => Promise<never>;
14
+ declare const RESTART_EXIT_CODE = 75;
15
+ declare const defaultForkRunner: ForkRunner;
16
+ declare const runDevSupervisor: (entryPath: string, cwd: string, watch?: DevWatch, fork?: ForkRunner) => Promise<never>;
17
+ export { RESTART_EXIT_CODE, defaultForkRunner, runDevSupervisor, type SupervisedChild, type ForkRunner, type DevWatch };
17
18
  //# sourceMappingURL=supervisor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,MAAM,eAAe,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAChD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAChG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;CACrG,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;AAE9F,eAAO,MAAM,iBAAiB,EAAE,UAC8C,CAAC;AAE/E,MAAM,MAAM,QAAQ,GAAG;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC,CAAC;AA4HF,eAAO,MAAM,gBAAgB,cACd,MAAM,OACZ,MAAM,UACH,QAAQ,SACV,UAAU,KACjB,OAAO,CAAC,KAAK,CAmBf,CAAC"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAMA,KAAK,eAAe,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAChD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAChG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;CACrG,CAAC;AAEF,KAAK,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;AAEvF,KAAK,QAAQ,GAAG;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC,CAAC;AAoBF,QAAA,MAAM,iBAAiB,KAAK,CAAC;AAE7B,QAAA,MAAM,iBAAiB,EAAE,UACqD,CAAC;AA8M/E,QAAA,MAAM,gBAAgB,GAClB,WAAW,MAAM,EACjB,KAAK,MAAM,EACX,QAAQ,QAAQ,EAChB,OAAM,UAA8B,KACrC,OAAO,CAAC,KAAK,CAmBf,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,CAAC"}
@@ -1,60 +1,81 @@
1
+ import { error, exitCodeForSignal, info, installGracefulShutdown } from "@gtkx/utils";
1
2
  import { fork as nodeFork } from "node:child_process";
2
3
  import { watch as watchFs } from "node:fs";
3
4
  import { basename, dirname } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
5
- import { error, exitCodeForSignal, info, installGracefulShutdown } from "@gtkx/utils";
6
6
  const DEV_RUNNER_URL = new URL("../../bin/gtkx-dev-runner.js", import.meta.url);
7
7
  const FORCE_KILL_TIMEOUT_MS = 5000;
8
8
  const CONFIG_DEBOUNCE_MS = 150;
9
- export const RESTART_EXIT_CODE = 75;
10
- export const defaultForkRunner = (modulePath, args, cwd) => nodeFork(modulePath, [...args], { cwd, stdio: "inherit", detached: true });
9
+ const RESTART_EXIT_CODE = 75;
10
+ const defaultForkRunner = (modulePath, args, cwd) => nodeFork(modulePath, [...args], { cwd, stdio: "inherit", detached: true });
11
11
  const forwardSignal = (child, signal) => {
12
12
  if (!child.killed) {
13
13
  child.kill(signal);
14
14
  }
15
15
  };
16
- const forceKillChild = (child) => {
17
- if (!child?.pid || child.exitCode !== null || child.killed)
18
- return;
16
+ const didForceKillChild = (child) => {
17
+ if (!child?.pid || child.exitCode !== null || child.killed) {
18
+ return false;
19
+ }
19
20
  try {
20
- process.kill(child.pid, "SIGKILL");
21
+ return process.kill(child.pid, "SIGKILL");
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ };
27
+ const captureShutdownExit = (state, code, signal) => {
28
+ if (code !== null) {
29
+ state.capturedChildExit = code;
30
+ }
31
+ else if (signal) {
32
+ state.capturedChildExit = exitCodeForSignal(signal);
33
+ }
34
+ };
35
+ const handleChildExit = (state, code, signal) => {
36
+ state.child = null;
37
+ if (state.restarting) {
38
+ return;
39
+ }
40
+ if (state.shuttingDown) {
41
+ captureShutdownExit(state, code, signal);
42
+ return;
43
+ }
44
+ if (code === RESTART_EXIT_CODE) {
45
+ info("Restarting dev runner...");
46
+ launch(state);
47
+ return;
21
48
  }
22
- catch { }
49
+ process.exit(code ?? exitCodeForSignal(signal));
23
50
  };
24
51
  const launch = (state) => {
25
52
  const child = state.fork(state.runnerPath, [state.entryPath], state.cwd);
26
53
  state.child = child;
27
54
  child.on("exit", (code, signal) => {
28
- state.child = null;
29
- if (state.restarting)
30
- return;
31
- if (state.shuttingDown) {
32
- if (code !== null) {
33
- state.capturedChildExit = code;
34
- }
35
- else if (signal) {
36
- state.capturedChildExit = exitCodeForSignal(signal);
37
- }
38
- return;
39
- }
40
- if (code === RESTART_EXIT_CODE) {
41
- info("Restarting dev runner...");
42
- launch(state);
43
- return;
44
- }
45
- process.exit(code ?? exitCodeForSignal(signal));
55
+ handleChildExit(state, code, signal);
46
56
  });
47
57
  };
58
+ const isRestartBlocked = (state) => state.restarting || state.shuttingDown;
59
+ const relaunchAfterExit = (state) => {
60
+ state.restarting = false;
61
+ if (state.shuttingDown) {
62
+ return;
63
+ }
64
+ info("Restarting dev runner...");
65
+ launch(state);
66
+ };
48
67
  const restart = async (state) => {
49
- if (state.restarting || state.shuttingDown || state.watch === undefined)
68
+ const watch = state.watch;
69
+ if (watch === undefined || isRestartBlocked(state)) {
50
70
  return;
71
+ }
51
72
  state.restarting = true;
52
73
  info("gtkx.config.ts changed; regenerating bindings...");
53
74
  try {
54
- await state.watch.regenerate();
75
+ await watch.regenerate();
55
76
  }
56
- catch (cause) {
57
- error("Codegen failed; keeping the current dev runner. Fix the error and save again.", cause);
77
+ catch (error_) {
78
+ error("Codegen failed; keeping the current dev runner. Fix the error and save again.", error_);
58
79
  state.restarting = false;
59
80
  return;
60
81
  }
@@ -69,59 +90,77 @@ const restart = async (state) => {
69
90
  return;
70
91
  }
71
92
  current.once("exit", () => {
72
- state.restarting = false;
73
- if (!state.shuttingDown) {
74
- info("Restarting dev runner...");
75
- launch(state);
76
- }
93
+ relaunchAfterExit(state);
77
94
  });
78
95
  forwardSignal(current, "SIGTERM");
79
96
  };
80
- const installConfigWatchers = (state) => {
81
- const watch = state.watch;
82
- if (watch === undefined || watch.paths.length === 0)
83
- return;
84
- let timer = null;
97
+ const scheduleRestart = (state, timer) => {
98
+ if (timer.handle !== null) {
99
+ clearTimeout(timer.handle);
100
+ }
101
+ timer.handle = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);
102
+ };
103
+ const isWatchedChange = (state, names, filename) => {
104
+ if (filename === null || state.shuttingDown) {
105
+ return false;
106
+ }
107
+ return names.has(basename(filename.toString()));
108
+ };
109
+ const groupWatchNamesByDirectory = (paths) => {
85
110
  const namesByDirectory = new Map();
86
- for (const path of watch.paths) {
111
+ for (const path of paths) {
87
112
  const directory = dirname(path);
88
113
  const names = namesByDirectory.get(directory) ?? new Set();
89
114
  names.add(basename(path));
90
115
  namesByDirectory.set(directory, names);
91
116
  }
92
- for (const [directory, names] of namesByDirectory) {
93
- const watcher = watchFs(directory, (_event, filename) => {
94
- if (state.shuttingDown)
95
- return;
96
- if (filename === null || !names.has(basename(filename.toString())))
97
- return;
98
- if (timer !== null)
99
- clearTimeout(timer);
100
- timer = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);
101
- });
102
- watcher.on("error", () => { });
103
- state.watchers.push(watcher);
117
+ return namesByDirectory;
118
+ };
119
+ const watchConfigDirectory = (state, directory, names, timer) => {
120
+ const watcher = watchFs(directory, (_event, filename) => {
121
+ if (isWatchedChange(state, names, filename)) {
122
+ scheduleRestart(state, timer);
123
+ }
124
+ });
125
+ watcher.on("error", () => undefined);
126
+ state.watchers.push(watcher);
127
+ };
128
+ const installConfigWatchers = (state) => {
129
+ const watch = state.watch;
130
+ if (watch === undefined || watch.paths.length === 0) {
131
+ return;
132
+ }
133
+ const timer = { handle: null };
134
+ for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {
135
+ watchConfigDirectory(state, directory, names, timer);
136
+ }
137
+ };
138
+ const closeWatchers = (state) => {
139
+ for (const watcher of state.watchers) {
140
+ watcher.close();
104
141
  }
105
142
  };
143
+ const shutdownOnSignal = (state, signal) => new Promise((resolve) => {
144
+ state.shuttingDown = true;
145
+ closeWatchers(state);
146
+ if (!state.child) {
147
+ resolve();
148
+ return;
149
+ }
150
+ state.child.once("exit", () => {
151
+ resolve();
152
+ });
153
+ forwardSignal(state.child, signal);
154
+ });
106
155
  const installShutdown = (state) => {
107
156
  installGracefulShutdown({
108
- onSignal: (signal) => new Promise((resolve) => {
109
- state.shuttingDown = true;
110
- for (const watcher of state.watchers)
111
- watcher.close();
112
- if (!state.child) {
113
- resolve();
114
- return;
115
- }
116
- state.child.once("exit", () => resolve());
117
- forwardSignal(state.child, signal);
118
- }),
119
- onForce: () => forceKillChild(state.child),
157
+ onSignal: (signal) => shutdownOnSignal(state, signal),
158
+ onForce: () => didForceKillChild(state.child),
120
159
  forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,
121
160
  exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),
122
161
  });
123
162
  };
124
- export const runDevSupervisor = async (entryPath, cwd, watch, fork = defaultForkRunner) => {
163
+ const runDevSupervisor = async (entryPath, cwd, watch, fork = defaultForkRunner) => {
125
164
  const state = {
126
165
  runnerPath: fileURLToPath(DEV_RUNNER_URL),
127
166
  entryPath,
@@ -137,6 +176,7 @@ export const runDevSupervisor = async (entryPath, cwd, watch, fork = defaultFork
137
176
  installConfigWatchers(state);
138
177
  installShutdown(state);
139
178
  launch(state);
140
- return new Promise(() => { });
179
+ return new Promise(() => undefined);
141
180
  };
181
+ export { RESTART_EXIT_CODE, defaultForkRunner, runDevSupervisor };
142
182
  //# sourceMappingURL=supervisor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"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","sourcesContent":["import { fork as nodeFork } from \"node:child_process\";\nimport { type FSWatcher, watch as watchFs } from \"node:fs\";\nimport { basename, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { error, exitCodeForSignal, info, installGracefulShutdown } from \"@gtkx/utils\";\n\nconst DEV_RUNNER_URL = new URL(\"../../bin/gtkx-dev-runner.js\", import.meta.url);\nconst FORCE_KILL_TIMEOUT_MS = 5000;\nconst CONFIG_DEBOUNCE_MS = 150;\n\nexport const RESTART_EXIT_CODE = 75;\n\nexport type SupervisedChild = {\n killed: boolean;\n pid?: number | undefined;\n exitCode: number | null;\n kill(signal?: number | NodeJS.Signals): boolean;\n on(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n once(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n};\n\nexport type ForkRunner = (modulePath: string, args: string[], cwd: string) => SupervisedChild;\n\nexport const defaultForkRunner: ForkRunner = (modulePath, args, cwd) =>\n nodeFork(modulePath, [...args], { cwd, stdio: \"inherit\", detached: true });\n\nexport type DevWatch = {\n paths: string[];\n regenerate: () => Promise<void>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n cwd: string;\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n fork: ForkRunner;\n child: SupervisedChild | null;\n shuttingDown: boolean;\n restarting: boolean;\n capturedChildExit: number | undefined;\n};\n\nconst forwardSignal = (child: SupervisedChild, signal: NodeJS.Signals): void => {\n if (!child.killed) {\n child.kill(signal);\n }\n};\n\nconst forceKillChild = (child: SupervisedChild | null): void => {\n if (!child?.pid || child.exitCode !== null || child.killed) return;\n try {\n process.kill(child.pid, \"SIGKILL\");\n } catch {}\n};\n\nconst launch = (state: SupervisorState): void => {\n const child = state.fork(state.runnerPath, [state.entryPath], state.cwd);\n state.child = child;\n child.on(\"exit\", (code, signal) => {\n state.child = null;\n if (state.restarting) return;\n if (state.shuttingDown) {\n if (code !== null) {\n state.capturedChildExit = code;\n } else if (signal) {\n state.capturedChildExit = exitCodeForSignal(signal);\n }\n return;\n }\n if (code === RESTART_EXIT_CODE) {\n info(\"Restarting dev runner...\");\n launch(state);\n return;\n }\n process.exit(code ?? exitCodeForSignal(signal));\n });\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n if (state.restarting || state.shuttingDown || state.watch === undefined) return;\n state.restarting = true;\n info(\"gtkx.config.ts changed; regenerating bindings...\");\n try {\n await state.watch.regenerate();\n } catch (cause) {\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", cause);\n state.restarting = false;\n return;\n }\n if (state.shuttingDown) {\n state.restarting = false;\n return;\n }\n const current = state.child;\n if (current === null) {\n state.restarting = false;\n launch(state);\n return;\n }\n current.once(\"exit\", () => {\n state.restarting = false;\n if (!state.shuttingDown) {\n info(\"Restarting dev runner...\");\n launch(state);\n }\n });\n forwardSignal(current, \"SIGTERM\");\n};\n\nconst installConfigWatchers = (state: SupervisorState): void => {\n const watch = state.watch;\n if (watch === undefined || watch.paths.length === 0) return;\n let timer: NodeJS.Timeout | null = null;\n const namesByDirectory = new Map<string, Set<string>>();\n for (const path of watch.paths) {\n const directory = dirname(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(basename(path));\n namesByDirectory.set(directory, names);\n }\n for (const [directory, names] of namesByDirectory) {\n const watcher = watchFs(directory, (_event, filename) => {\n if (state.shuttingDown) return;\n if (filename === null || !names.has(basename(filename.toString()))) return;\n if (timer !== null) clearTimeout(timer);\n timer = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);\n });\n watcher.on(\"error\", () => {});\n state.watchers.push(watcher);\n }\n};\n\nconst installShutdown = (state: SupervisorState): void => {\n installGracefulShutdown({\n onSignal: (signal) =>\n new Promise<void>((resolve) => {\n state.shuttingDown = true;\n for (const watcher of state.watchers) watcher.close();\n if (!state.child) {\n resolve();\n return;\n }\n state.child.once(\"exit\", () => resolve());\n forwardSignal(state.child, signal);\n }),\n onForce: () => forceKillChild(state.child),\n forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,\n exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),\n });\n};\n\nexport const runDevSupervisor = async (\n entryPath: string,\n cwd: string,\n watch?: DevWatch,\n fork: ForkRunner = defaultForkRunner,\n): Promise<never> => {\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n cwd,\n watch,\n watchers: [],\n fork,\n child: null,\n shuttingDown: false,\n restarting: false,\n capturedChildExit: undefined,\n };\n\n installConfigWatchers(state);\n installShutdown(state);\n launch(state);\n\n return new Promise<never>(() => {});\n};\n"]}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"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","sourcesContent":["import { error, exitCodeForSignal, info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { fork as nodeFork } from \"node:child_process\";\nimport { type FSWatcher, watch as watchFs } from \"node:fs\";\nimport { basename, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ntype SupervisedChild = {\n killed: boolean;\n pid?: number | undefined;\n exitCode: number | null;\n kill(signal?: number | NodeJS.Signals): boolean;\n on(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n once(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n};\n\ntype ForkRunner = (modulePath: string, args: string[], cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n regenerate: () => Promise<void>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n cwd: string;\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n fork: ForkRunner;\n child: SupervisedChild | null;\n shuttingDown: boolean;\n restarting: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DebounceTimer = { handle: NodeJS.Timeout | null };\n\nconst DEV_RUNNER_URL = new URL(\"../../bin/gtkx-dev-runner.js\", import.meta.url);\nconst FORCE_KILL_TIMEOUT_MS = 5000;\nconst CONFIG_DEBOUNCE_MS = 150;\nconst RESTART_EXIT_CODE = 75;\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, cwd) =>\n nodeFork(modulePath, [...args], { cwd, stdio: \"inherit\", detached: true });\n\nconst forwardSignal = (child: SupervisedChild, signal: NodeJS.Signals): void => {\n if (!child.killed) {\n child.kill(signal);\n }\n};\n\nconst didForceKillChild = (child: SupervisedChild | null): boolean => {\n if (!child?.pid || child.exitCode !== null || child.killed) {\n return false;\n }\n\n try {\n return process.kill(child.pid, \"SIGKILL\");\n } catch {\n return false;\n }\n};\n\nconst captureShutdownExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n if (code !== null) {\n state.capturedChildExit = code;\n } else if (signal) {\n state.capturedChildExit = exitCodeForSignal(signal);\n }\n};\n\nconst handleChildExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n state.child = null;\n\n if (state.restarting) {\n return;\n }\n\n if (state.shuttingDown) {\n captureShutdownExit(state, code, signal);\n\n return;\n }\n\n if (code === RESTART_EXIT_CODE) {\n info(\"Restarting dev runner...\");\n launch(state);\n\n return;\n }\n\n process.exit(code ?? exitCodeForSignal(signal));\n};\n\nconst launch = (state: SupervisorState): void => {\n const child = state.fork(state.runnerPath, [state.entryPath], state.cwd);\n state.child = child;\n\n child.on(\"exit\", (code, signal) => {\n handleChildExit(state, code, signal);\n });\n};\n\nconst isRestartBlocked = (state: SupervisorState): boolean => state.restarting || state.shuttingDown;\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n state.restarting = false;\n\n if (state.shuttingDown) {\n return;\n }\n\n info(\"Restarting dev runner...\");\n launch(state);\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n const watch = state.watch;\n\n if (watch === undefined || isRestartBlocked(state)) {\n return;\n }\n\n state.restarting = true;\n info(\"gtkx.config.ts changed; regenerating bindings...\");\n\n try {\n await watch.regenerate();\n } catch (error_) {\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", error_);\n state.restarting = false;\n\n return;\n }\n\n if (state.shuttingDown) {\n state.restarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n state.restarting = false;\n launch(state);\n\n return;\n }\n\n current.once(\"exit\", () => {\n relaunchAfterExit(state);\n });\n\n forwardSignal(current, \"SIGTERM\");\n};\n\nconst scheduleRestart = (state: SupervisorState, timer: DebounceTimer): void => {\n if (timer.handle !== null) {\n clearTimeout(timer.handle);\n }\n\n timer.handle = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);\n};\n\nconst isWatchedChange = (state: SupervisorState, names: Set<string>, filename: string | Buffer | null): boolean => {\n if (filename === null || state.shuttingDown) {\n return false;\n }\n\n return names.has(basename(filename.toString()));\n};\n\nconst groupWatchNamesByDirectory = (paths: string[]): Map<string, Set<string>> => {\n const namesByDirectory: Map<string, Set<string>> = new Map();\n\n for (const path of paths) {\n const directory = dirname(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(basename(path));\n namesByDirectory.set(directory, names);\n }\n\n return namesByDirectory;\n};\n\nconst watchConfigDirectory = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n timer: DebounceTimer,\n): void => {\n const watcher = watchFs(directory, (_event, filename) => {\n if (isWatchedChange(state, names, filename)) {\n scheduleRestart(state, timer);\n }\n });\n\n watcher.on(\"error\", (): void => undefined);\n state.watchers.push(watcher);\n};\n\nconst installConfigWatchers = (state: SupervisorState): void => {\n const watch = state.watch;\n\n if (watch === undefined || watch.paths.length === 0) {\n return;\n }\n\n const timer: DebounceTimer = { handle: null };\n\n for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {\n watchConfigDirectory(state, directory, names, timer);\n }\n};\n\nconst closeWatchers = (state: SupervisorState): void => {\n for (const watcher of state.watchers) {\n watcher.close();\n }\n};\n\nconst shutdownOnSignal = (state: SupervisorState, signal: NodeJS.Signals): Promise<void> =>\n new Promise<void>((resolve) => {\n state.shuttingDown = true;\n closeWatchers(state);\n\n if (!state.child) {\n resolve();\n\n return;\n }\n\n state.child.once(\"exit\", () => {\n resolve();\n });\n\n forwardSignal(state.child, signal);\n });\n\nconst installShutdown = (state: SupervisorState): void => {\n installGracefulShutdown({\n onSignal: (signal) => shutdownOnSignal(state, signal),\n onForce: () => didForceKillChild(state.child),\n forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,\n exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),\n });\n};\n\nconst runDevSupervisor = async (\n entryPath: string,\n cwd: string,\n watch?: DevWatch,\n fork: ForkRunner = defaultForkRunner,\n): Promise<never> => {\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n cwd,\n watch,\n watchers: [],\n fork,\n child: null,\n shuttingDown: false,\n restarting: false,\n capturedChildExit: undefined,\n };\n\n installConfigWatchers(state);\n installShutdown(state);\n launch(state);\n\n return new Promise<never>((): void => undefined);\n};\n\nexport { RESTART_EXIT_CODE, defaultForkRunner, runDevSupervisor, type SupervisedChild, type ForkRunner, type DevWatch };\n"]}
@@ -8,7 +8,7 @@ type DevServerModuleGraph = {
8
8
  getModuleById(id: string): DevServerChangedModule | undefined;
9
9
  invalidateModule(module: DevServerModule): void;
10
10
  };
11
- export type DevServer = {
11
+ type DevServer = {
12
12
  close(): Promise<void>;
13
13
  moduleGraph: DevServerModuleGraph;
14
14
  ssrLoadModule(id: string): Promise<Record<string, unknown>>;
@@ -16,6 +16,6 @@ export type DevServer = {
16
16
  on(event: "change", listener: (changedPath: string) => void): void;
17
17
  };
18
18
  };
19
- export declare const createDevServerConfig: (root: string, plugins: Plugin[]) => InlineConfig;
20
- export {};
19
+ declare const createDevServerConfig: (root: string, plugins: Plugin[]) => InlineConfig;
20
+ export { createDevServerConfig, type DevServer };
21
21
  //# sourceMappingURL=vite-dev-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-dev-server.d.ts","sourceRoot":"","sources":["../../src/dev/vite-dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEjD,KAAK,eAAe,GAAG,MAAM,CAAC;AAE9B,KAAK,sBAAsB,GAAG,eAAe,GAAG;IAC5C,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,KAAK,oBAAoB,GAAG;IACxB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAC9D,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,EAAE,oBAAoB,CAAC;IAClC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE;QACL,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;KACtE,CAAC;CACL,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,MAAM,WAAW,MAAM,EAAE,KAAG,YAUtE,CAAC"}
1
+ {"version":3,"file":"vite-dev-server.d.ts","sourceRoot":"","sources":["../../src/dev/vite-dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEjD,KAAK,eAAe,GAAG,MAAM,CAAC;AAE9B,KAAK,sBAAsB,GAAG,eAAe,GAAG;IAC5C,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,KAAK,oBAAoB,GAAG;IACxB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAC9D,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CACnD,CAAC;AAEF,KAAK,SAAS,GAAG;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,EAAE,oBAAoB,CAAC;IAClC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE;QACL,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;KACtE,CAAC;CACL,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,KAAG,YAU/D,CAAC;AAEH,OAAO,EAAE,qBAAqB,EAAE,KAAK,SAAS,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- export const createDevServerConfig = (root, plugins) => ({
1
+ const createDevServerConfig = (root, plugins) => ({
2
2
  root,
3
3
  appType: "custom",
4
4
  plugins,
@@ -9,4 +9,5 @@ export const createDevServerConfig = (root, plugins) => ({
9
9
  noExternal: [/^@gtkx\/(?!(?:native|gi|gl|runtime|utils|css)(?:\/|$))/, /[/\\]\.gtkx[/\\]/],
10
10
  },
11
11
  });
12
+ export { createDevServerConfig };
12
13
  //# sourceMappingURL=vite-dev-server.js.map