@gtkx/cli 1.0.0-rc.1 → 1.0.0-rc.3
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.
- package/dist/builder.d.ts +3 -2
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -1
- package/dist/builder.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -6
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts +5 -5
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +26 -23
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/codegen/report.d.ts +2 -1
- package/dist/codegen/report.d.ts.map +1 -1
- package/dist/codegen/report.js +4 -2
- package/dist/codegen/report.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +10 -10
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +72 -47
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/codegen/store-resolver.d.ts +9 -6
- package/dist/codegen/store-resolver.d.ts.map +1 -1
- package/dist/codegen/store-resolver.js +24 -7
- package/dist/codegen/store-resolver.js.map +1 -1
- package/dist/commands/build.d.ts +4 -3
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +2 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts +2 -1
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +6 -4
- package/dist/commands/codegen.js.map +1 -1
- package/dist/commands/dev.d.ts +2 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +2 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs.d.ts +2 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +25 -7
- package/dist/commands/docs.js.map +1 -1
- package/dist/dev/icon-dir.d.ts +2 -1
- package/dist/dev/icon-dir.d.ts.map +1 -1
- package/dist/dev/icon-dir.js +6 -3
- package/dist/dev/icon-dir.js.map +1 -1
- package/dist/dev/refresh-tracker.d.ts +5 -4
- package/dist/dev/refresh-tracker.d.ts.map +1 -1
- package/dist/dev/refresh-tracker.js +6 -5
- package/dist/dev/refresh-tracker.js.map +1 -1
- package/dist/dev/runner-deps.d.ts +2 -1
- package/dist/dev/runner-deps.d.ts.map +1 -1
- package/dist/dev/runner-deps.js +20 -4
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/dev/runner-main.d.ts +2 -1
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +3 -2
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/runner.d.ts +6 -5
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +69 -38
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/schema-dir.d.ts +2 -1
- package/dist/dev/schema-dir.d.ts.map +1 -1
- package/dist/dev/schema-dir.js +4 -2
- package/dist/dev/schema-dir.js.map +1 -1
- package/dist/dev/supervisor.d.ts +7 -6
- package/dist/dev/supervisor.d.ts.map +1 -1
- package/dist/dev/supervisor.js +107 -67
- package/dist/dev/supervisor.js.map +1 -1
- package/dist/dev/vite-dev-server.d.ts +3 -3
- package/dist/dev/vite-dev-server.d.ts.map +1 -1
- package/dist/dev/vite-dev-server.js +2 -1
- package/dist/dev/vite-dev-server.js.map +1 -1
- package/dist/internal/banner.d.ts +2 -1
- package/dist/internal/banner.d.ts.map +1 -1
- package/dist/internal/banner.js +2 -1
- package/dist/internal/banner.js.map +1 -1
- package/dist/internal/data-dir.d.ts +3 -2
- package/dist/internal/data-dir.d.ts.map +1 -1
- package/dist/internal/data-dir.js +29 -14
- package/dist/internal/data-dir.js.map +1 -1
- package/dist/internal/entry-arg.d.ts +5 -4
- package/dist/internal/entry-arg.d.ts.map +1 -1
- package/dist/internal/entry-arg.js +10 -7
- package/dist/internal/entry-arg.js.map +1 -1
- package/dist/internal/errors.d.ts +3 -2
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +7 -5
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/list-files.d.ts +3 -2
- package/dist/internal/list-files.d.ts.map +1 -1
- package/dist/internal/list-files.js +5 -3
- package/dist/internal/list-files.js.map +1 -1
- package/dist/internal/resolve-cli-tool.d.ts +2 -1
- package/dist/internal/resolve-cli-tool.d.ts.map +1 -1
- package/dist/internal/resolve-cli-tool.js +17 -10
- package/dist/internal/resolve-cli-tool.js.map +1 -1
- package/dist/internal/staging-dir.d.ts +3 -2
- package/dist/internal/staging-dir.d.ts.map +1 -1
- package/dist/internal/staging-dir.js +3 -2
- package/dist/internal/staging-dir.js.map +1 -1
- package/dist/internal/xdg-data-dirs.d.ts +2 -1
- package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
- package/dist/internal/xdg-data-dirs.js +4 -2
- package/dist/internal/xdg-data-dirs.js.map +1 -1
- package/dist/mcp/client.d.ts +9 -4
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +106 -81
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/handlers.d.ts +3 -2
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js +89 -61
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +30 -13
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/serialize-widget.d.ts +3 -3
- package/dist/mcp/serialize-widget.d.ts.map +1 -1
- package/dist/mcp/serialize-widget.js +9 -6
- package/dist/mcp/serialize-widget.js.map +1 -1
- package/dist/mcp/testing-loader.d.ts +3 -4
- package/dist/mcp/testing-loader.d.ts.map +1 -1
- package/dist/mcp/testing-loader.js +43 -21
- package/dist/mcp/testing-loader.js.map +1 -1
- package/dist/mcp/widget-registry.d.ts +3 -2
- package/dist/mcp/widget-registry.d.ts.map +1 -1
- package/dist/mcp/widget-registry.js +4 -3
- package/dist/mcp/widget-registry.js.map +1 -1
- package/dist/refresh-globals.d.ts +2 -0
- package/dist/refresh-globals.d.ts.map +1 -0
- package/dist/refresh-globals.js +8 -0
- package/dist/refresh-globals.js.map +1 -0
- package/dist/refresh-runtime.d.ts +5 -11
- package/dist/refresh-runtime.d.ts.map +1 -1
- package/dist/refresh-runtime.js +16 -14
- package/dist/refresh-runtime.js.map +1 -1
- package/dist/settings/compile.d.ts +2 -1
- package/dist/settings/compile.d.ts.map +1 -1
- package/dist/settings/compile.js +6 -4
- package/dist/settings/compile.js.map +1 -1
- package/dist/settings/parser.d.ts +6 -5
- package/dist/settings/parser.d.ts.map +1 -1
- package/dist/settings/parser.js +26 -22
- package/dist/settings/parser.js.map +1 -1
- package/dist/settings/render.d.ts +3 -2
- package/dist/settings/render.d.ts.map +1 -1
- package/dist/settings/render.js +38 -64
- package/dist/settings/render.js.map +1 -1
- package/dist/settings/schema.d.ts +8 -8
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +61 -43
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-extensions.d.ts +4 -3
- package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
- package/dist/vite-plugins/asset-extensions.js +4 -3
- package/dist/vite-plugins/asset-extensions.js.map +1 -1
- package/dist/vite-plugins/built-url.d.ts +2 -1
- package/dist/vite-plugins/built-url.d.ts.map +1 -1
- package/dist/vite-plugins/built-url.js +19 -13
- package/dist/vite-plugins/built-url.js.map +1 -1
- package/dist/vite-plugins/css.d.ts +2 -1
- package/dist/vite-plugins/css.d.ts.map +1 -1
- package/dist/vite-plugins/css.js +23 -15
- package/dist/vite-plugins/css.js.map +1 -1
- package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +5 -4
- package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -1
- package/dist/vite-plugins/fast-refresh/refresh-filter.js +11 -7
- package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -1
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +4 -3
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
- package/dist/vite-plugins/fast-refresh/swc-refresh.js +45 -41
- package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
- package/dist/vite-plugins/icons.d.ts +2 -1
- package/dist/vite-plugins/icons.d.ts.map +1 -1
- package/dist/vite-plugins/icons.js +24 -20
- package/dist/vite-plugins/icons.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +2 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +4 -3
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/native.d.ts +2 -1
- package/dist/vite-plugins/native.d.ts.map +1 -1
- package/dist/vite-plugins/native.js +6 -4
- package/dist/vite-plugins/native.js.map +1 -1
- package/dist/vite-plugins/react-compiler.d.ts +3 -2
- package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
- package/dist/vite-plugins/react-compiler.js +26 -20
- package/dist/vite-plugins/react-compiler.js.map +1 -1
- package/dist/vite-plugins/react-dom-prebundle.d.ts +2 -1
- package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -1
- package/dist/vite-plugins/react-dom-prebundle.js +2 -1
- package/dist/vite-plugins/react-dom-prebundle.js.map +1 -1
- package/dist/vite-plugins/resource-init-module.d.ts +2 -1
- package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
- package/dist/vite-plugins/resource-init-module.js +39 -38
- package/dist/vite-plugins/resource-init-module.js.map +1 -1
- package/dist/vite-plugins/resource-shared.d.ts +7 -5
- package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
- package/dist/vite-plugins/resource-shared.js +17 -10
- package/dist/vite-plugins/resource-shared.js.map +1 -1
- package/dist/vite-plugins/resources.d.ts +3 -2
- package/dist/vite-plugins/resources.d.ts.map +1 -1
- package/dist/vite-plugins/resources.js +95 -55
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/settings-worker-env.d.ts +2 -1
- package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
- package/dist/vite-plugins/settings-worker-env.js +4 -2
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts +2 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +56 -32
- package/dist/vite-plugins/settings.js.map +1 -1
- package/dist/vite-plugins/strip-query.d.ts +3 -0
- package/dist/vite-plugins/strip-query.d.ts.map +1 -0
- package/dist/vite-plugins/strip-query.js +6 -0
- package/dist/vite-plugins/strip-query.js.map +1 -0
- package/dist/vite-plugins/undeclared-library.d.ts +3 -1
- package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
- package/dist/vite-plugins/undeclared-library.js +11 -8
- package/dist/vite-plugins/undeclared-library.js.map +1 -1
- package/dist/vite-plugins/virtual-module.d.ts +2 -2
- package/dist/vite-plugins/virtual-module.d.ts.map +1 -1
- package/dist/vite-plugins/virtual-module.js +5 -3
- package/dist/vite-plugins/virtual-module.js.map +1 -1
- package/dist/vitest-plugin.d.ts.map +1 -1
- package/dist/vitest-plugin.js.map +1 -1
- package/env.d.ts +21 -61
- package/package.json +12 -14
- package/src/babel-modules.d.ts +0 -2
- package/src/builder.ts +7 -6
- package/src/cli.ts +26 -6
- package/src/codegen/freshness.ts +39 -26
- package/src/codegen/report.ts +10 -2
- package/src/codegen/run-codegen.ts +131 -66
- package/src/codegen/store-resolver.ts +52 -15
- package/src/commands/build.ts +3 -2
- package/src/commands/codegen.ts +9 -4
- package/src/commands/dev.ts +3 -4
- package/src/commands/docs.ts +47 -7
- package/src/dev/icon-dir.ts +13 -3
- package/src/dev/refresh-tracker.ts +12 -8
- package/src/dev/runner-deps.ts +30 -7
- package/src/dev/runner-main.ts +4 -3
- package/src/dev/runner.ts +100 -41
- package/src/dev/schema-dir.ts +7 -2
- package/src/dev/supervisor.ts +169 -71
- package/src/dev/vite-dev-server.ts +4 -2
- package/src/internal/banner.ts +5 -1
- package/src/internal/data-dir.ts +47 -16
- package/src/internal/entry-arg.ts +16 -8
- package/src/internal/errors.ts +15 -7
- package/src/internal/list-files.ts +10 -4
- package/src/internal/resolve-cli-tool.ts +28 -12
- package/src/internal/staging-dir.ts +5 -2
- package/src/internal/xdg-data-dirs.ts +8 -2
- package/src/mcp/client.ts +143 -85
- package/src/mcp/handlers.ts +126 -69
- package/src/mcp/index.ts +38 -14
- package/src/mcp/serialize-widget.ts +15 -8
- package/src/mcp/testing-loader.ts +64 -23
- package/src/mcp/widget-registry.ts +11 -5
- package/src/refresh-globals.ts +10 -0
- package/src/refresh-runtime.ts +20 -16
- package/src/settings/compile.ts +7 -4
- package/src/settings/parser.ts +69 -30
- package/src/settings/render.ts +66 -66
- package/src/settings/schema.ts +100 -46
- package/src/vite-plugins/asset-extensions.ts +4 -3
- package/src/vite-plugins/built-url.ts +30 -15
- package/src/vite-plugins/css.ts +35 -20
- package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -10
- package/src/vite-plugins/fast-refresh/swc-refresh.ts +60 -47
- package/src/vite-plugins/icons.ts +40 -24
- package/src/vite-plugins/index.ts +7 -4
- package/src/vite-plugins/native.ts +14 -5
- package/src/vite-plugins/react-compiler.ts +44 -30
- package/src/vite-plugins/react-dom-prebundle.ts +4 -1
- package/src/vite-plugins/resource-init-module.ts +41 -38
- package/src/vite-plugins/resource-shared.ts +27 -14
- package/src/vite-plugins/resources.ts +154 -60
- package/src/vite-plugins/settings-worker-env.ts +7 -2
- package/src/vite-plugins/settings.ts +107 -42
- package/src/vite-plugins/strip-query.ts +7 -0
- package/src/vite-plugins/undeclared-library.ts +26 -16
- package/src/vite-plugins/virtual-module.ts +9 -2
- package/src/vitest-plugin.ts +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-main.js","sourceRoot":"","sources":["../../src/dev/runner-main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"runner-main.js","sourceRoot":"","sources":["../../src/dev/runner-main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACnC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,eAAe,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,OAAO,EAAE,IAAI,EAAE,CAAC","sourcesContent":["import { error } from \"@gtkx/utils\";\nimport { resolve } from \"node:path\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { prepareDevIconDir } from \"./icon-dir.js\";\nimport { createDevRunner } from \"./runner.js\";\nimport { prepareDevSchemaDir } from \"./schema-dir.js\";\n\nconst ENTRY_ARG_INDEX = 2;\n\nconst main = async (): Promise<void> => {\n if (process.channel) {\n process.once(\"disconnect\", () => {\n process.exit(0);\n });\n }\n\n const cwd = process.cwd();\n const entryArg = process.argv[ENTRY_ARG_INDEX];\n\n if (!entryArg) {\n error(\"Missing entry argument\");\n process.exit(1);\n }\n\n const dataDir = resolveDataDir(cwd);\n prepareDevSchemaDir(cwd, dataDir);\n prepareDevIconDir(cwd, dataDir);\n const entryPath = resolve(cwd, entryArg);\n const { defaultDevRunnerDeps } = await import(\"./runner-deps.js\");\n const runner = createDevRunner(defaultDevRunnerDeps());\n await runner.run(entryPath);\n};\n\nexport { main };\n"]}
|
package/dist/dev/runner.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import type { InlineConfig, Plugin } from "vite";
|
|
2
2
|
import { type DevServer } from "./vite-dev-server.js";
|
|
3
|
-
|
|
4
|
-
export type DevRunnerDeps = {
|
|
3
|
+
type DevRunnerDeps = {
|
|
5
4
|
createServer(config: InlineConfig): Promise<DevServer>;
|
|
6
|
-
|
|
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()
|
|
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
|
-
|
|
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
|
package/dist/dev/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/dev/runner.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/dev/runner.js
CHANGED
|
@@ -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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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.
|
|
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
|
package/dist/dev/runner.js.map
CHANGED
|
@@ -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"]}
|
package/dist/dev/schema-dir.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-dir.d.ts","sourceRoot":"","sources":["../../src/dev/schema-dir.ts"],"names":[],"mappings":"AAEA,
|
|
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"}
|
package/dist/dev/schema-dir.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { prependSchemaDir, stageAndCompileProjectSchemas } from "../settings/schema.js";
|
|
2
|
-
|
|
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,
|
|
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"]}
|
package/dist/dev/supervisor.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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":"
|
|
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"}
|
package/dist/dev/supervisor.js
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
75
|
+
await watch.regenerate();
|
|
55
76
|
}
|
|
56
|
-
catch (
|
|
57
|
-
error("Codegen failed; keeping the current dev runner. Fix the error and save again.",
|
|
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
|
|
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
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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) =>
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|