@gtkx/cli 0.20.0 → 1.0.0-rc.1
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/README.md +173 -0
- package/bin/gtkx-dev-runner.js +9 -0
- package/dist/builder.d.ts +2 -50
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +22 -48
- package/dist/builder.js.map +1 -1
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -124
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts +11 -0
- package/dist/codegen/freshness.d.ts.map +1 -0
- package/dist/codegen/freshness.js +42 -0
- package/dist/codegen/freshness.js.map +1 -0
- package/dist/codegen/report.d.ts +3 -0
- package/dist/codegen/report.d.ts.map +1 -0
- package/dist/codegen/report.js +16 -0
- package/dist/codegen/report.js.map +1 -0
- package/dist/codegen/run-codegen.d.ts +35 -0
- package/dist/codegen/run-codegen.d.ts.map +1 -0
- package/dist/codegen/run-codegen.js +133 -0
- package/dist/codegen/run-codegen.js.map +1 -0
- package/dist/codegen/store-resolver.d.ts +21 -0
- package/dist/codegen/store-resolver.d.ts.map +1 -0
- package/dist/codegen/store-resolver.js +52 -0
- package/dist/codegen/store-resolver.js.map +1 -0
- package/dist/commands/build.d.ts +9 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +33 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/codegen.d.ts +9 -0
- package/dist/commands/codegen.d.ts.map +1 -0
- package/dist/commands/codegen.js +40 -0
- package/dist/commands/codegen.js.map +1 -0
- package/dist/commands/dev.d.ts +5 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +21 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/docs.d.ts +19 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +59 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/dev/icon-dir.d.ts +2 -0
- package/dist/dev/icon-dir.d.ts.map +1 -0
- package/dist/dev/icon-dir.js +13 -0
- package/dist/dev/icon-dir.js.map +1 -0
- package/dist/dev/refresh-tracker.d.ts +6 -0
- package/dist/dev/refresh-tracker.d.ts.map +1 -0
- package/dist/dev/refresh-tracker.js +18 -0
- package/dist/dev/refresh-tracker.js.map +1 -0
- package/dist/dev/runner-deps.d.ts +3 -0
- package/dist/dev/runner-deps.d.ts.map +1 -0
- package/dist/dev/runner-deps.js +39 -0
- package/dist/dev/runner-deps.js.map +1 -0
- package/dist/dev/runner-main.d.ts +2 -0
- package/dist/dev/runner-main.d.ts.map +1 -0
- package/dist/dev/runner-main.js +28 -0
- package/dist/dev/runner-main.js.map +1 -0
- package/dist/dev/runner.d.ts +23 -0
- package/dist/dev/runner.d.ts.map +1 -0
- package/dist/dev/runner.js +88 -0
- package/dist/dev/runner.js.map +1 -0
- package/dist/dev/schema-dir.d.ts +2 -0
- package/dist/dev/schema-dir.d.ts.map +1 -0
- package/dist/dev/schema-dir.js +10 -0
- package/dist/dev/schema-dir.js.map +1 -0
- package/dist/dev/supervisor.d.ts +17 -0
- package/dist/dev/supervisor.d.ts.map +1 -0
- package/dist/dev/supervisor.js +142 -0
- package/dist/dev/supervisor.js.map +1 -0
- package/dist/dev/vite-dev-server.d.ts +21 -0
- package/dist/dev/vite-dev-server.d.ts.map +1 -0
- package/dist/dev/vite-dev-server.js +12 -0
- package/dist/dev/vite-dev-server.js.map +1 -0
- package/dist/internal/banner.d.ts +3 -0
- package/dist/internal/banner.d.ts.map +1 -0
- package/dist/internal/banner.js +8 -0
- package/dist/internal/banner.js.map +1 -0
- package/dist/internal/data-dir.d.ts +3 -0
- package/dist/internal/data-dir.d.ts.map +1 -0
- package/dist/internal/data-dir.js +37 -0
- package/dist/internal/data-dir.js.map +1 -0
- package/dist/internal/entry-arg.d.ts +19 -0
- package/dist/internal/entry-arg.d.ts.map +1 -0
- package/dist/internal/entry-arg.js +33 -0
- package/dist/internal/entry-arg.js.map +1 -0
- package/dist/internal/errors.d.ts +4 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +27 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/list-files.d.ts +6 -0
- package/dist/internal/list-files.d.ts.map +1 -0
- package/dist/internal/list-files.js +13 -0
- package/dist/internal/list-files.js.map +1 -0
- package/dist/internal/resolve-cli-tool.d.ts +2 -0
- package/dist/internal/resolve-cli-tool.d.ts.map +1 -0
- package/dist/internal/resolve-cli-tool.js +20 -0
- package/dist/internal/resolve-cli-tool.js.map +1 -0
- package/dist/internal/staging-dir.d.ts +3 -0
- package/dist/internal/staging-dir.d.ts.map +1 -0
- package/dist/internal/staging-dir.js +16 -0
- package/dist/internal/staging-dir.js.map +1 -0
- package/dist/internal/xdg-data-dirs.d.ts +2 -0
- package/dist/internal/xdg-data-dirs.d.ts.map +1 -0
- package/dist/internal/xdg-data-dirs.js +8 -0
- package/dist/internal/xdg-data-dirs.js.map +1 -0
- package/dist/mcp/client.d.ts +23 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +157 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/handlers.d.ts +8 -0
- package/dist/mcp/handlers.d.ts.map +1 -0
- package/dist/mcp/handlers.js +119 -0
- package/dist/mcp/handlers.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/serialize-widget.d.ts +10 -0
- package/dist/mcp/serialize-widget.d.ts.map +1 -0
- package/dist/mcp/serialize-widget.js +20 -0
- package/dist/mcp/serialize-widget.js.map +1 -0
- package/dist/mcp/testing-loader.d.ts +6 -0
- package/dist/mcp/testing-loader.d.ts.map +1 -0
- package/dist/mcp/testing-loader.js +25 -0
- package/dist/mcp/testing-loader.js.map +1 -0
- package/dist/mcp/widget-registry.d.ts +13 -0
- package/dist/mcp/widget-registry.d.ts.map +1 -0
- package/dist/mcp/widget-registry.js +38 -0
- package/dist/mcp/widget-registry.js.map +1 -0
- package/dist/refresh-runtime.d.ts +10 -20
- package/dist/refresh-runtime.d.ts.map +1 -1
- package/dist/refresh-runtime.js +12 -36
- package/dist/refresh-runtime.js.map +1 -1
- package/dist/settings/compile.d.ts +2 -0
- package/dist/settings/compile.d.ts.map +1 -0
- package/dist/settings/compile.js +19 -0
- package/dist/settings/compile.js.map +1 -0
- package/dist/settings/parser.d.ts +23 -0
- package/dist/settings/parser.d.ts.map +1 -0
- package/dist/settings/parser.js +117 -0
- package/dist/settings/parser.js.map +1 -0
- package/dist/settings/render.d.ts +4 -0
- package/dist/settings/render.d.ts.map +1 -0
- package/dist/settings/render.js +148 -0
- package/dist/settings/render.js.map +1 -0
- package/dist/settings/schema.d.ts +13 -0
- package/dist/settings/schema.d.ts.map +1 -0
- package/dist/settings/schema.js +103 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/vite-plugins/asset-extensions.d.ts +4 -0
- package/dist/vite-plugins/asset-extensions.d.ts.map +1 -0
- package/dist/vite-plugins/asset-extensions.js +27 -0
- package/dist/vite-plugins/asset-extensions.js.map +1 -0
- package/dist/vite-plugins/built-url.d.ts +3 -0
- package/dist/vite-plugins/built-url.d.ts.map +1 -0
- package/dist/{vite-plugin-gtkx-built-url.js → vite-plugins/built-url.js} +4 -17
- package/dist/vite-plugins/built-url.js.map +1 -0
- package/dist/vite-plugins/css.d.ts +3 -0
- package/dist/vite-plugins/css.d.ts.map +1 -0
- package/dist/vite-plugins/css.js +30 -0
- package/dist/vite-plugins/css.js.map +1 -0
- package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +7 -0
- package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -0
- package/dist/vite-plugins/fast-refresh/refresh-filter.js +15 -0
- package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -0
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +5 -0
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -0
- package/dist/vite-plugins/fast-refresh/swc-refresh.js +66 -0
- package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -0
- package/dist/vite-plugins/icons.d.ts +3 -0
- package/dist/vite-plugins/icons.d.ts.map +1 -0
- package/dist/vite-plugins/icons.js +47 -0
- package/dist/vite-plugins/icons.js.map +1 -0
- package/dist/vite-plugins/index.d.ts +3 -0
- package/dist/vite-plugins/index.d.ts.map +1 -0
- package/dist/vite-plugins/index.js +21 -0
- package/dist/vite-plugins/index.js.map +1 -0
- package/dist/vite-plugins/native.d.ts +3 -0
- package/dist/vite-plugins/native.d.ts.map +1 -0
- package/dist/vite-plugins/native.js +60 -0
- package/dist/vite-plugins/native.js.map +1 -0
- package/dist/vite-plugins/react-compiler.d.ts +4 -0
- package/dist/vite-plugins/react-compiler.d.ts.map +1 -0
- package/dist/vite-plugins/react-compiler.js +56 -0
- package/dist/vite-plugins/react-compiler.js.map +1 -0
- package/dist/vite-plugins/react-dom-prebundle.d.ts +3 -0
- package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -0
- package/dist/vite-plugins/react-dom-prebundle.js +11 -0
- package/dist/vite-plugins/react-dom-prebundle.js.map +1 -0
- package/dist/vite-plugins/resource-init-module.d.ts +5 -0
- package/dist/vite-plugins/resource-init-module.d.ts.map +1 -0
- package/dist/vite-plugins/resource-init-module.js +50 -0
- package/dist/vite-plugins/resource-init-module.js.map +1 -0
- package/dist/vite-plugins/resource-shared.d.ts +6 -0
- package/dist/vite-plugins/resource-shared.d.ts.map +1 -0
- package/dist/vite-plugins/resource-shared.js +21 -0
- package/dist/vite-plugins/resource-shared.js.map +1 -0
- package/dist/vite-plugins/resources.d.ts +4 -0
- package/dist/vite-plugins/resources.d.ts.map +1 -0
- package/dist/vite-plugins/resources.js +220 -0
- package/dist/vite-plugins/resources.js.map +1 -0
- package/dist/vite-plugins/settings-worker-env.d.ts +3 -0
- package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -0
- package/dist/vite-plugins/settings-worker-env.js +21 -0
- package/dist/vite-plugins/settings-worker-env.js.map +1 -0
- package/dist/vite-plugins/settings.d.ts +3 -0
- package/dist/vite-plugins/settings.d.ts.map +1 -0
- package/dist/vite-plugins/settings.js +190 -0
- package/dist/vite-plugins/settings.js.map +1 -0
- package/dist/vite-plugins/undeclared-library.d.ts +3 -0
- package/dist/vite-plugins/undeclared-library.d.ts.map +1 -0
- package/dist/vite-plugins/undeclared-library.js +47 -0
- package/dist/vite-plugins/undeclared-library.js.map +1 -0
- package/dist/vite-plugins/virtual-module.d.ts +22 -0
- package/dist/vite-plugins/virtual-module.d.ts.map +1 -0
- package/dist/vite-plugins/virtual-module.js +18 -0
- package/dist/vite-plugins/virtual-module.js.map +1 -0
- package/dist/vitest-plugin.d.ts +10 -0
- package/dist/vitest-plugin.d.ts.map +1 -0
- package/dist/vitest-plugin.js +12 -0
- package/dist/vitest-plugin.js.map +1 -0
- package/env.d.ts +131 -3
- package/package.json +32 -38
- package/src/babel-modules.d.ts +13 -0
- package/src/builder.ts +28 -76
- package/src/cli.ts +22 -0
- package/src/codegen/freshness.ts +52 -0
- package/src/codegen/report.ts +20 -0
- package/src/codegen/run-codegen.ts +185 -0
- package/src/codegen/store-resolver.ts +75 -0
- package/src/commands/build.ts +37 -0
- package/src/commands/codegen.ts +44 -0
- package/src/commands/dev.ts +25 -0
- package/src/commands/docs.ts +66 -0
- package/src/dev/icon-dir.ts +11 -0
- package/src/dev/refresh-tracker.ts +21 -0
- package/src/dev/runner-deps.ts +42 -0
- package/src/dev/runner-main.ts +33 -0
- package/src/dev/runner.ts +126 -0
- package/src/dev/schema-dir.ts +11 -0
- package/src/dev/supervisor.ts +178 -0
- package/src/dev/vite-dev-server.ts +34 -0
- package/src/internal/banner.ts +9 -0
- package/src/internal/data-dir.ts +39 -0
- package/src/internal/entry-arg.ts +38 -0
- package/src/internal/errors.ts +28 -0
- package/src/internal/list-files.ts +17 -0
- package/src/internal/resolve-cli-tool.ts +21 -0
- package/src/internal/staging-dir.ts +16 -0
- package/src/internal/xdg-data-dirs.ts +7 -0
- package/src/mcp/client.ts +177 -0
- package/src/mcp/handlers.ts +156 -0
- package/src/mcp/index.ts +22 -0
- package/src/mcp/serialize-widget.ts +34 -0
- package/src/mcp/testing-loader.ts +32 -0
- package/src/mcp/widget-registry.ts +43 -0
- package/src/refresh-runtime.ts +12 -41
- package/src/settings/compile.ts +19 -0
- package/src/settings/parser.ts +154 -0
- package/src/settings/render.ts +167 -0
- package/src/settings/schema.ts +115 -0
- package/src/vite-plugins/asset-extensions.ts +28 -0
- package/src/{vite-plugin-gtkx-built-url.ts → vite-plugins/built-url.ts} +3 -16
- package/src/vite-plugins/css.ts +38 -0
- package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -0
- package/src/vite-plugins/fast-refresh/swc-refresh.ts +79 -0
- package/src/vite-plugins/icons.ts +58 -0
- package/src/vite-plugins/index.ts +22 -0
- package/src/vite-plugins/native.ts +74 -0
- package/src/vite-plugins/react-compiler.ts +70 -0
- package/src/vite-plugins/react-dom-prebundle.ts +14 -0
- package/src/vite-plugins/resource-init-module.ts +54 -0
- package/src/vite-plugins/resource-shared.ts +27 -0
- package/src/vite-plugins/resources.ts +272 -0
- package/src/vite-plugins/settings-worker-env.ts +25 -0
- package/src/vite-plugins/settings.ts +221 -0
- package/src/vite-plugins/undeclared-library.ts +69 -0
- package/src/vite-plugins/virtual-module.ts +37 -0
- package/src/vitest-plugin.ts +14 -0
- package/dist/create.d.ts +0 -54
- package/dist/create.d.ts.map +0 -1
- package/dist/create.js +0 -221
- package/dist/create.js.map +0 -1
- package/dist/dev-server.d.ts +0 -38
- package/dist/dev-server.d.ts.map +0 -1
- package/dist/dev-server.js +0 -128
- package/dist/dev-server.js.map +0 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +0 -1
- package/dist/mcp-client.d.ts +0 -31
- package/dist/mcp-client.d.ts.map +0 -1
- package/dist/mcp-client.js +0 -430
- package/dist/mcp-client.js.map +0 -1
- package/dist/templates.d.ts +0 -9
- package/dist/templates.d.ts.map +0 -1
- package/dist/templates.js +0 -16
- package/dist/templates.js.map +0 -1
- package/dist/vite-plugin-gtkx-assets.d.ts +0 -20
- package/dist/vite-plugin-gtkx-assets.d.ts.map +0 -1
- package/dist/vite-plugin-gtkx-assets.js +0 -57
- package/dist/vite-plugin-gtkx-assets.js.map +0 -1
- package/dist/vite-plugin-gtkx-built-url.d.ts +0 -18
- package/dist/vite-plugin-gtkx-built-url.d.ts.map +0 -1
- package/dist/vite-plugin-gtkx-built-url.js.map +0 -1
- package/dist/vite-plugin-gtkx-native.d.ts +0 -14
- package/dist/vite-plugin-gtkx-native.d.ts.map +0 -1
- package/dist/vite-plugin-gtkx-native.js +0 -53
- package/dist/vite-plugin-gtkx-native.js.map +0 -1
- package/dist/vite-plugin-gtkx-refresh.d.ts +0 -8
- package/dist/vite-plugin-gtkx-refresh.d.ts.map +0 -1
- package/dist/vite-plugin-gtkx-refresh.js +0 -37
- package/dist/vite-plugin-gtkx-refresh.js.map +0 -1
- package/dist/vite-plugin-swc-ssr-refresh.d.ts +0 -8
- package/dist/vite-plugin-swc-ssr-refresh.d.ts.map +0 -1
- package/dist/vite-plugin-swc-ssr-refresh.js +0 -46
- package/dist/vite-plugin-swc-ssr-refresh.js.map +0 -1
- package/src/cli.tsx +0 -154
- package/src/create.ts +0 -310
- package/src/dev-server.tsx +0 -162
- package/src/index.ts +0 -3
- package/src/mcp-client.ts +0 -518
- package/src/templates.ts +0 -26
- package/src/vite-plugin-gtkx-assets.ts +0 -69
- package/src/vite-plugin-gtkx-native.ts +0 -64
- package/src/vite-plugin-gtkx-refresh.ts +0 -54
- package/src/vite-plugin-swc-ssr-refresh.ts +0 -61
- package/templates/claude/EXAMPLES.md.ejs +0 -744
- package/templates/claude/SKILL.md.ejs +0 -93
- package/templates/claude/WIDGETS.md.ejs +0 -820
- package/templates/config/vitest.config.ts.ejs +0 -11
- package/templates/gitignore.ejs +0 -4
- package/templates/package.json.ejs +0 -16
- package/templates/src/app.tsx.ejs +0 -32
- package/templates/src/dev.tsx.ejs +0 -5
- package/templates/src/gtkx-env.d.ts.ejs +0 -1
- package/templates/src/index.tsx.ejs +0 -5
- package/templates/tests/app.test.tsx.ejs +0 -16
- package/templates/tsconfig.json.ejs +0 -14
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
type TestingModule = typeof import("@gtkx/testing");
|
|
2
|
+
export type TestingModuleLoader = () => Promise<TestingModule>;
|
|
3
|
+
export declare const setTestingModuleLoader: (next: TestingModuleLoader | null) => void;
|
|
4
|
+
export declare const loadTestingModule: () => Promise<TestingModule>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=testing-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing-loader.d.ts","sourceRoot":"","sources":["../../src/mcp/testing-loader.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG,cAAc,eAAe,CAAC,CAAC;AAEpD,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAQ/D,eAAO,MAAM,sBAAsB,SAAU,mBAAmB,GAAG,IAAI,KAAG,IAIzE,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,aAAa,CAe/D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const defaultLoader = () => import("@gtkx/testing");
|
|
2
|
+
let loader = defaultLoader;
|
|
3
|
+
let testingModule = null;
|
|
4
|
+
let testingLoadError = null;
|
|
5
|
+
export const setTestingModuleLoader = (next) => {
|
|
6
|
+
loader = next ?? defaultLoader;
|
|
7
|
+
testingModule = null;
|
|
8
|
+
testingLoadError = null;
|
|
9
|
+
};
|
|
10
|
+
export const loadTestingModule = async () => {
|
|
11
|
+
if (testingModule)
|
|
12
|
+
return testingModule;
|
|
13
|
+
if (testingLoadError)
|
|
14
|
+
throw testingLoadError;
|
|
15
|
+
try {
|
|
16
|
+
testingModule = await loader();
|
|
17
|
+
return testingModule;
|
|
18
|
+
}
|
|
19
|
+
catch (cause) {
|
|
20
|
+
testingLoadError = new Error("@gtkx/testing is not installed, install it to enable MCP widget interactions: " +
|
|
21
|
+
`pnpm add -D @gtkx/testing (import failed: ${String(cause)})`, { cause });
|
|
22
|
+
throw testingLoadError;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=testing-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing-loader.js","sourceRoot":"","sources":["../../src/mcp/testing-loader.ts"],"names":[],"mappings":"AAIA,MAAM,aAAa,GAAwB,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAEzE,IAAI,MAAM,GAAwB,aAAa,CAAC;AAChD,IAAI,aAAa,GAAyB,IAAI,CAAC;AAC/C,IAAI,gBAAgB,GAAiB,IAAI,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAgC,EAAQ,EAAE;IAC7E,MAAM,GAAG,IAAI,IAAI,aAAa,CAAC;IAC/B,aAAa,GAAG,IAAI,CAAC;IACrB,gBAAgB,GAAG,IAAI,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,IAA4B,EAAE;IAChE,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,IAAI,gBAAgB;QAAE,MAAM,gBAAgB,CAAC;IAE7C,IAAI,CAAC;QACD,aAAa,GAAG,MAAM,MAAM,EAAE,CAAC;QAC/B,OAAO,aAAa,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,gBAAgB,GAAG,IAAI,KAAK,CACxB,gFAAgF;YAC5E,6CAA6C,MAAM,CAAC,KAAK,CAAC,GAAG,EACjE,EAAE,KAAK,EAAE,CACZ,CAAC;QACF,MAAM,gBAAgB,CAAC;IAC3B,CAAC;AACL,CAAC,CAAC","sourcesContent":["type TestingModule = typeof import(\"@gtkx/testing\");\n\nexport type TestingModuleLoader = () => Promise<TestingModule>;\n\nconst defaultLoader: TestingModuleLoader = () => import(\"@gtkx/testing\");\n\nlet loader: TestingModuleLoader = defaultLoader;\nlet testingModule: TestingModule | null = null;\nlet testingLoadError: Error | null = null;\n\nexport const setTestingModuleLoader = (next: TestingModuleLoader | null): void => {\n loader = next ?? defaultLoader;\n testingModule = null;\n testingLoadError = null;\n};\n\nexport const loadTestingModule = async (): Promise<TestingModule> => {\n if (testingModule) return testingModule;\n if (testingLoadError) throw testingLoadError;\n\n try {\n testingModule = await loader();\n return testingModule;\n } catch (cause) {\n testingLoadError = new Error(\n \"@gtkx/testing is not installed, install it to enable MCP widget interactions: \" +\n `pnpm add -D @gtkx/testing (import failed: ${String(cause)})`,\n { cause },\n );\n throw testingLoadError;\n }\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
export declare class WidgetRegistry {
|
|
3
|
+
private idByWidget;
|
|
4
|
+
private nextId;
|
|
5
|
+
private widgetById;
|
|
6
|
+
private toplevelWindows;
|
|
7
|
+
refresh(): void;
|
|
8
|
+
toplevels(): Gtk.Window[];
|
|
9
|
+
register(widget: Gtk.Widget): void;
|
|
10
|
+
idFor(widget: Gtk.Widget): string;
|
|
11
|
+
get(id: string): Gtk.Widget | undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=widget-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/widget-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,qBAAa,cAAc;IACvB,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,eAAe,CAAoB;IAE3C,OAAO,IAAI,IAAI,CAMd;IAED,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAExB;IAED,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAQjC;IAED,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAOhC;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,SAAS,CAEtC;CACJ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
export class WidgetRegistry {
|
|
3
|
+
idByWidget = new WeakMap();
|
|
4
|
+
nextId = 0;
|
|
5
|
+
widgetById = new Map();
|
|
6
|
+
toplevelWindows = [];
|
|
7
|
+
refresh() {
|
|
8
|
+
this.widgetById.clear();
|
|
9
|
+
this.toplevelWindows = Gtk.Window.listToplevels();
|
|
10
|
+
for (const window of this.toplevelWindows) {
|
|
11
|
+
this.register(window);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
toplevels() {
|
|
15
|
+
return this.toplevelWindows;
|
|
16
|
+
}
|
|
17
|
+
register(widget) {
|
|
18
|
+
const id = this.idFor(widget);
|
|
19
|
+
this.widgetById.set(id, widget);
|
|
20
|
+
let child = widget.getFirstChild();
|
|
21
|
+
while (child) {
|
|
22
|
+
this.register(child);
|
|
23
|
+
child = child.getNextSibling();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
idFor(widget) {
|
|
27
|
+
let id = this.idByWidget.get(widget);
|
|
28
|
+
if (!id) {
|
|
29
|
+
id = String(this.nextId++);
|
|
30
|
+
this.idByWidget.set(widget, id);
|
|
31
|
+
}
|
|
32
|
+
return id;
|
|
33
|
+
}
|
|
34
|
+
get(id) {
|
|
35
|
+
return this.widgetById.get(id);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=widget-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-registry.js","sourceRoot":"","sources":["../../src/mcp/widget-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,MAAM,OAAO,cAAc;IACf,UAAU,GAAG,IAAI,OAAO,EAAsB,CAAC;IAC/C,MAAM,GAAG,CAAC,CAAC;IACX,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,eAAe,GAAiB,EAAE,CAAC;IAE3C,OAAO;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,EAAkB,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,MAAkB;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAkB;QACpB,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,GAAG,CAAC,EAAU;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;CACJ","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\n\nexport class WidgetRegistry {\n private idByWidget = new WeakMap<Gtk.Widget, string>();\n private nextId = 0;\n private widgetById = new Map<string, Gtk.Widget>();\n private toplevelWindows: Gtk.Window[] = [];\n\n refresh(): void {\n this.widgetById.clear();\n this.toplevelWindows = Gtk.Window.listToplevels() as Gtk.Window[];\n for (const window of this.toplevelWindows) {\n this.register(window);\n }\n }\n\n toplevels(): Gtk.Window[] {\n return this.toplevelWindows;\n }\n\n register(widget: Gtk.Widget): void {\n const id = this.idFor(widget);\n this.widgetById.set(id, widget);\n let child = widget.getFirstChild();\n while (child) {\n this.register(child);\n child = child.getNextSibling();\n }\n }\n\n idFor(widget: Gtk.Widget): string {\n let id = this.idByWidget.get(widget);\n if (!id) {\n id = String(this.nextId++);\n this.idByWidget.set(widget, id);\n }\n return id;\n }\n\n get(id: string): Gtk.Widget | undefined {\n return this.widgetById.get(id);\n }\n}\n"]}
|
|
@@ -1,36 +1,26 @@
|
|
|
1
1
|
import RefreshRuntime from "react-refresh/runtime";
|
|
2
2
|
type ComponentType = (...args: unknown[]) => unknown;
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Builds the per-module `$RefreshReg$` and `$RefreshSig$` hooks that React Refresh
|
|
5
|
+
* transformed code expects, scoping every registered component to the given module.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* @param moduleId - Unique identifier for the module
|
|
10
|
-
* @returns Registration functions for the module
|
|
11
|
-
* @internal
|
|
7
|
+
* @param moduleId Identifier used to namespace registered component types so they are unique across modules.
|
|
8
|
+
* @returns An object with `$RefreshReg$` and `$RefreshSig$` to install as module-local globals.
|
|
12
9
|
*/
|
|
13
10
|
export declare function createModuleRegistration(moduleId: string): {
|
|
14
11
|
$RefreshReg$: (type: ComponentType, id: string) => void;
|
|
15
12
|
$RefreshSig$: typeof RefreshRuntime.createSignatureFunctionForTransform;
|
|
16
13
|
};
|
|
17
14
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* A module is a refresh boundary if all its exports are React components,
|
|
21
|
-
* allowing for fast refresh without full page reload.
|
|
15
|
+
* Determines whether a module can act as a React Refresh boundary, meaning every one of
|
|
16
|
+
* its exports (ignoring `__esModule`) looks like a React component type.
|
|
22
17
|
*
|
|
23
|
-
* @param moduleExports
|
|
24
|
-
* @returns `true`
|
|
25
|
-
* @internal
|
|
18
|
+
* @param moduleExports The module's export object to inspect.
|
|
19
|
+
* @returns `true` when the module qualifies as a refresh boundary, `false` otherwise.
|
|
26
20
|
*/
|
|
27
|
-
export declare function
|
|
21
|
+
export declare function isRefreshBoundary(moduleExports: Record<string, unknown>): boolean;
|
|
28
22
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* Called after module updates when all exports are React components.
|
|
32
|
-
*
|
|
33
|
-
* @internal
|
|
23
|
+
* Applies all pending React Refresh updates, re-rendering components whose modules have changed.
|
|
34
24
|
*/
|
|
35
25
|
export declare function performRefresh(): void;
|
|
36
26
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-runtime.d.ts","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAEnD,KAAK,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAMrD
|
|
1
|
+
{"version":3,"file":"refresh-runtime.d.ts","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAEnD,KAAK,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAMrD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACxD,YAAY,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,YAAY,EAAE,OAAO,cAAc,CAAC,mCAAmC,CAAC;CAC3E,CAOA;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAkBjF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
package/dist/refresh-runtime.js
CHANGED
|
@@ -3,14 +3,11 @@ RefreshRuntime.injectIntoGlobalHook(globalThis);
|
|
|
3
3
|
globalThis.$RefreshReg$ = () => { };
|
|
4
4
|
globalThis.$RefreshSig$ = () => (type) => type;
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Builds the per-module `$RefreshReg$` and `$RefreshSig$` hooks that React Refresh
|
|
7
|
+
* transformed code expects, scoping every registered component to the given module.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* @param moduleId - Unique identifier for the module
|
|
12
|
-
* @returns Registration functions for the module
|
|
13
|
-
* @internal
|
|
9
|
+
* @param moduleId Identifier used to namespace registered component types so they are unique across modules.
|
|
10
|
+
* @returns An object with `$RefreshReg$` and `$RefreshSig$` to install as module-local globals.
|
|
14
11
|
*/
|
|
15
12
|
export function createModuleRegistration(moduleId) {
|
|
16
13
|
return {
|
|
@@ -20,31 +17,14 @@ export function createModuleRegistration(moduleId) {
|
|
|
20
17
|
$RefreshSig$: RefreshRuntime.createSignatureFunctionForTransform,
|
|
21
18
|
};
|
|
22
19
|
}
|
|
23
|
-
function isLikelyComponentType(value) {
|
|
24
|
-
if (typeof value !== "function") {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
const func = value;
|
|
28
|
-
if (func.$$typeof === Symbol.for("react.memo") || func.$$typeof === Symbol.for("react.forward_ref")) {
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
const name = value.name;
|
|
32
|
-
if (typeof name === "string" && /^[A-Z]/.test(name)) {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
20
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* A module is a refresh boundary if all its exports are React components,
|
|
41
|
-
* allowing for fast refresh without full page reload.
|
|
21
|
+
* Determines whether a module can act as a React Refresh boundary, meaning every one of
|
|
22
|
+
* its exports (ignoring `__esModule`) looks like a React component type.
|
|
42
23
|
*
|
|
43
|
-
* @param moduleExports
|
|
44
|
-
* @returns `true`
|
|
45
|
-
* @internal
|
|
24
|
+
* @param moduleExports The module's export object to inspect.
|
|
25
|
+
* @returns `true` when the module qualifies as a refresh boundary, `false` otherwise.
|
|
46
26
|
*/
|
|
47
|
-
export function
|
|
27
|
+
export function isRefreshBoundary(moduleExports) {
|
|
48
28
|
if (RefreshRuntime.isLikelyComponentType(moduleExports)) {
|
|
49
29
|
return true;
|
|
50
30
|
}
|
|
@@ -53,18 +33,14 @@ export function isReactRefreshBoundary(moduleExports) {
|
|
|
53
33
|
continue;
|
|
54
34
|
}
|
|
55
35
|
const value = moduleExports[key];
|
|
56
|
-
if (!isLikelyComponentType(value)) {
|
|
36
|
+
if (!RefreshRuntime.isLikelyComponentType(value)) {
|
|
57
37
|
return false;
|
|
58
38
|
}
|
|
59
39
|
}
|
|
60
|
-
return Object.keys(moduleExports).
|
|
40
|
+
return Object.keys(moduleExports).some((k) => k !== "__esModule");
|
|
61
41
|
}
|
|
62
42
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* Called after module updates when all exports are React components.
|
|
66
|
-
*
|
|
67
|
-
* @internal
|
|
43
|
+
* Applies all pending React Refresh updates, re-rendering components whose modules have changed.
|
|
68
44
|
*/
|
|
69
45
|
export function performRefresh() {
|
|
70
46
|
RefreshRuntime.performReactRefresh();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-runtime.js","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAInD,cAAc,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAChD,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACnC,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"refresh-runtime.js","sourceRoot":"","sources":["../src/refresh-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAInD,cAAc,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAChD,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACnC,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IAIrD,OAAO;QACH,YAAY,EAAE,CAAC,IAAmB,EAAE,EAAU,EAAE,EAAE;YAC9C,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,YAAY,EAAE,cAAc,CAAC,mCAAmC;KACnE,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAsC;IACpE,IAAI,cAAc,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACvB,SAAS;QACb,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC1B,cAAc,CAAC,mBAAmB,EAAE,CAAC;AACzC,CAAC","sourcesContent":["import RefreshRuntime from \"react-refresh/runtime\";\n\ntype ComponentType = (...args: unknown[]) => unknown;\n\nRefreshRuntime.injectIntoGlobalHook(globalThis);\nglobalThis.$RefreshReg$ = () => {};\nglobalThis.$RefreshSig$ = () => (type: unknown) => type;\n\n/**\n * Builds the per-module `$RefreshReg$` and `$RefreshSig$` hooks that React Refresh\n * transformed code expects, scoping every registered component to the given module.\n *\n * @param moduleId Identifier used to namespace registered component types so they are unique across modules.\n * @returns An object with `$RefreshReg$` and `$RefreshSig$` to install as module-local globals.\n */\nexport function createModuleRegistration(moduleId: string): {\n $RefreshReg$: (type: ComponentType, id: string) => void;\n $RefreshSig$: typeof RefreshRuntime.createSignatureFunctionForTransform;\n} {\n return {\n $RefreshReg$: (type: ComponentType, id: string) => {\n RefreshRuntime.register(type, `${moduleId} ${id}`);\n },\n $RefreshSig$: RefreshRuntime.createSignatureFunctionForTransform,\n };\n}\n\n/**\n * Determines whether a module can act as a React Refresh boundary, meaning every one of\n * its exports (ignoring `__esModule`) looks like a React component type.\n *\n * @param moduleExports The module's export object to inspect.\n * @returns `true` when the module qualifies as a refresh boundary, `false` otherwise.\n */\nexport function isRefreshBoundary(moduleExports: Record<string, unknown>): boolean {\n if (RefreshRuntime.isLikelyComponentType(moduleExports)) {\n return true;\n }\n\n for (const key in moduleExports) {\n if (key === \"__esModule\") {\n continue;\n }\n\n const value = moduleExports[key];\n\n if (!RefreshRuntime.isLikelyComponentType(value)) {\n return false;\n }\n }\n\n return Object.keys(moduleExports).some((k) => k !== \"__esModule\");\n}\n\n/**\n * Applies all pending React Refresh updates, re-rendering components whose modules have changed.\n */\nexport function performRefresh(): void {\n RefreshRuntime.performReactRefresh();\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,IAW5C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { formatChildProcessError } from "@gtkx/utils";
|
|
3
|
+
import { resolveCliTool } from "../internal/resolve-cli-tool.js";
|
|
4
|
+
const SCHEMA_COMPILER = "glib-compile-schemas";
|
|
5
|
+
const SCHEMA_COMPILE_TIMEOUT_MS = 30_000;
|
|
6
|
+
export const compileSchemas = (dir) => {
|
|
7
|
+
try {
|
|
8
|
+
execFileSync(resolveCliTool(SCHEMA_COMPILER), ["--strict", dir], {
|
|
9
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
10
|
+
timeout: SCHEMA_COMPILE_TIMEOUT_MS,
|
|
11
|
+
encoding: "utf-8",
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
const details = formatChildProcessError(error);
|
|
16
|
+
throw new Error(`glib-compile-schemas failed for ${dir}${details ? `:\n${details}` : ""}`, { cause: error });
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IAChD,IAAI,CAAC;QACD,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;YAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE,OAAO;SACpB,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjH,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { formatChildProcessError } from \"@gtkx/utils\";\nimport { resolveCliTool } from \"../internal/resolve-cli-tool.js\";\n\nconst SCHEMA_COMPILER = \"glib-compile-schemas\";\nconst SCHEMA_COMPILE_TIMEOUT_MS = 30_000;\n\nexport const compileSchemas = (dir: string): void => {\n try {\n execFileSync(resolveCliTool(SCHEMA_COMPILER), [\"--strict\", dir], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: SCHEMA_COMPILE_TIMEOUT_MS,\n encoding: \"utf-8\",\n });\n } catch (error) {\n const details = formatChildProcessError(error);\n throw new Error(`glib-compile-schemas failed for ${dir}${details ? `:\\n${details}` : \"\"}`, { cause: error });\n }\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type ParsedKey = {
|
|
2
|
+
name: string;
|
|
3
|
+
variantType: string | null;
|
|
4
|
+
enumId: string | null;
|
|
5
|
+
flagsId: string | null;
|
|
6
|
+
choices: string[];
|
|
7
|
+
summary: string | null;
|
|
8
|
+
};
|
|
9
|
+
export type ParsedSchema = {
|
|
10
|
+
id: string;
|
|
11
|
+
path: string | null;
|
|
12
|
+
keys: ParsedKey[];
|
|
13
|
+
};
|
|
14
|
+
export type ParsedSchemaFile = {
|
|
15
|
+
fileName: string;
|
|
16
|
+
schemas: ParsedSchema[];
|
|
17
|
+
enums: Map<string, string[]>;
|
|
18
|
+
flags: Map<string, string[]>;
|
|
19
|
+
};
|
|
20
|
+
export declare class SchemaParseError extends Error {
|
|
21
|
+
}
|
|
22
|
+
export declare const parseSchemaXml: (xml: string, fileName: string) => ParsedSchemaFile;
|
|
23
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/settings/parser.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,SAAS,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAChC,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,KAAK;CAAG;AA0G9C,eAAO,MAAM,cAAc,QAAS,MAAM,YAAY,MAAM,KAAG,gBAuB9D,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
export class SchemaParseError extends Error {
|
|
3
|
+
}
|
|
4
|
+
const MULTI_TAGS = new Set(["schema", "key", "enum", "flags", "value", "choice"]);
|
|
5
|
+
const PARSER = new XMLParser({
|
|
6
|
+
ignoreAttributes: false,
|
|
7
|
+
attributeNamePrefix: "@_",
|
|
8
|
+
parseAttributeValue: false,
|
|
9
|
+
parseTagValue: false,
|
|
10
|
+
trimValues: true,
|
|
11
|
+
isArray: (name) => MULTI_TAGS.has(name),
|
|
12
|
+
});
|
|
13
|
+
const isRawNode = (value) => typeof value === "object" && value !== null;
|
|
14
|
+
const attr = (node, name) => {
|
|
15
|
+
const value = node[`@_${name}`];
|
|
16
|
+
return typeof value === "string" ? value : null;
|
|
17
|
+
};
|
|
18
|
+
const text = (node, name) => {
|
|
19
|
+
const value = node[name];
|
|
20
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
21
|
+
};
|
|
22
|
+
const children = (node, name) => {
|
|
23
|
+
const value = node[name];
|
|
24
|
+
if (!Array.isArray(value))
|
|
25
|
+
return [];
|
|
26
|
+
return value.filter(isRawNode);
|
|
27
|
+
};
|
|
28
|
+
const parseNicks = (definition) => children(definition, "value")
|
|
29
|
+
.map((value) => attr(value, "nick"))
|
|
30
|
+
.filter((nick) => nick !== null);
|
|
31
|
+
const parseDefinitions = (schemalist, tag) => {
|
|
32
|
+
const definitions = new Map();
|
|
33
|
+
for (const definition of children(schemalist, tag)) {
|
|
34
|
+
const id = attr(definition, "id");
|
|
35
|
+
if (id !== null)
|
|
36
|
+
definitions.set(id, parseNicks(definition));
|
|
37
|
+
}
|
|
38
|
+
return definitions;
|
|
39
|
+
};
|
|
40
|
+
const parseChoices = (key) => {
|
|
41
|
+
const choices = key.choices;
|
|
42
|
+
if (!isRawNode(choices))
|
|
43
|
+
return [];
|
|
44
|
+
return children(choices, "choice")
|
|
45
|
+
.map((choice) => attr(choice, "value"))
|
|
46
|
+
.filter((value) => value !== null);
|
|
47
|
+
};
|
|
48
|
+
const parseKey = (key, fileName) => {
|
|
49
|
+
const name = attr(key, "name");
|
|
50
|
+
if (name === null) {
|
|
51
|
+
throw new SchemaParseError(`A <key> in ${fileName} has no name attribute`);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
name,
|
|
55
|
+
variantType: attr(key, "type"),
|
|
56
|
+
enumId: attr(key, "enum"),
|
|
57
|
+
flagsId: attr(key, "flags"),
|
|
58
|
+
choices: parseChoices(key),
|
|
59
|
+
summary: text(key, "summary"),
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
const parseRawSchema = (schema, fileName) => {
|
|
63
|
+
const id = attr(schema, "id");
|
|
64
|
+
if (id === null) {
|
|
65
|
+
throw new SchemaParseError(`A <schema> in ${fileName} has no id attribute`);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
id,
|
|
69
|
+
path: attr(schema, "path"),
|
|
70
|
+
extendsId: attr(schema, "extends"),
|
|
71
|
+
keys: children(schema, "key").map((key) => parseKey(key, fileName)),
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
const mergeInheritedKeys = (schema, byId) => {
|
|
75
|
+
const merged = new Map();
|
|
76
|
+
const visited = new Set();
|
|
77
|
+
const collect = (current) => {
|
|
78
|
+
if (visited.has(current.id))
|
|
79
|
+
return;
|
|
80
|
+
visited.add(current.id);
|
|
81
|
+
if (current.extendsId !== null) {
|
|
82
|
+
const parent = byId.get(current.extendsId);
|
|
83
|
+
if (parent !== undefined)
|
|
84
|
+
collect(parent);
|
|
85
|
+
}
|
|
86
|
+
for (const key of current.keys)
|
|
87
|
+
merged.set(key.name, key);
|
|
88
|
+
};
|
|
89
|
+
collect(schema);
|
|
90
|
+
return [...merged.values()];
|
|
91
|
+
};
|
|
92
|
+
export const parseSchemaXml = (xml, fileName) => {
|
|
93
|
+
let document;
|
|
94
|
+
try {
|
|
95
|
+
document = PARSER.parse(xml);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new SchemaParseError(`Failed to parse ${fileName} as XML: ${String(error)}`, { cause: error });
|
|
99
|
+
}
|
|
100
|
+
if (!isRawNode(document) || !("schemalist" in document)) {
|
|
101
|
+
throw new SchemaParseError(`${fileName} has no <schemalist> root element`);
|
|
102
|
+
}
|
|
103
|
+
const schemalist = isRawNode(document.schemalist) ? document.schemalist : {};
|
|
104
|
+
const rawSchemas = children(schemalist, "schema").map((schema) => parseRawSchema(schema, fileName));
|
|
105
|
+
const byId = new Map(rawSchemas.map((schema) => [schema.id, schema]));
|
|
106
|
+
return {
|
|
107
|
+
fileName,
|
|
108
|
+
schemas: rawSchemas.map((schema) => ({
|
|
109
|
+
id: schema.id,
|
|
110
|
+
path: schema.path,
|
|
111
|
+
keys: mergeInheritedKeys(schema, byId),
|
|
112
|
+
})),
|
|
113
|
+
enums: parseDefinitions(schemalist, "enum"),
|
|
114
|
+
flags: parseDefinitions(schemalist, "flags"),
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/settings/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { XMLParser } from \"fast-xml-parser\";\n\nexport type ParsedKey = {\n name: string;\n variantType: string | null;\n enumId: string | null;\n flagsId: string | null;\n choices: string[];\n summary: string | null;\n};\n\nexport type ParsedSchema = {\n id: string;\n path: string | null;\n keys: ParsedKey[];\n};\n\nexport type ParsedSchemaFile = {\n fileName: string;\n schemas: ParsedSchema[];\n enums: Map<string, string[]>;\n flags: Map<string, string[]>;\n};\n\nexport class SchemaParseError extends Error {}\n\ntype RawNode = Record<string, unknown>;\n\nconst MULTI_TAGS: Set<string> = new Set([\"schema\", \"key\", \"enum\", \"flags\", \"value\", \"choice\"]);\n\nconst PARSER = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n parseAttributeValue: false,\n parseTagValue: false,\n trimValues: true,\n isArray: (name) => MULTI_TAGS.has(name),\n});\n\nconst isRawNode = (value: unknown): value is RawNode => typeof value === \"object\" && value !== null;\n\nconst attr = (node: RawNode, name: string): string | null => {\n const value = node[`@_${name}`];\n return typeof value === \"string\" ? value : null;\n};\n\nconst text = (node: RawNode, name: string): string | null => {\n const value = node[name];\n return typeof value === \"string\" && value.length > 0 ? value : null;\n};\n\nconst children = (node: RawNode, name: string): RawNode[] => {\n const value = node[name];\n if (!Array.isArray(value)) return [];\n return value.filter(isRawNode);\n};\n\nconst parseNicks = (definition: RawNode): string[] =>\n children(definition, \"value\")\n .map((value) => attr(value, \"nick\"))\n .filter((nick): nick is string => nick !== null);\n\nconst parseDefinitions = (schemalist: RawNode, tag: string): Map<string, string[]> => {\n const definitions = new Map<string, string[]>();\n for (const definition of children(schemalist, tag)) {\n const id = attr(definition, \"id\");\n if (id !== null) definitions.set(id, parseNicks(definition));\n }\n return definitions;\n};\n\nconst parseChoices = (key: RawNode): string[] => {\n const choices = key.choices;\n if (!isRawNode(choices)) return [];\n return children(choices, \"choice\")\n .map((choice) => attr(choice, \"value\"))\n .filter((value): value is string => value !== null);\n};\n\nconst parseKey = (key: RawNode, fileName: string): ParsedKey => {\n const name = attr(key, \"name\");\n if (name === null) {\n throw new SchemaParseError(`A <key> in ${fileName} has no name attribute`);\n }\n return {\n name,\n variantType: attr(key, \"type\"),\n enumId: attr(key, \"enum\"),\n flagsId: attr(key, \"flags\"),\n choices: parseChoices(key),\n summary: text(key, \"summary\"),\n };\n};\n\ntype RawSchema = {\n id: string;\n path: string | null;\n extendsId: string | null;\n keys: ParsedKey[];\n};\n\nconst parseRawSchema = (schema: RawNode, fileName: string): RawSchema => {\n const id = attr(schema, \"id\");\n if (id === null) {\n throw new SchemaParseError(`A <schema> in ${fileName} has no id attribute`);\n }\n return {\n id,\n path: attr(schema, \"path\"),\n extendsId: attr(schema, \"extends\"),\n keys: children(schema, \"key\").map((key) => parseKey(key, fileName)),\n };\n};\n\nconst mergeInheritedKeys = (schema: RawSchema, byId: Map<string, RawSchema>): ParsedKey[] => {\n const merged = new Map<string, ParsedKey>();\n const visited = new Set<string>();\n const collect = (current: RawSchema): void => {\n if (visited.has(current.id)) return;\n visited.add(current.id);\n if (current.extendsId !== null) {\n const parent = byId.get(current.extendsId);\n if (parent !== undefined) collect(parent);\n }\n for (const key of current.keys) merged.set(key.name, key);\n };\n collect(schema);\n return [...merged.values()];\n};\n\nexport const parseSchemaXml = (xml: string, fileName: string): ParsedSchemaFile => {\n let document: unknown;\n try {\n document = PARSER.parse(xml);\n } catch (error) {\n throw new SchemaParseError(`Failed to parse ${fileName} as XML: ${String(error)}`, { cause: error });\n }\n if (!isRawNode(document) || !(\"schemalist\" in document)) {\n throw new SchemaParseError(`${fileName} has no <schemalist> root element`);\n }\n const schemalist = isRawNode(document.schemalist) ? document.schemalist : {};\n const rawSchemas = children(schemalist, \"schema\").map((schema) => parseRawSchema(schema, fileName));\n const byId = new Map(rawSchemas.map((schema) => [schema.id, schema]));\n return {\n fileName,\n schemas: rawSchemas.map((schema) => ({\n id: schema.id,\n path: schema.path,\n keys: mergeInheritedKeys(schema, byId),\n })),\n enums: parseDefinitions(schemalist, \"enum\"),\n flags: parseDefinitions(schemalist, \"flags\"),\n };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/settings/render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA2B,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA2D7E,eAAO,MAAM,mBAAmB,SAAU,gBAAgB,KAAG,MAmB5D,CAAC;AAiFF,eAAO,MAAM,eAAe,UAAW,gBAAgB,EAAE,KAAG,MAM3D,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { upperFirst } from "@gtkx/utils";
|
|
2
|
+
const GTKX_ENV_MODULE_HEADER = `/**
|
|
3
|
+
* GSettings schema modules generated by GTKX from the project's
|
|
4
|
+
* \`.gschema.xml\` files. Regenerated by \`gtkx codegen\`, \`gtkx dev\`, and
|
|
5
|
+
* \`gtkx build\`; do not edit.
|
|
6
|
+
*/`;
|
|
7
|
+
const VARIANT_TS_TYPES = {
|
|
8
|
+
b: "boolean",
|
|
9
|
+
i: "number",
|
|
10
|
+
u: "number",
|
|
11
|
+
x: "number",
|
|
12
|
+
t: "number",
|
|
13
|
+
d: "number",
|
|
14
|
+
s: "string",
|
|
15
|
+
as: "string[]",
|
|
16
|
+
};
|
|
17
|
+
const VARIANT_FALLBACK_TS_TYPE = `import("@gtkx/gi/glib").Variant`;
|
|
18
|
+
const ENUM_KIND = "enum";
|
|
19
|
+
const FLAGS_KIND = "flags";
|
|
20
|
+
const toJsStringLiteral = (value) => JSON.stringify(value).replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
|
|
21
|
+
const exportNameFor = (schemaId) => schemaId.replaceAll(".", "_");
|
|
22
|
+
const unionOf = (values) => values.map(toJsStringLiteral).join(" | ");
|
|
23
|
+
const tsTypeForKey = (key, file) => {
|
|
24
|
+
if (key.enumId !== null) {
|
|
25
|
+
const nicks = file.enums.get(key.enumId);
|
|
26
|
+
return nicks !== undefined && nicks.length > 0 ? unionOf(nicks) : "string";
|
|
27
|
+
}
|
|
28
|
+
if (key.flagsId !== null) {
|
|
29
|
+
const nicks = file.flags.get(key.flagsId);
|
|
30
|
+
return nicks !== undefined && nicks.length > 0 ? `(${unionOf(nicks)})[]` : "string[]";
|
|
31
|
+
}
|
|
32
|
+
if (key.variantType === "s" && key.choices.length > 0) {
|
|
33
|
+
return unionOf(key.choices);
|
|
34
|
+
}
|
|
35
|
+
return VARIANT_TS_TYPES[key.variantType ?? ""] ?? VARIANT_FALLBACK_TS_TYPE;
|
|
36
|
+
};
|
|
37
|
+
const runtimeKindForKey = (key) => {
|
|
38
|
+
if (key.enumId !== null)
|
|
39
|
+
return ENUM_KIND;
|
|
40
|
+
if (key.flagsId !== null)
|
|
41
|
+
return FLAGS_KIND;
|
|
42
|
+
return key.variantType ?? "";
|
|
43
|
+
};
|
|
44
|
+
const runtimeKeysFor = (schema) => {
|
|
45
|
+
const entries = schema.keys.map((key) => `${toJsStringLiteral(key.name)}: ${toJsStringLiteral(runtimeKindForKey(key))}`);
|
|
46
|
+
return `{ ${entries.join(", ")} }`;
|
|
47
|
+
};
|
|
48
|
+
export const renderRuntimeModule = (file) => {
|
|
49
|
+
const lines = [];
|
|
50
|
+
file.schemas.forEach((schema, index) => {
|
|
51
|
+
const keysName = `keys_${index}`;
|
|
52
|
+
const id = toJsStringLiteral(schema.id);
|
|
53
|
+
lines.push(`const ${keysName} = ${runtimeKeysFor(schema)};`);
|
|
54
|
+
if (schema.path === null) {
|
|
55
|
+
lines.push(`export const ${exportNameFor(schema.id)} = { id: ${id}, keys: ${keysName}, at: (path) => ({ id: ${id}, path, keys: ${keysName} }) };`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
lines.push(`export const ${exportNameFor(schema.id)} = { id: ${id}, path: null, keys: ${keysName} };`);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const first = file.schemas[0];
|
|
62
|
+
if (first !== undefined) {
|
|
63
|
+
lines.push(`export default ${exportNameFor(first.id)};`);
|
|
64
|
+
}
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
};
|
|
67
|
+
const sanitizeSummary = (summary) => summary.replaceAll("*/", "*\\/");
|
|
68
|
+
const interfaceNameFor = (schemaId, usedNames) => {
|
|
69
|
+
const base = `${schemaId
|
|
70
|
+
.split(/[^a-zA-Z0-9]+/)
|
|
71
|
+
.filter((part) => part.length > 0)
|
|
72
|
+
.map(upperFirst)
|
|
73
|
+
.join("")}Keys`;
|
|
74
|
+
let name = base;
|
|
75
|
+
let suffix = 2;
|
|
76
|
+
while (usedNames.has(name)) {
|
|
77
|
+
name = `${base}${suffix}`;
|
|
78
|
+
suffix += 1;
|
|
79
|
+
}
|
|
80
|
+
usedNames.add(name);
|
|
81
|
+
return name;
|
|
82
|
+
};
|
|
83
|
+
const renderKeysType = (name, schema, file) => {
|
|
84
|
+
const lines = [` type ${name} = {`];
|
|
85
|
+
for (const key of schema.keys) {
|
|
86
|
+
if (key.summary !== null) {
|
|
87
|
+
lines.push(` /** ${sanitizeSummary(key.summary)} */`);
|
|
88
|
+
}
|
|
89
|
+
lines.push(` ${toJsStringLiteral(key.name)}: ${tsTypeForKey(key, file)};`);
|
|
90
|
+
}
|
|
91
|
+
lines.push(" };");
|
|
92
|
+
return lines;
|
|
93
|
+
};
|
|
94
|
+
const boundRefTypeLines = (interfaceName, indent) => [
|
|
95
|
+
`${indent}id: string;`,
|
|
96
|
+
`${indent}path: string | null;`,
|
|
97
|
+
`${indent}keys: { [P in keyof ${interfaceName}]: string };`,
|
|
98
|
+
`${indent}__keys__?: ${interfaceName};`,
|
|
99
|
+
];
|
|
100
|
+
const renderSchemaConst = (schema, interfaceName) => {
|
|
101
|
+
const exportName = exportNameFor(schema.id);
|
|
102
|
+
if (schema.path !== null) {
|
|
103
|
+
return [
|
|
104
|
+
` const ${exportName}: {`,
|
|
105
|
+
` id: ${toJsStringLiteral(schema.id)};`,
|
|
106
|
+
...boundRefTypeLines(interfaceName, " ").slice(1),
|
|
107
|
+
" };",
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
return [
|
|
111
|
+
` const ${exportName}: {`,
|
|
112
|
+
` id: ${JSON.stringify(schema.id)};`,
|
|
113
|
+
` keys: { [P in keyof ${interfaceName}]: string };`,
|
|
114
|
+
` __keys__?: ${interfaceName};`,
|
|
115
|
+
" at(path: string): {",
|
|
116
|
+
...boundRefTypeLines(interfaceName, " "),
|
|
117
|
+
" };",
|
|
118
|
+
" };",
|
|
119
|
+
];
|
|
120
|
+
};
|
|
121
|
+
const renderFileModule = (file, usedNames) => {
|
|
122
|
+
const lines = [`declare module "${file.fileName}" {`];
|
|
123
|
+
const exportNames = [];
|
|
124
|
+
file.schemas.forEach((schema, index) => {
|
|
125
|
+
if (index > 0)
|
|
126
|
+
lines.push("");
|
|
127
|
+
const interfaceName = interfaceNameFor(schema.id, usedNames);
|
|
128
|
+
lines.push(...renderKeysType(interfaceName, schema, file));
|
|
129
|
+
lines.push("");
|
|
130
|
+
lines.push(...renderSchemaConst(schema, interfaceName));
|
|
131
|
+
exportNames.push(exportNameFor(schema.id));
|
|
132
|
+
});
|
|
133
|
+
if (exportNames.length > 0) {
|
|
134
|
+
lines.push("");
|
|
135
|
+
lines.push(` export { ${exportNames.join(", ")} };`);
|
|
136
|
+
lines.push(` export default ${exportNames[0]};`);
|
|
137
|
+
}
|
|
138
|
+
lines.push("}");
|
|
139
|
+
return lines;
|
|
140
|
+
};
|
|
141
|
+
export const renderEnvModule = (files) => {
|
|
142
|
+
const usedNames = new Set();
|
|
143
|
+
const blocks = files
|
|
144
|
+
.filter((file) => file.schemas.length > 0)
|
|
145
|
+
.map((file) => renderFileModule(file, usedNames).join("\n"));
|
|
146
|
+
return `${[GTKX_ENV_MODULE_HEADER, ...blocks].join("\n\n")}\n`;
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=render.js.map
|