@gtkx/cli 2.0.0-beta.3 → 2.0.0-beta.5

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 (88) hide show
  1. package/dist/cli.js +4 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/codegen/config-dependencies.d.ts +3 -0
  4. package/dist/codegen/config-dependencies.d.ts.map +1 -0
  5. package/dist/codegen/config-dependencies.js +355 -0
  6. package/dist/codegen/config-dependencies.js.map +1 -0
  7. package/dist/codegen/run-codegen.d.ts +3 -2
  8. package/dist/codegen/run-codegen.d.ts.map +1 -1
  9. package/dist/codegen/run-codegen.js +31 -6
  10. package/dist/codegen/run-codegen.js.map +1 -1
  11. package/dist/codegen/store-resolver.d.ts +1 -0
  12. package/dist/codegen/store-resolver.d.ts.map +1 -1
  13. package/dist/codegen/store-resolver.js +4 -2
  14. package/dist/codegen/store-resolver.js.map +1 -1
  15. package/dist/commands/cleanup.d.ts +9 -0
  16. package/dist/commands/cleanup.d.ts.map +1 -0
  17. package/dist/commands/cleanup.js +31 -0
  18. package/dist/commands/cleanup.js.map +1 -0
  19. package/dist/commands/dev.d.ts.map +1 -1
  20. package/dist/commands/dev.js +4 -2
  21. package/dist/commands/dev.js.map +1 -1
  22. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  23. package/dist/deploy/freedesktop/validate.js +45 -12
  24. package/dist/deploy/freedesktop/validate.js.map +1 -1
  25. package/dist/deploy/payload/stage.d.ts.map +1 -1
  26. package/dist/deploy/payload/stage.js +24 -3
  27. package/dist/deploy/payload/stage.js.map +1 -1
  28. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  29. package/dist/deploy/settings/extra-files.js +4 -3
  30. package/dist/deploy/settings/extra-files.js.map +1 -1
  31. package/dist/dev/catalog-writes.d.ts +8 -0
  32. package/dist/dev/catalog-writes.d.ts.map +1 -0
  33. package/dist/dev/catalog-writes.js +26 -0
  34. package/dist/dev/catalog-writes.js.map +1 -0
  35. package/dist/dev/runner-deps.d.ts.map +1 -1
  36. package/dist/dev/runner-deps.js +10 -6
  37. package/dist/dev/runner-deps.js.map +1 -1
  38. package/dist/dev/runner.d.ts +1 -0
  39. package/dist/dev/runner.d.ts.map +1 -1
  40. package/dist/dev/runner.js +8 -2
  41. package/dist/dev/runner.js.map +1 -1
  42. package/dist/dev/supervisor.d.ts +2 -1
  43. package/dist/dev/supervisor.d.ts.map +1 -1
  44. package/dist/dev/supervisor.js +128 -26
  45. package/dist/dev/supervisor.js.map +1 -1
  46. package/dist/i18n/catalogs.d.ts +6 -2
  47. package/dist/i18n/catalogs.d.ts.map +1 -1
  48. package/dist/i18n/catalogs.js +9 -7
  49. package/dist/i18n/catalogs.js.map +1 -1
  50. package/dist/i18n/source-messages.d.ts +3 -1
  51. package/dist/i18n/source-messages.d.ts.map +1 -1
  52. package/dist/i18n/source-messages.js +14 -2
  53. package/dist/i18n/source-messages.js.map +1 -1
  54. package/dist/internal/build-output.d.ts.map +1 -1
  55. package/dist/internal/build-output.js +45 -8
  56. package/dist/internal/build-output.js.map +1 -1
  57. package/dist/internal/prepare-project.d.ts +1 -0
  58. package/dist/internal/prepare-project.d.ts.map +1 -1
  59. package/dist/internal/prepare-project.js +8 -2
  60. package/dist/internal/prepare-project.js.map +1 -1
  61. package/dist/vite-plugins/i18n.d.ts +11 -2
  62. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  63. package/dist/vite-plugins/i18n.js +20 -6
  64. package/dist/vite-plugins/i18n.js.map +1 -1
  65. package/dist/vite-plugins/index.d.ts +2 -0
  66. package/dist/vite-plugins/index.d.ts.map +1 -1
  67. package/dist/vite-plugins/index.js +10 -2
  68. package/dist/vite-plugins/index.js.map +1 -1
  69. package/package.json +12 -10
  70. package/src/cli.ts +5 -0
  71. package/src/codegen/config-dependencies.ts +470 -0
  72. package/src/codegen/run-codegen.ts +37 -5
  73. package/src/codegen/store-resolver.ts +5 -2
  74. package/src/commands/cleanup.ts +36 -0
  75. package/src/commands/dev.ts +9 -2
  76. package/src/deploy/freedesktop/validate.ts +63 -13
  77. package/src/deploy/payload/stage.ts +42 -3
  78. package/src/deploy/settings/extra-files.ts +5 -3
  79. package/src/dev/catalog-writes.ts +35 -0
  80. package/src/dev/runner-deps.ts +14 -6
  81. package/src/dev/runner.ts +11 -2
  82. package/src/dev/supervisor.ts +177 -29
  83. package/src/i18n/catalogs.ts +20 -8
  84. package/src/i18n/source-messages.ts +19 -3
  85. package/src/internal/build-output.ts +67 -9
  86. package/src/internal/prepare-project.ts +9 -3
  87. package/src/vite-plugins/i18n.ts +42 -9
  88. package/src/vite-plugins/index.ts +19 -3
@@ -1 +1 @@
1
- {"version":3,"file":"runner-deps.js","sourceRoot":"","sources":["../../src/dev/runner-deps.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadConfig } from \"@gtkx/config\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport { quitApplication } from \"@gtkx/runtime\";\nimport { type ApplicationInstance, getApplicationInstance } from \"@gtkx/runtime/internal\";\nimport { info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { readFile } from \"node:fs/promises\";\nimport { createServer } from \"vite\";\nimport type { DevRunnerDeps } from \"./runner.js\";\nimport { startMcpClient, stopMcpClient } from \"../mcp/index.js\";\nimport {\n mergeTestingModule,\n setTestingModuleLoader,\n type TestingInternalModule,\n type TestingPublicModule,\n} from \"../mcp/testing-loader.js\";\nimport { isRefreshBoundary, performRefresh, staleExportName } from \"../refresh-runtime.js\";\nimport { gtkxFastRefresh } from \"../vite-plugins/fast-refresh/swc-refresh.js\";\nimport { gtkxVitePlugins } from \"../vite-plugins/index.js\";\nimport { gtkxReactDomPrebundle } from \"../vite-plugins/react-dom-prebundle.js\";\n\nconst DEV_MODE = \"development\";\nconst APPLICATION_POLL_INTERVAL_MS = 50;\n\nconst currentApplicationId = (): string | null => Gio.Application.getDefault()?.applicationId ?? null;\n\nconst currentApplicationInstance = (): ApplicationInstance => {\n const application = Gio.Application.getDefault();\n\n return application === null ? \"unregistered\" : getApplicationInstance(application);\n};\n\nconst waitForApplicationId = async (timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null> => {\n const deadline = Date.now() + timeoutMs;\n let applicationId = currentApplicationId();\n\n while (applicationId === null && Date.now() < deadline && shouldKeepWaiting()) {\n await new Promise((resolve) => setTimeout(resolve, APPLICATION_POLL_INTERVAL_MS));\n applicationId = currentApplicationId();\n }\n\n return applicationId;\n};\n\nconst readFileRevision = (path: string): Promise<string> => readFile(path, \"utf8\");\n\nconst defaultDevRunnerDeps = (configFile: string): DevRunnerDeps => ({\n createServer,\n waitForApplicationId,\n getConfiguredApplicationId: async (root: string) => {\n const loaded = await loadConfig(root, { mode: DEV_MODE, configFile });\n\n return loaded.config.applicationId;\n },\n startMcpClient: (applicationId, loadAppModule) => {\n setTestingModuleLoader(async () => {\n const [publicApi, internals] = await Promise.all([\n loadAppModule(\"@gtkx/testing\") as Promise<TestingPublicModule>,\n loadAppModule(\"@gtkx/testing/internal\") as Promise<TestingInternalModule>,\n ]);\n\n return mergeTestingModule(publicApi, internals);\n });\n\n return startMcpClient(applicationId);\n },\n stopMcpClient,\n watchApplicationShutdown: (onShutdown) => {\n Gio.Application.getDefault()?.on(\"shutdown\", onShutdown);\n },\n watchUncaughtErrors: (onUncaughtError) => {\n process.on(\"uncaughtException\", onUncaughtError);\n process.on(\"unhandledRejection\", onUncaughtError);\n },\n getApplicationInstance: currentApplicationInstance,\n installShutdownHandlers: (onSignal) => {\n installGracefulShutdown({ onSignal });\n },\n quitDefaultApplication: () => {\n const application = Gio.Application.getDefault();\n\n if (application) {\n quitApplication(application);\n }\n },\n performRefresh,\n isRefreshBoundary,\n staleExportName,\n readFileRevision,\n plugins: (entryPath) => [\n ...gtkxVitePlugins({ mode: DEV_MODE, entryPath, configFile }),\n ...gtkxFastRefresh(),\n gtkxReactDomPrebundle(),\n ],\n log: info,\n exit: (code: number): never => process.exit(code),\n});\n\nexport { defaultDevRunnerDeps };\n"]}
1
+ {"version":3,"file":"runner-deps.js","sourceRoot":"","sources":["../../src/dev/runner-deps.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadConfig } from \"@gtkx/config\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport { quitApplication } from \"@gtkx/runtime\";\nimport { type ApplicationInstance, getApplicationInstance } from \"@gtkx/runtime/internal\";\nimport { info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { readFile } from \"node:fs/promises\";\nimport { createServer } from \"vite\";\nimport type { DevRunnerDeps } from \"./runner.js\";\nimport { startMcpClient, stopMcpClient } from \"../mcp/index.js\";\nimport {\n mergeTestingModule,\n setTestingModuleLoader,\n type TestingInternalModule,\n type TestingPublicModule,\n} from \"../mcp/testing-loader.js\";\nimport { isRefreshBoundary, performRefresh, staleExportName } from \"../refresh-runtime.js\";\nimport { gtkxFastRefresh } from \"../vite-plugins/fast-refresh/swc-refresh.js\";\nimport { gtkxVitePlugins } from \"../vite-plugins/index.js\";\nimport { gtkxReactDomPrebundle } from \"../vite-plugins/react-dom-prebundle.js\";\nimport { type CatalogWrites, createCatalogWrites } from \"./catalog-writes.js\";\n\nconst DEV_MODE = \"development\";\nconst APPLICATION_POLL_INTERVAL_MS = 50;\n\nconst currentApplicationId = (): string | null => Gio.Application.getDefault()?.applicationId ?? null;\n\nconst currentApplicationInstance = (): ApplicationInstance => {\n const application = Gio.Application.getDefault();\n\n return application === null ? \"unregistered\" : getApplicationInstance(application);\n};\n\nconst waitForApplicationId = async (timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null> => {\n const deadline = Date.now() + timeoutMs;\n let applicationId = currentApplicationId();\n\n while (applicationId === null && Date.now() < deadline && shouldKeepWaiting()) {\n await new Promise((resolve) => setTimeout(resolve, APPLICATION_POLL_INTERVAL_MS));\n applicationId = currentApplicationId();\n }\n\n return applicationId;\n};\n\nconst readFileRevision = (path: string): Promise<string> => readFile(path, \"utf8\");\n\nconst devPlugins = (configFile: string, catalogWrites: CatalogWrites): DevRunnerDeps[\"plugins\"] =>\n (entryPath) => [\n ...gtkxVitePlugins({ mode: DEV_MODE, entryPath, configFile, onCatalogsWritten: catalogWrites.record }),\n ...gtkxFastRefresh(),\n gtkxReactDomPrebundle(),\n ];\n\nconst createDevRunnerDeps = (configFile: string, catalogWrites: CatalogWrites): DevRunnerDeps => ({\n createServer,\n waitForApplicationId,\n getConfiguredApplicationId: async (root: string) => {\n const loaded = await loadConfig(root, { mode: DEV_MODE, configFile });\n\n return loaded.config.applicationId;\n },\n startMcpClient: (applicationId, loadAppModule) => {\n setTestingModuleLoader(async () => {\n const [publicApi, internals] = await Promise.all([\n loadAppModule(\"@gtkx/testing\") as Promise<TestingPublicModule>,\n loadAppModule(\"@gtkx/testing/internal\") as Promise<TestingInternalModule>,\n ]);\n\n return mergeTestingModule(publicApi, internals);\n });\n\n return startMcpClient(applicationId);\n },\n stopMcpClient,\n watchApplicationShutdown: (onShutdown) => {\n Gio.Application.getDefault()?.on(\"shutdown\", onShutdown);\n },\n watchUncaughtErrors: (onUncaughtError) => {\n process.on(\"uncaughtException\", onUncaughtError);\n process.on(\"unhandledRejection\", onUncaughtError);\n },\n getApplicationInstance: currentApplicationInstance,\n installShutdownHandlers: (onSignal) => {\n installGracefulShutdown({ onSignal });\n },\n quitDefaultApplication: () => {\n const application = Gio.Application.getDefault();\n\n if (application) {\n quitApplication(application);\n }\n },\n performRefresh,\n isRefreshBoundary,\n staleExportName,\n readFileRevision,\n hasWrittenCatalog: catalogWrites.hasWritten,\n plugins: devPlugins(configFile, catalogWrites),\n log: info,\n exit: (code: number): never => process.exit(code),\n});\n\nconst defaultDevRunnerDeps = (configFile: string): DevRunnerDeps =>\n createDevRunnerDeps(configFile, createCatalogWrites());\n\nexport { defaultDevRunnerDeps };\n"]}
@@ -17,6 +17,7 @@ type DevRunnerDeps = {
17
17
  isRefreshBoundary(module: Record<string, unknown>): boolean;
18
18
  staleExportName(previous: Record<string, unknown>, current: Record<string, unknown>): string | null;
19
19
  readFileRevision(path: string): Promise<string>;
20
+ hasWrittenCatalog(path: string): boolean;
20
21
  plugins(entryPath: string): Plugin[];
21
22
  log(message: string): void;
22
23
  exit(code: number): never;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AASjD,OAAO,EAEH,KAAK,SAAS,EAIjB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,aAAa,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtE,KAAK,aAAa,GAAG;IACjB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClG,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtE,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,aAAa,IAAI,IAAI,CAAC;IACtB,wBAAwB,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACvD,mBAAmB,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,sBAAsB,IAAI,mBAAmB,CAAC;IAC9C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,sBAAsB,IAAI,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC5D,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,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;AAwjBF,QAAA,MAAM,eAAe,GAAI,MAAM,aAAa,KAAG,SAe7C,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AASjD,OAAO,EAEH,KAAK,SAAS,EAIjB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,aAAa,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtE,KAAK,aAAa,GAAG;IACjB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClG,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtE,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,aAAa,IAAI,IAAI,CAAC;IACtB,wBAAwB,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACvD,mBAAmB,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,sBAAsB,IAAI,mBAAmB,CAAC;IAC9C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,sBAAsB,IAAI,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC5D,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,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;AAgkBF,QAAA,MAAM,eAAe,GAAI,MAAM,aAAa,KAAG,SAe7C,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,CAAC"}
@@ -214,13 +214,19 @@ const restartForServerConfig = async (session, changedPath) => {
214
214
  session.deps.log(`Server config changed: ${changedPath}`);
215
215
  await requestRestart(session);
216
216
  };
217
+ const restartForCatalog = async (session, changedPath) => {
218
+ if (session.deps.hasWrittenCatalog(changedPath)) {
219
+ return;
220
+ }
221
+ session.deps.log(`Translation catalog changed: ${changedPath}`);
222
+ await requestRestart(session);
223
+ };
217
224
  const applyChange = async (session, change) => {
218
225
  if (session.controller.isShuttingDown()) {
219
226
  return;
220
227
  }
221
228
  if (isCatalogSource(session.server.config.root, change.path)) {
222
- session.deps.log(`Translation catalog changed: ${change.path}`);
223
- await requestRestart(session);
229
+ await restartForCatalog(session, change.path);
224
230
  return;
225
231
  }
226
232
  if (isServerConfigFile(session.server.config, change.path)) {
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApplicationInstance } from \"@gtkx/runtime/internal\";\nimport type { InlineConfig, Plugin } from \"vite\";\nimport { error, warn } from \"@gtkx/utils\";\nimport { isCatalogSource } from \"../i18n/catalogs.js\";\nimport { loadModuleExclusively, withExclusiveLoad } from \"../internal/module-loads.js\";\nimport { createChangeQueue, type WatchedChange } from \"./change-queue.js\";\nimport { createFailureTracker, type FailureTracker } from \"./failure-tracker.js\";\nimport { isMissingImport, missingImportName } from \"./missing-import.js\";\nimport { createRefreshTracker, type RefreshTracker } from \"./refresh-tracker.js\";\nimport { RESTART_EXIT_CODE } from \"./supervisor.js\";\nimport {\n createDevServerConfig,\n type DevServer,\n type DevServerChangedModule,\n type DevServerWatchEvent,\n isServerConfigFile,\n} from \"./vite-dev-server.js\";\n\ntype LoadAppModule = (id: string) => Promise<Record<string, unknown>>;\n\ntype DevRunnerDeps = {\n createServer(config: InlineConfig): Promise<DevServer>;\n waitForApplicationId(timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null>;\n getConfiguredApplicationId(root: string): Promise<string | undefined>;\n startMcpClient(applicationId: string, loadAppModule: LoadAppModule): Promise<unknown>;\n stopMcpClient(): void;\n watchApplicationShutdown(onShutdown: () => void): void;\n watchUncaughtErrors(onUncaughtError: (cause: unknown) => void): void;\n getApplicationInstance(): ApplicationInstance;\n installShutdownHandlers(onSignal: () => void | Promise<void>): void;\n quitDefaultApplication(): void;\n performRefresh: () => void;\n isRefreshBoundary(module: Record<string, unknown>): boolean;\n staleExportName(previous: Record<string, unknown>, current: Record<string, unknown>): string | null;\n readFileRevision(path: string): Promise<string>;\n plugins(entryPath: string): 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\ntype DevSession = {\n server: DevServer;\n deps: DevRunnerDeps;\n controller: ShutdownController;\n refreshTracker: RefreshTracker;\n failure: FailureTracker;\n pendingSaves: Map<string, string>;\n};\n\ntype SettledLoad = {\n loadedExports: Record<string, unknown>;\n isSettled: boolean;\n};\n\ntype SettleAttempt = {\n loadedExports: Record<string, unknown> | null;\n module: DevServerChangedModule;\n};\n\nconst APPLICATION_MOUNT_TIMEOUT_MS = 10_000;\nconst OWNED_ID_EXIT_CODE = 1;\nconst LOAD_ATTEMPT_LIMIT = 5;\nconst WATCH_EVENTS: DevServerWatchEvent[] = [\"add\", \"change\", \"unlink\"];\nconst SKIP_REASON = `did not settle in ${String(LOAD_ATTEMPT_LIMIT)} attempts; save it again to patch the window.`;\nconst DROPPED_REFRESH = \"Fast Refresh dropped\";\nconst SAVE_ACTION = \"File changed\";\nconst RETRY_ACTION = \"Retrying pending save\";\n\nconst announceFailure = (server: DevServer, cause: unknown): void => {\n if (cause instanceof Error) {\n server.ssrFixStacktrace(cause);\n }\n\n error(\"Application error; keeping the dev server up. Fix the error and save again.\", cause);\n};\n\nconst parkSession = (session: DevSession): void => {\n session.deps.log(\"Waiting for a change to restart the application...\");\n};\n\nconst requestRestart = async (session: DevSession): Promise<never> => {\n session.deps.log(\"Full restart (process restart)\");\n\n try {\n await session.server.close();\n } catch (error_) {\n error(\"Error closing server before the restart:\", error_);\n }\n\n return session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst requiresRestart = (session: DevSession, module: DevServerChangedModule): boolean => {\n if (session.failure.isDown()) {\n return true;\n }\n\n const loadedExports = module.ssrModule;\n\n if (!loadedExports) {\n return false;\n }\n\n return !session.deps.isRefreshBoundary(loadedExports);\n};\n\nconst invalidateChangedModule = (session: DevSession, module: DevServerChangedModule): void => {\n session.server.moduleGraph.invalidateModule(module);\n\n for (const importer of module.importers) {\n session.server.moduleGraph.invalidateModule(importer);\n }\n};\n\nconst isEvaluationCurrent = (\n session: DevSession,\n changedPath: string,\n loadedExports: Record<string, unknown>,\n): boolean => {\n const evaluated = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!evaluated?.ssrTransformResult) {\n return false;\n }\n\n return evaluated.ssrModule === loadedExports;\n};\n\nconst loadInvalidatedModule = (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettledLoad> =>\n withExclusiveLoad(session.server, async () => {\n const revision = await session.deps.readFileRevision(changedPath);\n invalidateChangedModule(session, module);\n const loadedExports = await session.server.ssrLoadModule(changedPath);\n const settledRevision = await session.deps.readFileRevision(changedPath);\n\n return {\n loadedExports,\n isSettled: settledRevision === revision && isEvaluationCurrent(session, changedPath, loadedExports),\n };\n });\n\nconst settleAttempt = async (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettleAttempt> => {\n const { loadedExports, isSettled } = await loadInvalidatedModule(session, changedPath, module);\n\n if (isSettled) {\n return { loadedExports, module };\n }\n\n return { loadedExports: null, module: session.server.moduleGraph.getModuleById(changedPath) ?? module };\n};\n\nconst loadSettledExports = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n): Promise<Record<string, unknown> | null> => {\n let module = changedModule;\n\n for (let round = 0; round < LOAD_ATTEMPT_LIMIT && !session.controller.isShuttingDown(); round++) {\n const attempt = await settleAttempt(session, changedPath, module);\n\n if (attempt.loadedExports) {\n return attempt.loadedExports;\n }\n\n module = attempt.module;\n }\n\n return null;\n};\n\nconst droppedExportName = (previous: Record<string, unknown>, current: Record<string, unknown>): string | null => {\n const kept = new Set(Object.keys(current));\n\n for (const name of Object.keys(previous)) {\n if (!kept.has(name)) {\n return name;\n }\n }\n\n return null;\n};\n\nconst unpatchedExportReason = (\n session: DevSession,\n previous: Record<string, unknown> | null,\n current: Record<string, unknown>,\n): string | null => {\n if (!previous) {\n return null;\n }\n\n const dropped = droppedExportName(previous, current);\n\n if (dropped !== null) {\n return `no longer exports ${dropped}, which its importers still hold`;\n }\n\n const stale = session.deps.staleExportName(previous, current);\n\n if (stale === null) {\n return null;\n }\n\n return `renamed the component it exports as ${stale}, which the window is still rendering`;\n};\n\nconst refreshChangedModule = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n previous: Record<string, unknown> | null,\n): Promise<void> => {\n const loadedExports = await loadSettledExports(session, changedPath, changedModule);\n\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (!loadedExports) {\n warn(`Fast Refresh skipped: ${changedPath} ${SKIP_REASON}`);\n\n return;\n }\n\n if (!session.deps.isRefreshBoundary(loadedExports)) {\n await requestRestart(session);\n\n return;\n }\n\n const unpatched = unpatchedExportReason(session, previous, loadedExports);\n\n if (unpatched !== null) {\n warn(`${DROPPED_REFRESH}: ${changedPath} ${unpatched}`);\n await requestRestart(session);\n\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n session.deps.log(\"Running Fast Refresh...\");\n session.deps.performRefresh();\n session.deps.log(\"Fast Refresh complete\");\n};\n\nconst applyModuleChange = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n const module = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!module) {\n return;\n }\n\n session.deps.log(`${action}: ${changedPath}`);\n\n if (requiresRestart(session, module)) {\n await requestRestart(session);\n\n return;\n }\n\n await refreshChangedModule(session, changedPath, module, module.ssrModule ?? null);\n};\n\nconst awaitMissingImport = (session: DevSession, changedPath: string, cause: unknown): void => {\n const missingName = missingImportName(cause);\n\n if (missingName === null) {\n session.pendingSaves.delete(changedPath);\n\n return;\n }\n\n session.pendingSaves.set(changedPath, missingName);\n};\n\nconst applySave = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n try {\n await applyModuleChange(session, changedPath, action);\n } catch (error_) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n awaitMissingImport(session, changedPath, error_);\n error(\"Hot reload failed:\", error_);\n }\n};\n\nconst savesAwaiting = (session: DevSession, createdPath: string): string[] =>\n [...session.pendingSaves]\n .filter(([, missingName]) => isMissingImport(createdPath, missingName))\n .map(([changedPath]) => changedPath);\n\nconst retryPendingSaves = async (session: DevSession, waiting: string[]): Promise<void> => {\n for (const changedPath of waiting) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n await applySave(session, changedPath, RETRY_ACTION);\n }\n};\n\nconst handleFileCreate = async (session: DevSession, createdPath: string): Promise<void> => {\n const waiting = savesAwaiting(session, createdPath);\n\n if (waiting.length === 0) {\n return;\n }\n\n session.deps.log(`File created: ${createdPath}`);\n\n if (session.failure.isDown()) {\n await requestRestart(session);\n\n return;\n }\n\n await retryPendingSaves(session, waiting);\n};\n\nconst handleFileRemove = async (session: DevSession, removedPath: string): Promise<void> => {\n if (!session.server.moduleGraph.getModuleById(removedPath)) {\n return;\n }\n\n session.deps.log(`File removed: ${removedPath}`);\n await requestRestart(session);\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 restartForServerConfig = async (session: DevSession, changedPath: string): Promise<void> => {\n session.deps.log(`Server config changed: ${changedPath}`);\n await requestRestart(session);\n};\n\nconst applyChange = async (session: DevSession, change: WatchedChange): Promise<void> => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (isCatalogSource(session.server.config.root, change.path)) {\n session.deps.log(`Translation catalog changed: ${change.path}`);\n await requestRestart(session);\n\n return;\n }\n\n if (isServerConfigFile(session.server.config, change.path)) {\n await restartForServerConfig(session, change.path);\n\n return;\n }\n\n if (change.event === \"add\") {\n await handleFileCreate(session, change.path);\n\n return;\n }\n\n if (change.event === \"unlink\") {\n await handleFileRemove(session, change.path);\n\n return;\n }\n\n await applySave(session, change.path, SAVE_ACTION);\n};\n\nconst watchProjectFiles = (session: DevSession): void => {\n const queue = createChangeQueue((change) => applyChange(session, change));\n\n for (const event of WATCH_EVENTS) {\n session.server.watcher.on(event, (path) => {\n queue.enqueue({ event, path });\n });\n }\n};\n\nconst onShutdownSignal = (session: DevSession): (() => Promise<void>) => async () => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.deps.log(\"Received shutdown signal - stopping dev runner...\");\n\n await session.controller.shutdown(() => {\n session.deps.quitDefaultApplication();\n });\n};\n\nconst closeAndExit = async (session: DevSession, code = 0): Promise<never> => {\n try {\n await session.controller.shutdown((): void => undefined);\n } catch (error_) {\n error(\"Error closing server:\", error_);\n\n return session.deps.exit(1);\n }\n\n return session.deps.exit(code);\n};\n\nconst isSessionInactive = (session: DevSession): boolean => {\n if (session.controller.isShuttingDown()) {\n return true;\n }\n\n if (!session.failure.isDown()) {\n return false;\n }\n\n parkSession(session);\n\n return true;\n};\n\nconst stopForApplicationQuit = (session: DevSession): Promise<never> => {\n session.deps.log(\"Application quit - stopping dev runner...\");\n\n return closeAndExit(session);\n};\n\nconst settleUnmount = (session: DevSession, wasRefreshing: boolean): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n if (!wasRefreshing) {\n void stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application unmounted during Fast Refresh - restarting dev runner...\");\n session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst handleApplicationShutdown = (session: DevSession): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n const wasRefreshing = session.refreshTracker.isRefreshing();\n\n session.failure.settleUnmount(() => {\n settleUnmount(session, wasRefreshing);\n });\n};\n\nconst onApplicationShutdown = (session: DevSession): (() => void) => () => {\n handleApplicationShutdown(session);\n};\n\nconst refusedExitCode = (): number => (process.exitCode === undefined ? 1 : Number(process.exitCode));\n\nconst connectApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const { deps, server } = session;\n deps.watchApplicationShutdown(onApplicationShutdown(session));\n const applicationId = (await deps.getConfiguredApplicationId(process.cwd())) ?? liveApplicationId;\n deps.log(`Connected application ID: ${applicationId}`);\n await deps.startMcpClient(applicationId, (id) => loadModuleExclusively(server, id));\n};\n\nconst stopForOwnedApplicationId = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n session.deps.log(\n `Another process already owns ${liveApplicationId}, so this session can never show a window - ` +\n \"stopping dev runner. Quit that instance or change applicationId, then start gtkx dev again.\",\n );\n\n await closeAndExit(session, OWNED_ID_EXIT_CODE);\n};\n\nconst stopForStoppedApplication = async (session: DevSession, instance: ApplicationInstance): Promise<void> => {\n if (session.failure.hasReported()) {\n session.deps.log(\"Application stopped before the dev runner attached.\");\n session.failure.fail();\n\n return;\n }\n\n if (instance === \"shutDown\") {\n await stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application refused its command line - stopping dev runner...\");\n await closeAndExit(session, refusedExitCode());\n};\n\nconst connectLiveApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const instance = session.deps.getApplicationInstance();\n\n if (instance === \"primary\") {\n await connectApplication(session, liveApplicationId);\n\n return;\n }\n\n if (instance === \"remote\") {\n await stopForOwnedApplicationId(session, liveApplicationId);\n\n return;\n }\n\n await stopForStoppedApplication(session, instance);\n};\n\nconst attachApplication = async (session: DevSession): Promise<void> => {\n const { deps, failure } = session;\n\n const liveApplicationId = await deps.waitForApplicationId(\n APPLICATION_MOUNT_TIMEOUT_MS,\n () => !failure.isDown(),\n );\n\n if (failure.isDown()) {\n return;\n }\n\n if (liveApplicationId === null) {\n deps.log(\"Entry did not mount an application - MCP client not started.\");\n\n return;\n }\n\n await connectLiveApplication(session, liveApplicationId);\n};\n\nconst loadEntry = async (session: DevSession, entryPath: string): Promise<void> => {\n session.deps.log(`Loading entry: ${entryPath}`);\n\n try {\n await loadModuleExclusively(session.server, entryPath);\n } catch (error_) {\n awaitMissingImport(session, entryPath, error_);\n session.failure.fail(error_);\n }\n};\n\nconst hasApplicationStopped = (instance: ApplicationInstance): boolean =>\n instance === \"shutDown\" || instance === \"unregistered\";\n\nconst isApplicationLost = (session: DevSession): boolean =>\n session.failure.hasReported() && hasApplicationStopped(session.deps.getApplicationInstance());\n\nconst announceReady = (session: DevSession): void => {\n if (isApplicationLost(session)) {\n session.failure.fail();\n }\n\n if (isSessionInactive(session)) {\n return;\n }\n\n session.deps.log(\"HMR enabled - watching for changes...\");\n};\n\nconst createSession = (server: DevServer, deps: DevRunnerDeps): DevSession => {\n const refreshTracker = createRefreshTracker(deps.performRefresh);\n\n return {\n server,\n deps: { ...deps, performRefresh: refreshTracker.performRefresh },\n controller: createShutdownController(server, deps),\n refreshTracker,\n failure: createFailureTracker((cause) => {\n announceFailure(server, cause);\n }, refreshTracker.isRefreshing),\n pendingSaves: new Map(),\n };\n};\n\nconst createDevRunner = (deps: DevRunnerDeps): DevRunner => ({\n async run(entryPath: string): Promise<void> {\n const server = await deps.createServer(createDevServerConfig(process.cwd(), deps.plugins(entryPath)));\n const session = createSession(server, deps);\n deps.installShutdownHandlers(onShutdownSignal(session));\n\n deps.watchUncaughtErrors((cause) => {\n session.failure.report(cause);\n });\n\n watchProjectFiles(session);\n await loadEntry(session, entryPath);\n await attachApplication(session);\n announceReady(session);\n },\n});\n\nexport { createDevRunner, type DevRunnerDeps };\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApplicationInstance } from \"@gtkx/runtime/internal\";\nimport type { InlineConfig, Plugin } from \"vite\";\nimport { error, warn } from \"@gtkx/utils\";\nimport { isCatalogSource } from \"../i18n/catalogs.js\";\nimport { loadModuleExclusively, withExclusiveLoad } from \"../internal/module-loads.js\";\nimport { createChangeQueue, type WatchedChange } from \"./change-queue.js\";\nimport { createFailureTracker, type FailureTracker } from \"./failure-tracker.js\";\nimport { isMissingImport, missingImportName } from \"./missing-import.js\";\nimport { createRefreshTracker, type RefreshTracker } from \"./refresh-tracker.js\";\nimport { RESTART_EXIT_CODE } from \"./supervisor.js\";\nimport {\n createDevServerConfig,\n type DevServer,\n type DevServerChangedModule,\n type DevServerWatchEvent,\n isServerConfigFile,\n} from \"./vite-dev-server.js\";\n\ntype LoadAppModule = (id: string) => Promise<Record<string, unknown>>;\n\ntype DevRunnerDeps = {\n createServer(config: InlineConfig): Promise<DevServer>;\n waitForApplicationId(timeoutMs: number, shouldKeepWaiting: () => boolean): Promise<string | null>;\n getConfiguredApplicationId(root: string): Promise<string | undefined>;\n startMcpClient(applicationId: string, loadAppModule: LoadAppModule): Promise<unknown>;\n stopMcpClient(): void;\n watchApplicationShutdown(onShutdown: () => void): void;\n watchUncaughtErrors(onUncaughtError: (cause: unknown) => void): void;\n getApplicationInstance(): ApplicationInstance;\n installShutdownHandlers(onSignal: () => void | Promise<void>): void;\n quitDefaultApplication(): void;\n performRefresh: () => void;\n isRefreshBoundary(module: Record<string, unknown>): boolean;\n staleExportName(previous: Record<string, unknown>, current: Record<string, unknown>): string | null;\n readFileRevision(path: string): Promise<string>;\n hasWrittenCatalog(path: string): boolean;\n plugins(entryPath: string): 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\ntype DevSession = {\n server: DevServer;\n deps: DevRunnerDeps;\n controller: ShutdownController;\n refreshTracker: RefreshTracker;\n failure: FailureTracker;\n pendingSaves: Map<string, string>;\n};\n\ntype SettledLoad = {\n loadedExports: Record<string, unknown>;\n isSettled: boolean;\n};\n\ntype SettleAttempt = {\n loadedExports: Record<string, unknown> | null;\n module: DevServerChangedModule;\n};\n\nconst APPLICATION_MOUNT_TIMEOUT_MS = 10_000;\nconst OWNED_ID_EXIT_CODE = 1;\nconst LOAD_ATTEMPT_LIMIT = 5;\nconst WATCH_EVENTS: DevServerWatchEvent[] = [\"add\", \"change\", \"unlink\"];\nconst SKIP_REASON = `did not settle in ${String(LOAD_ATTEMPT_LIMIT)} attempts; save it again to patch the window.`;\nconst DROPPED_REFRESH = \"Fast Refresh dropped\";\nconst SAVE_ACTION = \"File changed\";\nconst RETRY_ACTION = \"Retrying pending save\";\n\nconst announceFailure = (server: DevServer, cause: unknown): void => {\n if (cause instanceof Error) {\n server.ssrFixStacktrace(cause);\n }\n\n error(\"Application error; keeping the dev server up. Fix the error and save again.\", cause);\n};\n\nconst parkSession = (session: DevSession): void => {\n session.deps.log(\"Waiting for a change to restart the application...\");\n};\n\nconst requestRestart = async (session: DevSession): Promise<never> => {\n session.deps.log(\"Full restart (process restart)\");\n\n try {\n await session.server.close();\n } catch (error_) {\n error(\"Error closing server before the restart:\", error_);\n }\n\n return session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst requiresRestart = (session: DevSession, module: DevServerChangedModule): boolean => {\n if (session.failure.isDown()) {\n return true;\n }\n\n const loadedExports = module.ssrModule;\n\n if (!loadedExports) {\n return false;\n }\n\n return !session.deps.isRefreshBoundary(loadedExports);\n};\n\nconst invalidateChangedModule = (session: DevSession, module: DevServerChangedModule): void => {\n session.server.moduleGraph.invalidateModule(module);\n\n for (const importer of module.importers) {\n session.server.moduleGraph.invalidateModule(importer);\n }\n};\n\nconst isEvaluationCurrent = (\n session: DevSession,\n changedPath: string,\n loadedExports: Record<string, unknown>,\n): boolean => {\n const evaluated = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!evaluated?.ssrTransformResult) {\n return false;\n }\n\n return evaluated.ssrModule === loadedExports;\n};\n\nconst loadInvalidatedModule = (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettledLoad> =>\n withExclusiveLoad(session.server, async () => {\n const revision = await session.deps.readFileRevision(changedPath);\n invalidateChangedModule(session, module);\n const loadedExports = await session.server.ssrLoadModule(changedPath);\n const settledRevision = await session.deps.readFileRevision(changedPath);\n\n return {\n loadedExports,\n isSettled: settledRevision === revision && isEvaluationCurrent(session, changedPath, loadedExports),\n };\n });\n\nconst settleAttempt = async (\n session: DevSession,\n changedPath: string,\n module: DevServerChangedModule,\n): Promise<SettleAttempt> => {\n const { loadedExports, isSettled } = await loadInvalidatedModule(session, changedPath, module);\n\n if (isSettled) {\n return { loadedExports, module };\n }\n\n return { loadedExports: null, module: session.server.moduleGraph.getModuleById(changedPath) ?? module };\n};\n\nconst loadSettledExports = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n): Promise<Record<string, unknown> | null> => {\n let module = changedModule;\n\n for (let round = 0; round < LOAD_ATTEMPT_LIMIT && !session.controller.isShuttingDown(); round++) {\n const attempt = await settleAttempt(session, changedPath, module);\n\n if (attempt.loadedExports) {\n return attempt.loadedExports;\n }\n\n module = attempt.module;\n }\n\n return null;\n};\n\nconst droppedExportName = (previous: Record<string, unknown>, current: Record<string, unknown>): string | null => {\n const kept = new Set(Object.keys(current));\n\n for (const name of Object.keys(previous)) {\n if (!kept.has(name)) {\n return name;\n }\n }\n\n return null;\n};\n\nconst unpatchedExportReason = (\n session: DevSession,\n previous: Record<string, unknown> | null,\n current: Record<string, unknown>,\n): string | null => {\n if (!previous) {\n return null;\n }\n\n const dropped = droppedExportName(previous, current);\n\n if (dropped !== null) {\n return `no longer exports ${dropped}, which its importers still hold`;\n }\n\n const stale = session.deps.staleExportName(previous, current);\n\n if (stale === null) {\n return null;\n }\n\n return `renamed the component it exports as ${stale}, which the window is still rendering`;\n};\n\nconst refreshChangedModule = async (\n session: DevSession,\n changedPath: string,\n changedModule: DevServerChangedModule,\n previous: Record<string, unknown> | null,\n): Promise<void> => {\n const loadedExports = await loadSettledExports(session, changedPath, changedModule);\n\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (!loadedExports) {\n warn(`Fast Refresh skipped: ${changedPath} ${SKIP_REASON}`);\n\n return;\n }\n\n if (!session.deps.isRefreshBoundary(loadedExports)) {\n await requestRestart(session);\n\n return;\n }\n\n const unpatched = unpatchedExportReason(session, previous, loadedExports);\n\n if (unpatched !== null) {\n warn(`${DROPPED_REFRESH}: ${changedPath} ${unpatched}`);\n await requestRestart(session);\n\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n session.deps.log(\"Running Fast Refresh...\");\n session.deps.performRefresh();\n session.deps.log(\"Fast Refresh complete\");\n};\n\nconst applyModuleChange = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n const module = session.server.moduleGraph.getModuleById(changedPath);\n\n if (!module) {\n return;\n }\n\n session.deps.log(`${action}: ${changedPath}`);\n\n if (requiresRestart(session, module)) {\n await requestRestart(session);\n\n return;\n }\n\n await refreshChangedModule(session, changedPath, module, module.ssrModule ?? null);\n};\n\nconst awaitMissingImport = (session: DevSession, changedPath: string, cause: unknown): void => {\n const missingName = missingImportName(cause);\n\n if (missingName === null) {\n session.pendingSaves.delete(changedPath);\n\n return;\n }\n\n session.pendingSaves.set(changedPath, missingName);\n};\n\nconst applySave = async (session: DevSession, changedPath: string, action: string): Promise<void> => {\n try {\n await applyModuleChange(session, changedPath, action);\n } catch (error_) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n awaitMissingImport(session, changedPath, error_);\n error(\"Hot reload failed:\", error_);\n }\n};\n\nconst savesAwaiting = (session: DevSession, createdPath: string): string[] =>\n [...session.pendingSaves]\n .filter(([, missingName]) => isMissingImport(createdPath, missingName))\n .map(([changedPath]) => changedPath);\n\nconst retryPendingSaves = async (session: DevSession, waiting: string[]): Promise<void> => {\n for (const changedPath of waiting) {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.pendingSaves.delete(changedPath);\n await applySave(session, changedPath, RETRY_ACTION);\n }\n};\n\nconst handleFileCreate = async (session: DevSession, createdPath: string): Promise<void> => {\n const waiting = savesAwaiting(session, createdPath);\n\n if (waiting.length === 0) {\n return;\n }\n\n session.deps.log(`File created: ${createdPath}`);\n\n if (session.failure.isDown()) {\n await requestRestart(session);\n\n return;\n }\n\n await retryPendingSaves(session, waiting);\n};\n\nconst handleFileRemove = async (session: DevSession, removedPath: string): Promise<void> => {\n if (!session.server.moduleGraph.getModuleById(removedPath)) {\n return;\n }\n\n session.deps.log(`File removed: ${removedPath}`);\n await requestRestart(session);\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 restartForServerConfig = async (session: DevSession, changedPath: string): Promise<void> => {\n session.deps.log(`Server config changed: ${changedPath}`);\n await requestRestart(session);\n};\n\nconst restartForCatalog = async (session: DevSession, changedPath: string): Promise<void> => {\n if (session.deps.hasWrittenCatalog(changedPath)) {\n return;\n }\n\n session.deps.log(`Translation catalog changed: ${changedPath}`);\n await requestRestart(session);\n};\n\nconst applyChange = async (session: DevSession, change: WatchedChange): Promise<void> => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n if (isCatalogSource(session.server.config.root, change.path)) {\n await restartForCatalog(session, change.path);\n\n return;\n }\n\n if (isServerConfigFile(session.server.config, change.path)) {\n await restartForServerConfig(session, change.path);\n\n return;\n }\n\n if (change.event === \"add\") {\n await handleFileCreate(session, change.path);\n\n return;\n }\n\n if (change.event === \"unlink\") {\n await handleFileRemove(session, change.path);\n\n return;\n }\n\n await applySave(session, change.path, SAVE_ACTION);\n};\n\nconst watchProjectFiles = (session: DevSession): void => {\n const queue = createChangeQueue((change) => applyChange(session, change));\n\n for (const event of WATCH_EVENTS) {\n session.server.watcher.on(event, (path) => {\n queue.enqueue({ event, path });\n });\n }\n};\n\nconst onShutdownSignal = (session: DevSession): (() => Promise<void>) => async () => {\n if (session.controller.isShuttingDown()) {\n return;\n }\n\n session.deps.log(\"Received shutdown signal - stopping dev runner...\");\n\n await session.controller.shutdown(() => {\n session.deps.quitDefaultApplication();\n });\n};\n\nconst closeAndExit = async (session: DevSession, code = 0): Promise<never> => {\n try {\n await session.controller.shutdown((): void => undefined);\n } catch (error_) {\n error(\"Error closing server:\", error_);\n\n return session.deps.exit(1);\n }\n\n return session.deps.exit(code);\n};\n\nconst isSessionInactive = (session: DevSession): boolean => {\n if (session.controller.isShuttingDown()) {\n return true;\n }\n\n if (!session.failure.isDown()) {\n return false;\n }\n\n parkSession(session);\n\n return true;\n};\n\nconst stopForApplicationQuit = (session: DevSession): Promise<never> => {\n session.deps.log(\"Application quit - stopping dev runner...\");\n\n return closeAndExit(session);\n};\n\nconst settleUnmount = (session: DevSession, wasRefreshing: boolean): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n if (!wasRefreshing) {\n void stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application unmounted during Fast Refresh - restarting dev runner...\");\n session.deps.exit(RESTART_EXIT_CODE);\n};\n\nconst handleApplicationShutdown = (session: DevSession): void => {\n if (isSessionInactive(session)) {\n return;\n }\n\n const wasRefreshing = session.refreshTracker.isRefreshing();\n\n session.failure.settleUnmount(() => {\n settleUnmount(session, wasRefreshing);\n });\n};\n\nconst onApplicationShutdown = (session: DevSession): (() => void) => () => {\n handleApplicationShutdown(session);\n};\n\nconst refusedExitCode = (): number => (process.exitCode === undefined ? 1 : Number(process.exitCode));\n\nconst connectApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const { deps, server } = session;\n deps.watchApplicationShutdown(onApplicationShutdown(session));\n const applicationId = (await deps.getConfiguredApplicationId(process.cwd())) ?? liveApplicationId;\n deps.log(`Connected application ID: ${applicationId}`);\n await deps.startMcpClient(applicationId, (id) => loadModuleExclusively(server, id));\n};\n\nconst stopForOwnedApplicationId = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n session.deps.log(\n `Another process already owns ${liveApplicationId}, so this session can never show a window - ` +\n \"stopping dev runner. Quit that instance or change applicationId, then start gtkx dev again.\",\n );\n\n await closeAndExit(session, OWNED_ID_EXIT_CODE);\n};\n\nconst stopForStoppedApplication = async (session: DevSession, instance: ApplicationInstance): Promise<void> => {\n if (session.failure.hasReported()) {\n session.deps.log(\"Application stopped before the dev runner attached.\");\n session.failure.fail();\n\n return;\n }\n\n if (instance === \"shutDown\") {\n await stopForApplicationQuit(session);\n\n return;\n }\n\n session.deps.log(\"Application refused its command line - stopping dev runner...\");\n await closeAndExit(session, refusedExitCode());\n};\n\nconst connectLiveApplication = async (session: DevSession, liveApplicationId: string): Promise<void> => {\n const instance = session.deps.getApplicationInstance();\n\n if (instance === \"primary\") {\n await connectApplication(session, liveApplicationId);\n\n return;\n }\n\n if (instance === \"remote\") {\n await stopForOwnedApplicationId(session, liveApplicationId);\n\n return;\n }\n\n await stopForStoppedApplication(session, instance);\n};\n\nconst attachApplication = async (session: DevSession): Promise<void> => {\n const { deps, failure } = session;\n\n const liveApplicationId = await deps.waitForApplicationId(\n APPLICATION_MOUNT_TIMEOUT_MS,\n () => !failure.isDown(),\n );\n\n if (failure.isDown()) {\n return;\n }\n\n if (liveApplicationId === null) {\n deps.log(\"Entry did not mount an application - MCP client not started.\");\n\n return;\n }\n\n await connectLiveApplication(session, liveApplicationId);\n};\n\nconst loadEntry = async (session: DevSession, entryPath: string): Promise<void> => {\n session.deps.log(`Loading entry: ${entryPath}`);\n\n try {\n await loadModuleExclusively(session.server, entryPath);\n } catch (error_) {\n awaitMissingImport(session, entryPath, error_);\n session.failure.fail(error_);\n }\n};\n\nconst hasApplicationStopped = (instance: ApplicationInstance): boolean =>\n instance === \"shutDown\" || instance === \"unregistered\";\n\nconst isApplicationLost = (session: DevSession): boolean =>\n session.failure.hasReported() && hasApplicationStopped(session.deps.getApplicationInstance());\n\nconst announceReady = (session: DevSession): void => {\n if (isApplicationLost(session)) {\n session.failure.fail();\n }\n\n if (isSessionInactive(session)) {\n return;\n }\n\n session.deps.log(\"HMR enabled - watching for changes...\");\n};\n\nconst createSession = (server: DevServer, deps: DevRunnerDeps): DevSession => {\n const refreshTracker = createRefreshTracker(deps.performRefresh);\n\n return {\n server,\n deps: { ...deps, performRefresh: refreshTracker.performRefresh },\n controller: createShutdownController(server, deps),\n refreshTracker,\n failure: createFailureTracker((cause) => {\n announceFailure(server, cause);\n }, refreshTracker.isRefreshing),\n pendingSaves: new Map(),\n };\n};\n\nconst createDevRunner = (deps: DevRunnerDeps): DevRunner => ({\n async run(entryPath: string): Promise<void> {\n const server = await deps.createServer(createDevServerConfig(process.cwd(), deps.plugins(entryPath)));\n const session = createSession(server, deps);\n deps.installShutdownHandlers(onShutdownSignal(session));\n\n deps.watchUncaughtErrors((cause) => {\n session.failure.report(cause);\n });\n\n watchProjectFiles(session);\n await loadEntry(session, entryPath);\n await attachApplication(session);\n announceReady(session);\n },\n});\n\nexport { createDevRunner, type DevRunnerDeps };\n"]}
@@ -9,7 +9,8 @@ type SupervisedChild = {
9
9
  type ForkRunner = (modulePath: string, args: string[], env: NodeJS.ProcessEnv, cwd: string) => SupervisedChild;
10
10
  type DevWatch = {
11
11
  paths: string[];
12
- regenerate: () => Promise<void>;
12
+ resolvePaths: () => string[];
13
+ regenerate: () => Promise<string[]>;
13
14
  };
14
15
  type DevSupervisorOptions = {
15
16
  entryPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAOA,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,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;AAE/G,KAAK,QAAQ,GAAG;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC,CAAC;AAiBF,KAAK,oBAAoB,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACjC,CAAC;AAOF,QAAA,MAAM,iBAAiB,KAAK,CAAC;AA6O7B,QAAA,MAAM,gBAAgB,GAAU,SAAS,oBAAoB,KAAG,OAAO,CAAC,KAAK,CAuB5E,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,QAAQ,GAChB,CAAC"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAOA,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,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;AAE/G,KAAK,QAAQ,GAAG;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACvC,CAAC;AAoBF,KAAK,oBAAoB,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACjC,CAAC;AAOF,QAAA,MAAM,iBAAiB,KAAK,CAAC;AA0X7B,QAAA,MAAM,gBAAgB,GAAU,SAAS,oBAAoB,KAAG,OAAO,CAAC,KAAK,CA0B5E,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,QAAQ,GAChB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { error, exitCodeForSignal, info, installGracefulShutdown } from "@gtkx/utils";
2
2
  import { fork as nodeFork } from "node:child_process";
3
- import { watch as watchFs } from "node:fs";
4
- import { basename, dirname } from "node:path";
3
+ import { statSync, watch as watchFs } from "node:fs";
4
+ import { basename, dirname, join, relative } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from "./entry-env.js";
7
7
  const DEV_RUNNER_URL = new URL("../../bin/gtkx-dev-runner.js", import.meta.url);
@@ -72,38 +72,76 @@ const launch = (state) => {
72
72
  handleChildExit(state, code, signal);
73
73
  });
74
74
  };
75
- const isRestartBlocked = (state) => state.isRestarting || state.isShuttingDown;
76
- const relaunchAfterExit = (state) => {
75
+ const runPendingRestart = (state) => {
77
76
  state.isRestarting = false;
77
+ if (!state.isRestartPending || state.isShuttingDown) {
78
+ return;
79
+ }
80
+ state.isRestartPending = false;
81
+ void restart(state);
82
+ };
83
+ const relaunchAfterExit = (state) => {
78
84
  if (state.isShuttingDown) {
85
+ state.isRestarting = false;
79
86
  return;
80
87
  }
81
88
  info("Restarting dev runner...");
82
89
  launch(state);
90
+ runPendingRestart(state);
91
+ };
92
+ const isSupervisorShuttingDown = (state) => state.isShuttingDown;
93
+ const reconcileConfigWatchers = (state, paths, previous) => {
94
+ const changed = changedWatchPaths(previous, paths);
95
+ closeWatchers(state);
96
+ if (state.watch !== undefined) {
97
+ state.watch.paths = paths;
98
+ }
99
+ if (state.isShuttingDown) {
100
+ return;
101
+ }
102
+ installConfigWatchers(state);
103
+ if (changed.length > 0 && !state.isRestartPending) {
104
+ scheduleRestart(state, changed);
105
+ }
106
+ };
107
+ const consumeChangedPaths = (state) => {
108
+ const changed = [...state.changedPaths].map((path) => relative(state.cwd, path));
109
+ state.changedPaths.clear();
110
+ return changed.length === 0 ? basename(state.configFile) : changed.join(", ");
83
111
  };
84
112
  const restart = async (state) => {
85
113
  const watch = state.watch;
86
- if (watch === undefined || isRestartBlocked(state)) {
114
+ if (watch === undefined || state.isShuttingDown) {
115
+ return;
116
+ }
117
+ if (state.isRestarting) {
118
+ state.isRestartPending = true;
87
119
  return;
88
120
  }
89
121
  state.isRestarting = true;
90
- info("gtkx.config.ts changed; regenerating bindings...");
122
+ info(`${consumeChangedPaths(state)} changed; regenerating bindings...`);
123
+ closeWatchers(state);
124
+ watch.paths = watch.resolvePaths();
125
+ const previous = snapshotWatchPaths(watch.paths);
126
+ installConfigWatchers(state);
91
127
  try {
92
- await watch.regenerate();
128
+ const paths = await watch.regenerate();
129
+ reconcileConfigWatchers(state, paths, previous);
93
130
  }
94
131
  catch (error_) {
132
+ reconcileConfigWatchers(state, watch.resolvePaths(), previous);
95
133
  error("Codegen failed; keeping the current dev runner. Fix the error and save again.", error_);
96
- state.isRestarting = false;
134
+ runPendingRestart(state);
97
135
  return;
98
136
  }
99
- if (state.isShuttingDown) {
137
+ if (isSupervisorShuttingDown(state)) {
100
138
  state.isRestarting = false;
101
139
  return;
102
140
  }
103
141
  const current = state.child;
104
142
  if (current === null) {
105
- state.isRestarting = false;
106
143
  launch(state);
144
+ runPendingRestart(state);
107
145
  return;
108
146
  }
109
147
  current.once("exit", () => {
@@ -111,55 +149,116 @@ const restart = async (state) => {
111
149
  });
112
150
  forwardSignal(current, "SIGTERM");
113
151
  };
114
- const scheduleRestart = (state, timer) => {
152
+ const scheduleRestart = (state, changedPaths = []) => {
153
+ const timer = state.restartTimer;
154
+ for (const path of changedPaths) {
155
+ state.changedPaths.add(path);
156
+ }
115
157
  if (timer.handle !== null) {
116
158
  clearTimeout(timer.handle);
117
159
  }
118
- timer.handle = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);
160
+ timer.handle = setTimeout(() => {
161
+ timer.handle = null;
162
+ void restart(state);
163
+ }, CONFIG_DEBOUNCE_MS);
119
164
  };
120
- const isWatchedChange = (state, names, filename) => {
165
+ const watchedChangePath = (state, directory, names, filename) => {
121
166
  if (filename === null || state.isShuttingDown) {
167
+ return undefined;
168
+ }
169
+ const name = basename(filename.toString());
170
+ return names.has(name) ? join(directory, name) : undefined;
171
+ };
172
+ const isDirectory = (path) => {
173
+ try {
174
+ return statSync(path, { throwIfNoEntry: false })?.isDirectory() === true;
175
+ }
176
+ catch {
122
177
  return false;
123
178
  }
124
- return names.has(basename(filename.toString()));
125
179
  };
180
+ const nearestWatchTarget = (path) => {
181
+ let directory = dirname(path);
182
+ let name = basename(path);
183
+ while (!isDirectory(directory)) {
184
+ const parent = dirname(directory);
185
+ if (parent === directory) {
186
+ break;
187
+ }
188
+ name = basename(directory);
189
+ directory = parent;
190
+ }
191
+ return { directory, name };
192
+ };
193
+ const watchTargets = (paths) => new Set(paths.flatMap((path) => {
194
+ const { directory, name } = nearestWatchTarget(path);
195
+ return [path, join(directory, name)];
196
+ }));
197
+ const watchPathState = (path) => {
198
+ try {
199
+ const stat = statSync(path, { bigint: true, throwIfNoEntry: false });
200
+ return stat === undefined
201
+ ? null
202
+ : [stat.dev, stat.ino, stat.mode, stat.size, stat.mtimeNs, stat.ctimeNs].join(":");
203
+ }
204
+ catch {
205
+ return null;
206
+ }
207
+ };
208
+ const snapshotWatchPaths = (paths) => new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));
209
+ const changedWatchPaths = (previous, paths) => [...watchTargets(paths)].filter((path) => {
210
+ const current = watchPathState(path);
211
+ return previous.has(path) ? previous.get(path) !== current : current !== null;
212
+ });
126
213
  const groupWatchNamesByDirectory = (paths) => {
127
214
  const namesByDirectory = new Map();
128
215
  for (const path of paths) {
129
- const directory = dirname(path);
216
+ const { directory, name } = nearestWatchTarget(path);
130
217
  const names = namesByDirectory.get(directory) ?? new Set();
131
- names.add(basename(path));
218
+ names.add(name);
132
219
  namesByDirectory.set(directory, names);
133
220
  }
134
221
  return namesByDirectory;
135
222
  };
136
- const watchConfigDirectory = (state, directory, names, timer) => {
137
- const watcher = watchFs(directory, (_event, filename) => {
138
- if (isWatchedChange(state, names, filename)) {
139
- scheduleRestart(state, timer);
140
- }
141
- });
142
- watcher.on("error", () => undefined);
143
- state.watchers.push(watcher);
223
+ const watchConfigDirectory = (state, directory, names) => {
224
+ try {
225
+ const watcher = watchFs(directory, (_event, filename) => {
226
+ const changed = watchedChangePath(state, directory, names, filename);
227
+ if (changed !== undefined) {
228
+ scheduleRestart(state, [changed]);
229
+ }
230
+ });
231
+ watcher.on("error", (cause) => {
232
+ error(`Configuration watch failed for ${directory}`, cause);
233
+ });
234
+ state.watchers.push(watcher);
235
+ }
236
+ catch (error_) {
237
+ error(`Configuration watch failed for ${directory}`, error_);
238
+ }
144
239
  };
145
240
  const installConfigWatchers = (state) => {
146
241
  const watch = state.watch;
147
242
  if (watch === undefined || watch.paths.length === 0) {
148
243
  return;
149
244
  }
150
- const timer = { handle: null };
151
245
  for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {
152
- watchConfigDirectory(state, directory, names, timer);
246
+ watchConfigDirectory(state, directory, names);
153
247
  }
154
248
  };
155
249
  const closeWatchers = (state) => {
156
250
  for (const watcher of state.watchers) {
157
251
  watcher.close();
158
252
  }
253
+ state.watchers = [];
159
254
  };
160
255
  const shutdownOnSignal = (state, signal) => new Promise((resolve) => {
161
256
  state.isShuttingDown = true;
162
257
  closeWatchers(state);
258
+ if (state.restartTimer.handle !== null) {
259
+ clearTimeout(state.restartTimer.handle);
260
+ state.restartTimer.handle = null;
261
+ }
163
262
  if (!state.child) {
164
263
  resolve();
165
264
  return;
@@ -187,10 +286,13 @@ const runDevSupervisor = async (options) => {
187
286
  args,
188
287
  watch,
189
288
  watchers: [],
289
+ changedPaths: new Set(),
290
+ restartTimer: { handle: null },
190
291
  fork,
191
292
  child: null,
192
293
  isShuttingDown: false,
193
294
  isRestarting: false,
295
+ isRestartPending: false,
194
296
  capturedChildExit: undefined,
195
297
  };
196
298
  installConfigWatchers(state);
@@ -1 +1 @@
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\";\nimport { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from \"./entry-env.js\";\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[], env: NodeJS.ProcessEnv, cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n regenerate: () => Promise<void>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n configFile: string;\n cwd: string;\n args: string[];\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n fork: ForkRunner;\n child: SupervisedChild | null;\n isShuttingDown: boolean;\n isRestarting: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DevSupervisorOptions = {\n entryPath: string;\n configFile: string;\n cwd: string;\n args?: string[] | undefined;\n watch?: DevWatch | undefined;\n fork?: ForkRunner | 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;\nconst CONDITION_FLAG = /^(?:--conditions|-C)(?:=.*)?$/;\nconst SPLIT_CONDITION_FLAG = /^(?:--conditions|-C)$/;\n\nconst withoutConditions = (argv: string[]): string[] =>\n argv.filter(\n (argument, index) => !CONDITION_FLAG.test(argument) && !SPLIT_CONDITION_FLAG.test(argv[index - 1] ?? \"\"),\n );\n\nconst getNodeOptions = (env: NodeJS.ProcessEnv): string | undefined => {\n const options = env.NODE_OPTIONS;\n\n return options === undefined ? undefined : withoutConditions(options.split(/\\s+/)).join(\" \");\n};\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, env, cwd) => {\n const nodeOptions = getNodeOptions(env);\n\n return nodeFork(modulePath, args, {\n cwd,\n env: { ...env, ...(nodeOptions !== undefined && { NODE_OPTIONS: nodeOptions }) },\n stdio: \"inherit\",\n detached: true,\n execArgv: withoutConditions(process.execArgv),\n });\n};\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.isRestarting) {\n return;\n }\n\n if (state.isShuttingDown) {\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(\n state.runnerPath,\n state.args,\n { ...process.env, [DEV_CONFIG_ENV]: state.configFile, [DEV_ENTRY_ENV]: state.entryPath },\n state.cwd,\n );\n\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.isRestarting || state.isShuttingDown;\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n state.isRestarting = false;\n\n if (state.isShuttingDown) {\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.isRestarting = 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.isRestarting = false;\n\n return;\n }\n\n if (state.isShuttingDown) {\n state.isRestarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n state.isRestarting = 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.isShuttingDown) {\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.isShuttingDown = 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 (options: DevSupervisorOptions): Promise<never> => {\n const { entryPath, configFile, cwd, args = [], watch, fork = defaultForkRunner } = options;\n\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n configFile,\n cwd,\n args,\n watch,\n watchers: [],\n fork,\n child: null,\n isShuttingDown: false,\n isRestarting: 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 {\n RESTART_EXIT_CODE,\n runDevSupervisor,\n type DevWatch,\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, statSync, watch as watchFs } from \"node:fs\";\nimport { basename, dirname, join, relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from \"./entry-env.js\";\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[], env: NodeJS.ProcessEnv, cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n resolvePaths: () => string[];\n regenerate: () => Promise<string[]>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n configFile: string;\n cwd: string;\n args: string[];\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n changedPaths: Set<string>;\n restartTimer: DebounceTimer;\n fork: ForkRunner;\n child: SupervisedChild | null;\n isShuttingDown: boolean;\n isRestarting: boolean;\n isRestartPending: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DevSupervisorOptions = {\n entryPath: string;\n configFile: string;\n cwd: string;\n args?: string[] | undefined;\n watch?: DevWatch | undefined;\n fork?: ForkRunner | 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;\nconst CONDITION_FLAG = /^(?:--conditions|-C)(?:=.*)?$/;\nconst SPLIT_CONDITION_FLAG = /^(?:--conditions|-C)$/;\n\nconst withoutConditions = (argv: string[]): string[] =>\n argv.filter(\n (argument, index) => !CONDITION_FLAG.test(argument) && !SPLIT_CONDITION_FLAG.test(argv[index - 1] ?? \"\"),\n );\n\nconst getNodeOptions = (env: NodeJS.ProcessEnv): string | undefined => {\n const options = env.NODE_OPTIONS;\n\n return options === undefined ? undefined : withoutConditions(options.split(/\\s+/)).join(\" \");\n};\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, env, cwd) => {\n const nodeOptions = getNodeOptions(env);\n\n return nodeFork(modulePath, args, {\n cwd,\n env: { ...env, ...(nodeOptions !== undefined && { NODE_OPTIONS: nodeOptions }) },\n stdio: \"inherit\",\n detached: true,\n execArgv: withoutConditions(process.execArgv),\n });\n};\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.isRestarting) {\n return;\n }\n\n if (state.isShuttingDown) {\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(\n state.runnerPath,\n state.args,\n { ...process.env, [DEV_CONFIG_ENV]: state.configFile, [DEV_ENTRY_ENV]: state.entryPath },\n state.cwd,\n );\n\n state.child = child;\n\n child.on(\"exit\", (code, signal) => {\n handleChildExit(state, code, signal);\n });\n};\n\nconst runPendingRestart = (state: SupervisorState): void => {\n state.isRestarting = false;\n\n if (!state.isRestartPending || state.isShuttingDown) {\n return;\n }\n\n state.isRestartPending = false;\n void restart(state);\n};\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n if (state.isShuttingDown) {\n state.isRestarting = false;\n\n return;\n }\n\n info(\"Restarting dev runner...\");\n launch(state);\n runPendingRestart(state);\n};\n\nconst isSupervisorShuttingDown = (state: SupervisorState): boolean => state.isShuttingDown;\n\nconst reconcileConfigWatchers = (\n state: SupervisorState,\n paths: string[],\n previous: ReadonlyMap<string, string | null>,\n): void => {\n const changed = changedWatchPaths(previous, paths);\n\n closeWatchers(state);\n\n if (state.watch !== undefined) {\n state.watch.paths = paths;\n }\n\n if (state.isShuttingDown) {\n return;\n }\n\n installConfigWatchers(state);\n\n if (changed.length > 0 && !state.isRestartPending) {\n scheduleRestart(state, changed);\n }\n};\n\nconst consumeChangedPaths = (state: SupervisorState): string => {\n const changed = [...state.changedPaths].map((path) => relative(state.cwd, path));\n state.changedPaths.clear();\n\n return changed.length === 0 ? basename(state.configFile) : changed.join(\", \");\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n const watch = state.watch;\n\n if (watch === undefined || state.isShuttingDown) {\n return;\n }\n\n if (state.isRestarting) {\n state.isRestartPending = true;\n\n return;\n }\n\n state.isRestarting = true;\n info(`${consumeChangedPaths(state)} changed; regenerating bindings...`);\n closeWatchers(state);\n watch.paths = watch.resolvePaths();\n const previous = snapshotWatchPaths(watch.paths);\n installConfigWatchers(state);\n\n try {\n const paths = await watch.regenerate();\n reconcileConfigWatchers(state, paths, previous);\n } catch (error_) {\n reconcileConfigWatchers(state, watch.resolvePaths(), previous);\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", error_);\n runPendingRestart(state);\n\n return;\n }\n\n if (isSupervisorShuttingDown(state)) {\n state.isRestarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n launch(state);\n runPendingRestart(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, changedPaths: string[] = []): void => {\n const timer = state.restartTimer;\n\n for (const path of changedPaths) {\n state.changedPaths.add(path);\n }\n\n if (timer.handle !== null) {\n clearTimeout(timer.handle);\n }\n\n timer.handle = setTimeout(() => {\n timer.handle = null;\n void restart(state);\n }, CONFIG_DEBOUNCE_MS);\n};\n\nconst watchedChangePath = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n filename: string | Buffer | null,\n): string | undefined => {\n if (filename === null || state.isShuttingDown) {\n return undefined;\n }\n\n const name = basename(filename.toString());\n\n return names.has(name) ? join(directory, name) : undefined;\n};\n\nconst isDirectory = (path: string): boolean => {\n try {\n return statSync(path, { throwIfNoEntry: false })?.isDirectory() === true;\n } catch {\n return false;\n }\n};\n\nconst nearestWatchTarget = (path: string): { directory: string; name: string } => {\n let directory = dirname(path);\n let name = basename(path);\n\n while (!isDirectory(directory)) {\n const parent = dirname(directory);\n\n if (parent === directory) {\n break;\n }\n\n name = basename(directory);\n directory = parent;\n }\n\n return { directory, name };\n};\n\nconst watchTargets = (paths: string[]): Set<string> =>\n new Set(paths.flatMap((path) => {\n const { directory, name } = nearestWatchTarget(path);\n\n return [path, join(directory, name)];\n }));\n\nconst watchPathState = (path: string): string | null => {\n try {\n const stat = statSync(path, { bigint: true, throwIfNoEntry: false });\n\n return stat === undefined\n ? null\n : [stat.dev, stat.ino, stat.mode, stat.size, stat.mtimeNs, stat.ctimeNs].join(\":\");\n } catch {\n return null;\n }\n};\n\nconst snapshotWatchPaths = (paths: string[]): Map<string, string | null> =>\n new Map([...watchTargets(paths)].map((path) => [path, watchPathState(path)]));\n\nconst changedWatchPaths = (\n previous: ReadonlyMap<string, string | null>,\n paths: string[],\n): string[] =>\n [...watchTargets(paths)].filter((path) => {\n const current = watchPathState(path);\n\n return previous.has(path) ? previous.get(path) !== current : current !== null;\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, name } = nearestWatchTarget(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(name);\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): void => {\n try {\n const watcher = watchFs(directory, (_event, filename) => {\n const changed = watchedChangePath(state, directory, names, filename);\n\n if (changed !== undefined) {\n scheduleRestart(state, [changed]);\n }\n });\n\n watcher.on(\"error\", (cause) => {\n error(`Configuration watch failed for ${directory}`, cause);\n });\n state.watchers.push(watcher);\n } catch (error_) {\n error(`Configuration watch failed for ${directory}`, error_);\n }\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 for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {\n watchConfigDirectory(state, directory, names);\n }\n};\n\nconst closeWatchers = (state: SupervisorState): void => {\n for (const watcher of state.watchers) {\n watcher.close();\n }\n\n state.watchers = [];\n};\n\nconst shutdownOnSignal = (state: SupervisorState, signal: NodeJS.Signals): Promise<void> =>\n new Promise<void>((resolve) => {\n state.isShuttingDown = true;\n closeWatchers(state);\n\n if (state.restartTimer.handle !== null) {\n clearTimeout(state.restartTimer.handle);\n state.restartTimer.handle = null;\n }\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 (options: DevSupervisorOptions): Promise<never> => {\n const { entryPath, configFile, cwd, args = [], watch, fork = defaultForkRunner } = options;\n\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n configFile,\n cwd,\n args,\n watch,\n watchers: [],\n changedPaths: new Set(),\n restartTimer: { handle: null },\n fork,\n child: null,\n isShuttingDown: false,\n isRestarting: false,\n isRestartPending: 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 {\n RESTART_EXIT_CODE,\n runDevSupervisor,\n type DevWatch,\n};\n"]}