@gtkx/cli 1.0.0-rc.1 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +8 -8
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +72 -43
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/codegen/store-resolver.d.ts +8 -5
- package/dist/codegen/store-resolver.d.ts.map +1 -1
- package/dist/codegen/store-resolver.js +26 -6
- 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 +22 -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 +3 -2
- 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 +94 -54
- 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 +2 -1
- package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
- package/dist/vite-plugins/undeclared-library.js +8 -5
- 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 +38 -25
- package/src/codegen/report.ts +10 -2
- package/src/codegen/run-codegen.ts +135 -60
- package/src/codegen/store-resolver.ts +56 -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 +36 -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 +6 -3
- 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 +153 -59
- 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 +21 -12
- package/src/vite-plugins/virtual-module.ts +9 -2
- package/src/vitest-plugin.ts +1 -2
|
@@ -1,24 +1,21 @@
|
|
|
1
|
+
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
|
+
import { error, formatChildProcessError, info, sortStrings } from "@gtkx/utils";
|
|
1
3
|
import { execFileSync } from "node:child_process";
|
|
2
4
|
import { copyFileSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
5
|
import { tmpdir } from "node:os";
|
|
4
6
|
import { dirname, join } from "node:path";
|
|
5
|
-
import { createConfigLoader } from "@gtkx/config/internal";
|
|
6
|
-
import { error, formatChildProcessError, info } from "@gtkx/utils";
|
|
7
7
|
import { DATA_IMPORT_PREFIX, resolveDataDir } from "../internal/data-dir.js";
|
|
8
8
|
import { listFilesRecursive } from "../internal/list-files.js";
|
|
9
9
|
import { resolveCliTool } from "../internal/resolve-cli-tool.js";
|
|
10
10
|
import { withStagingDir } from "../internal/staging-dir.js";
|
|
11
11
|
import { ASSET_PATH_RE, ASSET_RE } from "./asset-extensions.js";
|
|
12
12
|
import { renderInitModule } from "./resource-init-module.js";
|
|
13
|
-
import { BUNDLE_FILENAME, escapeXml, fromVirtualId, isVirtual, REL_SEPARATOR, toVirtualId, VIRTUAL_INIT, } from "./resource-shared.js";
|
|
13
|
+
import { BUNDLE_FILENAME, escapeXml, fromVirtualId, isVirtual, REFRESH_EXPORT, REL_SEPARATOR, toVirtualId, VIRTUAL_INIT, } from "./resource-shared.js";
|
|
14
|
+
import { stripQuery } from "./strip-query.js";
|
|
14
15
|
const DATA_PREFIX = `${DATA_IMPORT_PREFIX}/`;
|
|
15
16
|
const RESOURCE_COMPILER = "glib-compile-resources";
|
|
16
17
|
const MANIFEST_PREFIX = "/";
|
|
17
18
|
const deriveResourcePrefix = (applicationId) => `/${applicationId.replaceAll(".", "/")}`;
|
|
18
|
-
const stripQuery = (source) => {
|
|
19
|
-
const queryIndex = source.indexOf("?");
|
|
20
|
-
return queryIndex === -1 ? source : source.slice(0, queryIndex);
|
|
21
|
-
};
|
|
22
19
|
const compileBundle = (state, outputPath) => withStagingDir("resources", (dir) => {
|
|
23
20
|
const manifest = stageBundle(dir, state.entries);
|
|
24
21
|
return runCompiler(dir, manifest, outputPath);
|
|
@@ -34,13 +31,13 @@ const stageBundle = (dir, entries) => {
|
|
|
34
31
|
const prefix = escapeXml(MANIFEST_PREFIX);
|
|
35
32
|
const manifest = join(dir, "gtkx.gresource.xml");
|
|
36
33
|
const xml = [
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
|
|
35
|
+
"<gresources>",
|
|
39
36
|
` <gresource prefix="${prefix}">`,
|
|
40
37
|
...fileNodes,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
" </gresource>",
|
|
39
|
+
"</gresources>",
|
|
40
|
+
"",
|
|
44
41
|
].join("\n");
|
|
45
42
|
writeFileSync(manifest, xml);
|
|
46
43
|
return manifest;
|
|
@@ -55,35 +52,44 @@ const runCompiler = (sourceDir, manifest, outputPath) => {
|
|
|
55
52
|
}
|
|
56
53
|
catch (error) {
|
|
57
54
|
const details = formatChildProcessError(error);
|
|
58
|
-
|
|
55
|
+
const suffix = details ? `:\n${details}` : "";
|
|
56
|
+
throw new Error(`${RESOURCE_COMPILER} failed${suffix}`, { cause: error });
|
|
59
57
|
}
|
|
60
58
|
return readFileSync(outputPath);
|
|
61
59
|
};
|
|
62
60
|
const ensureStagingDir = (state) => {
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
state.devBundlePath = join(state.devStagingDir, BUNDLE_FILENAME);
|
|
61
|
+
if (state.devStagingDir) {
|
|
62
|
+
return;
|
|
66
63
|
}
|
|
64
|
+
state.devStagingDir = mkdtempSync(join(tmpdir(), "gtkx-resources-dev-"));
|
|
65
|
+
state.devBundlePath = join(state.devStagingDir, BUNDLE_FILENAME);
|
|
67
66
|
};
|
|
68
|
-
const entriesSignature = (state) =>
|
|
67
|
+
const entriesSignature = (state) => sortStrings(state.entries.keys()).join("\0");
|
|
69
68
|
const compileDevBundle = (state) => {
|
|
70
69
|
ensureStagingDir(state);
|
|
71
|
-
if (state.entries.size === 0)
|
|
70
|
+
if (state.entries.size === 0) {
|
|
72
71
|
return;
|
|
72
|
+
}
|
|
73
73
|
compileBundle(state, state.devBundlePath);
|
|
74
74
|
state.compiledSignature = entriesSignature(state);
|
|
75
75
|
};
|
|
76
|
+
const isRefreshHook = (value) => typeof value === "function";
|
|
76
77
|
const reregisterDevBundle = async (state) => {
|
|
77
78
|
const server = state.server;
|
|
78
|
-
if (!server)
|
|
79
|
+
if (!server) {
|
|
79
80
|
return;
|
|
80
|
-
|
|
81
|
-
mod.
|
|
81
|
+
}
|
|
82
|
+
const mod = await server.ssrLoadModule(VIRTUAL_INIT);
|
|
83
|
+
const refresh = mod[REFRESH_EXPORT];
|
|
84
|
+
if (isRefreshHook(refresh)) {
|
|
85
|
+
refresh();
|
|
86
|
+
}
|
|
82
87
|
};
|
|
83
88
|
const scanDataAssets = (dataDir) => listFilesRecursive(dataDir, (name) => ASSET_RE.test(name));
|
|
84
89
|
const primeDevBundle = (state) => {
|
|
85
|
-
if (state.dataDir === null)
|
|
90
|
+
if (state.dataDir === null) {
|
|
86
91
|
return;
|
|
92
|
+
}
|
|
87
93
|
for (const { absPath, rel } of scanDataAssets(state.dataDir)) {
|
|
88
94
|
registerEntry(state, absPath, rel);
|
|
89
95
|
}
|
|
@@ -96,8 +102,9 @@ const registerDevAsset = (state) => {
|
|
|
96
102
|
};
|
|
97
103
|
const registerEntry = (state, absPath, rel) => {
|
|
98
104
|
const existing = state.entries.get(absPath);
|
|
99
|
-
if (existing)
|
|
105
|
+
if (existing) {
|
|
100
106
|
return existing;
|
|
107
|
+
}
|
|
101
108
|
const resourcePath = `${state.prefix}/${rel}`;
|
|
102
109
|
const entry = {
|
|
103
110
|
sourcePath: absPath,
|
|
@@ -109,6 +116,25 @@ const registerEntry = (state, absPath, rel) => {
|
|
|
109
116
|
return entry;
|
|
110
117
|
};
|
|
111
118
|
const isTrackedSource = (state, file) => state.sourcePaths.has(file);
|
|
119
|
+
const dataAssetSource = (source) => {
|
|
120
|
+
const clean = stripQuery(source);
|
|
121
|
+
if (!clean.startsWith(DATA_PREFIX) || !ASSET_PATH_RE.test(clean)) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return clean;
|
|
125
|
+
};
|
|
126
|
+
const resolvedAssetId = (resolved, clean) => {
|
|
127
|
+
if (!resolved || resolved.external) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
return toVirtualId(resolved.id) + REL_SEPARATOR + clean.slice(DATA_PREFIX.length);
|
|
131
|
+
};
|
|
132
|
+
const loadInitModule = (state) => {
|
|
133
|
+
if (!state.isBuild) {
|
|
134
|
+
ensureStagingDir(state);
|
|
135
|
+
}
|
|
136
|
+
return renderInitModule({ isBuild: state.isBuild, devBundlePath: state.devBundlePath });
|
|
137
|
+
};
|
|
112
138
|
const loadAssetModule = (state, virtualId) => {
|
|
113
139
|
const rest = fromVirtualId(virtualId);
|
|
114
140
|
const separatorIndex = rest.indexOf(REL_SEPARATOR);
|
|
@@ -121,25 +147,26 @@ const loadAssetModule = (state, virtualId) => {
|
|
|
121
147
|
}
|
|
122
148
|
return [
|
|
123
149
|
`import { ensureRegistered } from ${JSON.stringify(VIRTUAL_INIT)};`,
|
|
124
|
-
|
|
150
|
+
"ensureRegistered();",
|
|
125
151
|
`export default ${JSON.stringify(uri)};`,
|
|
126
152
|
`export const path = ${JSON.stringify(entry.resourcePath)};`,
|
|
127
153
|
].join("\n");
|
|
128
154
|
};
|
|
129
155
|
const emitBuildBundle = (ctx, state) => {
|
|
130
|
-
if (!state.isBuild || state.entries.size === 0)
|
|
156
|
+
if (!state.isBuild || state.entries.size === 0) {
|
|
131
157
|
return;
|
|
158
|
+
}
|
|
132
159
|
const compiled = withStagingDir("resources-out", (outDir) => compileBundle(state, join(outDir, BUNDLE_FILENAME)));
|
|
133
160
|
ctx.emitFile({ type: "asset", fileName: BUNDLE_FILENAME, source: compiled });
|
|
134
|
-
info(`Compiled ${state.entries.size} resource(s) into ${BUNDLE_FILENAME}`);
|
|
161
|
+
info(`Compiled ${String(state.entries.size)} resource(s) into ${BUNDLE_FILENAME}`);
|
|
135
162
|
};
|
|
136
163
|
const refreshDevRegistration = async (state) => {
|
|
137
164
|
compileDevBundle(state);
|
|
138
165
|
try {
|
|
139
166
|
await reregisterDevBundle(state);
|
|
140
167
|
}
|
|
141
|
-
catch (
|
|
142
|
-
error("Failed to refresh GResource bundle:",
|
|
168
|
+
catch (error_) {
|
|
169
|
+
error("Failed to refresh GResource bundle:", error_);
|
|
143
170
|
}
|
|
144
171
|
};
|
|
145
172
|
const resolveResourceConfig = async (state, config, loadConfig) => {
|
|
@@ -149,19 +176,43 @@ const resolveResourceConfig = async (state, config, loadConfig) => {
|
|
|
149
176
|
assetsInclude: [ASSET_RE],
|
|
150
177
|
};
|
|
151
178
|
};
|
|
179
|
+
const refreshTrackedSource = async (state, file) => {
|
|
180
|
+
if (!isTrackedSource(state, file)) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
await refreshDevRegistration(state);
|
|
185
|
+
}
|
|
186
|
+
catch (error_) {
|
|
187
|
+
error("GResource refresh failed:", error_);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
152
190
|
const attachResourceWatcher = (state, server) => {
|
|
153
191
|
state.server = server;
|
|
154
192
|
const onFileEvent = (file) => {
|
|
155
|
-
|
|
156
|
-
return;
|
|
157
|
-
refreshDevRegistration(state).catch((cause) => {
|
|
158
|
-
error("GResource refresh failed:", cause);
|
|
159
|
-
});
|
|
193
|
+
void refreshTrackedSource(state, file);
|
|
160
194
|
};
|
|
161
195
|
server.watcher.on("change", onFileEvent);
|
|
162
196
|
server.watcher.on("add", onFileEvent);
|
|
163
197
|
};
|
|
164
|
-
|
|
198
|
+
const applyResolvedConfig = (state, config) => {
|
|
199
|
+
state.isBuild = config.command === "build";
|
|
200
|
+
if (state.isBuild) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const relativeDataDir = resolveDataDir(config.root);
|
|
204
|
+
state.dataDir = relativeDataDir === null ? null : join(config.root, relativeDataDir);
|
|
205
|
+
};
|
|
206
|
+
const loadResourceModule = (state, id) => {
|
|
207
|
+
if (id === VIRTUAL_INIT) {
|
|
208
|
+
return loadInitModule(state);
|
|
209
|
+
}
|
|
210
|
+
if (!isVirtual(id)) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
return loadAssetModule(state, id);
|
|
214
|
+
};
|
|
215
|
+
function gtkxResources(loadConfig = createConfigLoader()) {
|
|
165
216
|
const state = {
|
|
166
217
|
prefix: "",
|
|
167
218
|
isBuild: false,
|
|
@@ -180,41 +231,30 @@ export function gtkxResources(loadConfig = createConfigLoader()) {
|
|
|
180
231
|
return resolveResourceConfig(state, config, loadConfig);
|
|
181
232
|
},
|
|
182
233
|
configResolved(config) {
|
|
183
|
-
state
|
|
184
|
-
if (!state.isBuild) {
|
|
185
|
-
const relativeDataDir = resolveDataDir(config.root);
|
|
186
|
-
state.dataDir = relativeDataDir === null ? null : join(config.root, relativeDataDir);
|
|
187
|
-
}
|
|
234
|
+
applyResolvedConfig(state, config);
|
|
188
235
|
},
|
|
189
236
|
configureServer(server) {
|
|
190
237
|
attachResourceWatcher(state, server);
|
|
191
238
|
primeDevBundle(state);
|
|
192
239
|
},
|
|
193
240
|
async resolveId(source, importer, opts) {
|
|
194
|
-
if (source === VIRTUAL_INIT)
|
|
241
|
+
if (source === VIRTUAL_INIT) {
|
|
195
242
|
return VIRTUAL_INIT;
|
|
196
|
-
|
|
197
|
-
|
|
243
|
+
}
|
|
244
|
+
const clean = dataAssetSource(source);
|
|
245
|
+
if (clean === null) {
|
|
198
246
|
return;
|
|
247
|
+
}
|
|
199
248
|
const resolved = await this.resolve(clean, importer, { ...opts, skipSelf: true });
|
|
200
|
-
|
|
201
|
-
return;
|
|
202
|
-
const rel = clean.slice(DATA_PREFIX.length);
|
|
203
|
-
return toVirtualId(resolved.id) + REL_SEPARATOR + rel;
|
|
249
|
+
return resolvedAssetId(resolved, clean);
|
|
204
250
|
},
|
|
205
251
|
load(id) {
|
|
206
|
-
|
|
207
|
-
if (!state.isBuild)
|
|
208
|
-
ensureStagingDir(state);
|
|
209
|
-
return renderInitModule({ isBuild: state.isBuild, devBundlePath: state.devBundlePath });
|
|
210
|
-
}
|
|
211
|
-
if (!isVirtual(id))
|
|
212
|
-
return;
|
|
213
|
-
return loadAssetModule(state, id);
|
|
252
|
+
return loadResourceModule(state, id);
|
|
214
253
|
},
|
|
215
254
|
buildEnd() {
|
|
216
255
|
emitBuildBundle(this, state);
|
|
217
256
|
},
|
|
218
257
|
};
|
|
219
258
|
}
|
|
259
|
+
export { gtkxResources };
|
|
220
260
|
//# sourceMappingURL=resources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/vite-plugins/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAqB,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAmB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACH,eAAe,EACf,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,WAAW,EACX,YAAY,GACf,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,GAAG,GAAG,kBAAkB,GAAG,CAAC;AAE7C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AACnD,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,MAAM,oBAAoB,GAAG,CAAC,aAAqB,EAAU,EAAE,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;AAEzG,MAAM,UAAU,GAAG,CAAC,MAAc,EAAU,EAAE;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC,CAAC;AAoBF,MAAM,aAAa,GAAG,CAAC,KAAkB,EAAE,UAAkB,EAAU,EAAE,CACrE,cAAc,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;IAChC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEP,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,OAAmC,EAAU,EAAE;IAC7E,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG;QACR,wCAAwC;QACxC,cAAc;QACd,0BAA0B,MAAM,IAAI;QACpC,GAAG,SAAS;QACZ,kBAAkB;QAClB,eAAe;QACf,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,QAAgB,EAAE,UAAkB,EAAU,EAAE;IACpF,IAAI,CAAC;QACD,YAAY,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE;YAC5C,eAAe,SAAS,EAAE;YAC1B,YAAY,UAAU,EAAE;YACxB,QAAQ;SACX,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,iBAAiB,UAAU,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAkB,EAAQ,EAAE;IAClD,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACvB,KAAK,CAAC,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IACrE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAkB,EAAU,EAAE,CACpD,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE5E,MAAM,gBAAgB,GAAG,CAAC,KAAkB,EAAQ,EAAE;IAClD,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IACrC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,KAAK,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAAkB,EAAiB,EAAE;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAA+B,CAAC;IACrF,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,OAAe,EAAgB,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAErH,MAAM,cAAc,GAAG,CAAC,KAAkB,EAAQ,EAAE;IAChD,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAkB,EAAQ,EAAE;IAClD,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,iBAAiB,EAAE,CAAC;QACtD,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAkB,EAAE,OAAe,EAAE,GAAW,EAAiB,EAAE;IACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,YAAY,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAkB;QACzB,UAAU,EAAE,OAAO;QACnB,aAAa,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/C,YAAY;KACf,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAkB,EAAE,IAAY,EAAW,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAEnG,MAAM,eAAe,GAAG,CAAC,KAAkB,EAAE,SAAiB,EAAU,EAAE;IACtE,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,cAAc,KAAK,CAAC,YAAY,EAAE,CAAC;IAE/C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACjB,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO;QACH,oCAAoC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG;QACnE,qBAAqB;QACrB,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG;QACxC,uBAAuB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG;KAC/D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,GAAyF,EACzF,KAAkB,EACd,EAAE;IACN,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IACvD,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAClH,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,CAAC,IAAI,qBAAqB,eAAe,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,KAAK,EAAE,KAAkB,EAAiB,EAAE;IACvE,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC;QACD,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,KAAK,EAAE,KAAkB,EAAE,MAAkB,EAAE,UAAwB,EAAE,EAAE;IACrG,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzE,KAAK,CAAC,MAAM,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACnD,OAAO;QACH,aAAa,EAAE,CAAC,QAAQ,CAAC;KAC5B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,KAAkB,EAAE,MAAqB,EAAQ,EAAE;IAC9E,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,WAAW,GAAG,CAAC,IAAY,EAAQ,EAAE;QACvC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE,OAAO;QAC1C,sBAAsB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1C,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACzC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,UAAU,GAAiB,kBAAkB,EAAE;IACzE,MAAM,KAAK,GAAgB;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,EAAE;QACjB,MAAM,EAAE,IAAI;QACZ,iBAAiB,EAAE,EAAE;QACrB,OAAO,EAAE,IAAI;KAChB,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK;QAEd,MAAM,CAAC,MAAkB;YACrB,OAAO,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;QAED,cAAc,CAAC,MAAsB;YACjC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpD,KAAK,CAAC,OAAO,GAAG,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YACzF,CAAC;QACL,CAAC;QAED,eAAe,CAAC,MAAM;YAClB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACrC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI;YAClC,IAAI,MAAM,KAAK,YAAY;gBAAE,OAAO,YAAY,CAAC;YACjD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO;YAEzE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;gBAAE,OAAO;YAE3C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,aAAa,GAAG,GAAG,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,EAAE;YACH,IAAI,EAAE,KAAK,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,OAAO;oBAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC5C,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAAE,OAAO;YAC3B,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,QAAQ;YACJ,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { copyFileSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { type ConfigLoader, createConfigLoader } from \"@gtkx/config/internal\";\nimport { error, formatChildProcessError, info } from \"@gtkx/utils\";\nimport type { Plugin, ResolvedConfig, UserConfig, ViteDevServer } from \"vite\";\nimport { DATA_IMPORT_PREFIX, resolveDataDir } from \"../internal/data-dir.js\";\nimport { type ListedFile, listFilesRecursive } from \"../internal/list-files.js\";\nimport { resolveCliTool } from \"../internal/resolve-cli-tool.js\";\nimport { withStagingDir } from \"../internal/staging-dir.js\";\nimport { ASSET_PATH_RE, ASSET_RE } from \"./asset-extensions.js\";\nimport { renderInitModule } from \"./resource-init-module.js\";\nimport {\n BUNDLE_FILENAME,\n escapeXml,\n fromVirtualId,\n isVirtual,\n REL_SEPARATOR,\n toVirtualId,\n VIRTUAL_INIT,\n} from \"./resource-shared.js\";\n\nconst DATA_PREFIX = `${DATA_IMPORT_PREFIX}/`;\n\nconst RESOURCE_COMPILER = \"glib-compile-resources\";\nconst MANIFEST_PREFIX = \"/\";\n\nconst deriveResourcePrefix = (applicationId: string): string => `/${applicationId.replaceAll(\".\", \"/\")}`;\n\nconst stripQuery = (source: string): string => {\n const queryIndex = source.indexOf(\"?\");\n return queryIndex === -1 ? source : source.slice(0, queryIndex);\n};\n\ntype ResourceEntry = {\n sourcePath: string;\n stagedRelPath: string;\n resourcePath: string;\n};\n\ntype PluginState = {\n prefix: string;\n isBuild: boolean;\n entries: Map<string, ResourceEntry>;\n sourcePaths: Set<string>;\n devStagingDir: string | null;\n devBundlePath: string;\n server: ViteDevServer | null;\n compiledSignature: string;\n dataDir: string | null;\n};\n\nconst compileBundle = (state: PluginState, outputPath: string): Buffer =>\n withStagingDir(\"resources\", (dir) => {\n const manifest = stageBundle(dir, state.entries);\n return runCompiler(dir, manifest, outputPath);\n });\n\nconst stageBundle = (dir: string, entries: Map<string, ResourceEntry>): string => {\n const fileNodes: string[] = [];\n for (const entry of entries.values()) {\n const targetPath = join(dir, entry.stagedRelPath);\n mkdirSync(dirname(targetPath), { recursive: true });\n copyFileSync(entry.sourcePath, targetPath);\n fileNodes.push(` <file>${escapeXml(entry.stagedRelPath)}</file>`);\n }\n const prefix = escapeXml(MANIFEST_PREFIX);\n const manifest = join(dir, \"gtkx.gresource.xml\");\n const xml = [\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`,\n `<gresources>`,\n ` <gresource prefix=\"${prefix}\">`,\n ...fileNodes,\n ` </gresource>`,\n `</gresources>`,\n ``,\n ].join(\"\\n\");\n writeFileSync(manifest, xml);\n return manifest;\n};\n\nconst runCompiler = (sourceDir: string, manifest: string, outputPath: string): Buffer => {\n try {\n execFileSync(resolveCliTool(RESOURCE_COMPILER), [\n `--sourcedir=${sourceDir}`,\n `--target=${outputPath}`,\n manifest,\n ]);\n } catch (error) {\n const details = formatChildProcessError(error);\n throw new Error(`${RESOURCE_COMPILER} failed${details ? `:\\n${details}` : \"\"}`, { cause: error });\n }\n return readFileSync(outputPath);\n};\n\nconst ensureStagingDir = (state: PluginState): void => {\n if (!state.devStagingDir) {\n state.devStagingDir = mkdtempSync(join(tmpdir(), \"gtkx-resources-dev-\"));\n state.devBundlePath = join(state.devStagingDir, BUNDLE_FILENAME);\n }\n};\n\nconst entriesSignature = (state: PluginState): string =>\n [...state.entries.keys()].sort((a, b) => a.localeCompare(b)).join(\"\\0\");\n\nconst compileDevBundle = (state: PluginState): void => {\n ensureStagingDir(state);\n if (state.entries.size === 0) return;\n compileBundle(state, state.devBundlePath);\n state.compiledSignature = entriesSignature(state);\n};\n\nconst reregisterDevBundle = async (state: PluginState): Promise<void> => {\n const server = state.server;\n if (!server) return;\n const mod = (await server.ssrLoadModule(VIRTUAL_INIT)) as { __refresh?: () => void };\n mod.__refresh?.();\n};\n\nconst scanDataAssets = (dataDir: string): ListedFile[] => listFilesRecursive(dataDir, (name) => ASSET_RE.test(name));\n\nconst primeDevBundle = (state: PluginState): void => {\n if (state.dataDir === null) return;\n for (const { absPath, rel } of scanDataAssets(state.dataDir)) {\n registerEntry(state, absPath, rel);\n }\n compileDevBundle(state);\n};\n\nconst registerDevAsset = (state: PluginState): void => {\n if (entriesSignature(state) !== state.compiledSignature) {\n compileDevBundle(state);\n }\n};\n\nconst registerEntry = (state: PluginState, absPath: string, rel: string): ResourceEntry => {\n const existing = state.entries.get(absPath);\n if (existing) return existing;\n\n const resourcePath = `${state.prefix}/${rel}`;\n const entry: ResourceEntry = {\n sourcePath: absPath,\n stagedRelPath: resourcePath.replace(/^\\/+/, \"\"),\n resourcePath,\n };\n state.entries.set(absPath, entry);\n state.sourcePaths.add(absPath);\n return entry;\n};\n\nconst isTrackedSource = (state: PluginState, file: string): boolean => state.sourcePaths.has(file);\n\nconst loadAssetModule = (state: PluginState, virtualId: string): string => {\n const rest = fromVirtualId(virtualId);\n const separatorIndex = rest.indexOf(REL_SEPARATOR);\n const absPath = rest.slice(0, separatorIndex);\n const rel = rest.slice(separatorIndex + REL_SEPARATOR.length);\n const entry = registerEntry(state, absPath, rel);\n const uri = `resource://${entry.resourcePath}`;\n\n if (!state.isBuild) {\n registerDevAsset(state);\n }\n\n return [\n `import { ensureRegistered } from ${JSON.stringify(VIRTUAL_INIT)};`,\n `ensureRegistered();`,\n `export default ${JSON.stringify(uri)};`,\n `export const path = ${JSON.stringify(entry.resourcePath)};`,\n ].join(\"\\n\");\n};\n\nconst emitBuildBundle = (\n ctx: { emitFile: (asset: { type: \"asset\"; fileName: string; source: Buffer }) => string },\n state: PluginState,\n): void => {\n if (!state.isBuild || state.entries.size === 0) return;\n const compiled = withStagingDir(\"resources-out\", (outDir) => compileBundle(state, join(outDir, BUNDLE_FILENAME)));\n ctx.emitFile({ type: \"asset\", fileName: BUNDLE_FILENAME, source: compiled });\n info(`Compiled ${state.entries.size} resource(s) into ${BUNDLE_FILENAME}`);\n};\n\nconst refreshDevRegistration = async (state: PluginState): Promise<void> => {\n compileDevBundle(state);\n try {\n await reregisterDevBundle(state);\n } catch (cause) {\n error(\"Failed to refresh GResource bundle:\", cause);\n }\n};\n\nconst resolveResourceConfig = async (state: PluginState, config: UserConfig, loadConfig: ConfigLoader) => {\n const { applicationId } = await loadConfig(config.root ?? process.cwd());\n state.prefix = deriveResourcePrefix(applicationId);\n return {\n assetsInclude: [ASSET_RE],\n };\n};\n\nconst attachResourceWatcher = (state: PluginState, server: ViteDevServer): void => {\n state.server = server;\n const onFileEvent = (file: string): void => {\n if (!isTrackedSource(state, file)) return;\n refreshDevRegistration(state).catch((cause) => {\n error(\"GResource refresh failed:\", cause);\n });\n };\n server.watcher.on(\"change\", onFileEvent);\n server.watcher.on(\"add\", onFileEvent);\n};\n\nexport function gtkxResources(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = {\n prefix: \"\",\n isBuild: false,\n entries: new Map(),\n sourcePaths: new Set(),\n devStagingDir: null,\n devBundlePath: \"\",\n server: null,\n compiledSignature: \"\",\n dataDir: null,\n };\n\n return {\n name: \"gtkx:resources\",\n enforce: \"pre\",\n\n config(config: UserConfig) {\n return resolveResourceConfig(state, config, loadConfig);\n },\n\n configResolved(config: ResolvedConfig) {\n state.isBuild = config.command === \"build\";\n if (!state.isBuild) {\n const relativeDataDir = resolveDataDir(config.root);\n state.dataDir = relativeDataDir === null ? null : join(config.root, relativeDataDir);\n }\n },\n\n configureServer(server) {\n attachResourceWatcher(state, server);\n primeDevBundle(state);\n },\n\n async resolveId(source, importer, opts) {\n if (source === VIRTUAL_INIT) return VIRTUAL_INIT;\n const clean = stripQuery(source);\n if (!clean.startsWith(DATA_PREFIX) || !ASSET_PATH_RE.test(clean)) return;\n\n const resolved = await this.resolve(clean, importer, { ...opts, skipSelf: true });\n if (!resolved || resolved.external) return;\n\n const rel = clean.slice(DATA_PREFIX.length);\n return toVirtualId(resolved.id) + REL_SEPARATOR + rel;\n },\n\n load(id) {\n if (id === VIRTUAL_INIT) {\n if (!state.isBuild) ensureStagingDir(state);\n return renderInitModule({ isBuild: state.isBuild, devBundlePath: state.devBundlePath });\n }\n if (!isVirtual(id)) return;\n return loadAssetModule(state, id);\n },\n\n buildEnd() {\n emitBuildBundle(this, state);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/vite-plugins/resources.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin, ResolvedConfig, UserConfig, ViteDevServer } from \"vite\";\nimport { type ConfigLoader, createConfigLoader } from \"@gtkx/config/internal\";\nimport { error, formatChildProcessError, info, sortStrings } from \"@gtkx/utils\";\nimport { execFileSync } from \"node:child_process\";\nimport { copyFileSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { DATA_IMPORT_PREFIX, resolveDataDir } from \"../internal/data-dir.js\";\nimport { type ListedFile, listFilesRecursive } from \"../internal/list-files.js\";\nimport { resolveCliTool } from \"../internal/resolve-cli-tool.js\";\nimport { withStagingDir } from \"../internal/staging-dir.js\";\nimport { ASSET_PATH_RE, ASSET_RE } from \"./asset-extensions.js\";\nimport { renderInitModule } from \"./resource-init-module.js\";\nimport {\n BUNDLE_FILENAME,\n escapeXml,\n fromVirtualId,\n isVirtual,\n REFRESH_EXPORT,\n REL_SEPARATOR,\n toVirtualId,\n VIRTUAL_INIT,\n} from \"./resource-shared.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype ResourceEntry = {\n sourcePath: string;\n stagedRelPath: string;\n resourcePath: string;\n};\n\ntype PluginState = {\n prefix: string;\n isBuild: boolean;\n entries: Map<string, ResourceEntry>;\n sourcePaths: Set<string>;\n devStagingDir: string | null;\n devBundlePath: string;\n server: ViteDevServer | null;\n compiledSignature: string;\n dataDir: string | null;\n};\n\nconst DATA_PREFIX = `${DATA_IMPORT_PREFIX}/`;\nconst RESOURCE_COMPILER = \"glib-compile-resources\";\nconst MANIFEST_PREFIX = \"/\";\n\nconst deriveResourcePrefix = (applicationId: string): string => `/${applicationId.replaceAll(\".\", \"/\")}`;\n\nconst compileBundle = (state: PluginState, outputPath: string): Buffer =>\n withStagingDir(\"resources\", (dir) => {\n const manifest = stageBundle(dir, state.entries);\n\n return runCompiler(dir, manifest, outputPath);\n });\n\nconst stageBundle = (dir: string, entries: Map<string, ResourceEntry>): string => {\n const fileNodes: string[] = [];\n\n for (const entry of entries.values()) {\n const targetPath = join(dir, entry.stagedRelPath);\n mkdirSync(dirname(targetPath), { recursive: true });\n copyFileSync(entry.sourcePath, targetPath);\n fileNodes.push(` <file>${escapeXml(entry.stagedRelPath)}</file>`);\n }\n\n const prefix = escapeXml(MANIFEST_PREFIX);\n const manifest = join(dir, \"gtkx.gresource.xml\");\n\n const xml = [\n \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\",\n \"<gresources>\",\n ` <gresource prefix=\"${prefix}\">`,\n ...fileNodes,\n \" </gresource>\",\n \"</gresources>\",\n \"\",\n ].join(\"\\n\");\n\n writeFileSync(manifest, xml);\n\n return manifest;\n};\n\nconst runCompiler = (sourceDir: string, manifest: string, outputPath: string): Buffer => {\n try {\n execFileSync(resolveCliTool(RESOURCE_COMPILER), [\n `--sourcedir=${sourceDir}`,\n `--target=${outputPath}`,\n manifest,\n ]);\n } catch (error) {\n const details = formatChildProcessError(error);\n const suffix = details ? `:\\n${details}` : \"\";\n throw new Error(`${RESOURCE_COMPILER} failed${suffix}`, { cause: error });\n }\n\n return readFileSync(outputPath);\n};\n\nconst ensureStagingDir = (state: PluginState): void => {\n if (state.devStagingDir) {\n return;\n }\n\n state.devStagingDir = mkdtempSync(join(tmpdir(), \"gtkx-resources-dev-\"));\n state.devBundlePath = join(state.devStagingDir, BUNDLE_FILENAME);\n};\n\nconst entriesSignature = (state: PluginState): string => sortStrings(state.entries.keys()).join(\"\\0\");\n\nconst compileDevBundle = (state: PluginState): void => {\n ensureStagingDir(state);\n\n if (state.entries.size === 0) {\n return;\n }\n\n compileBundle(state, state.devBundlePath);\n state.compiledSignature = entriesSignature(state);\n};\n\nconst isRefreshHook = (value: unknown): value is () => void => typeof value === \"function\";\n\nconst reregisterDevBundle = async (state: PluginState): Promise<void> => {\n const server = state.server;\n\n if (!server) {\n return;\n }\n\n const mod = await server.ssrLoadModule(VIRTUAL_INIT);\n const refresh: unknown = mod[REFRESH_EXPORT];\n\n if (isRefreshHook(refresh)) {\n refresh();\n }\n};\n\nconst scanDataAssets = (dataDir: string): ListedFile[] => listFilesRecursive(dataDir, (name) => ASSET_RE.test(name));\n\nconst primeDevBundle = (state: PluginState): void => {\n if (state.dataDir === null) {\n return;\n }\n\n for (const { absPath, rel } of scanDataAssets(state.dataDir)) {\n registerEntry(state, absPath, rel);\n }\n\n compileDevBundle(state);\n};\n\nconst registerDevAsset = (state: PluginState): void => {\n if (entriesSignature(state) !== state.compiledSignature) {\n compileDevBundle(state);\n }\n};\n\nconst registerEntry = (state: PluginState, absPath: string, rel: string): ResourceEntry => {\n const existing = state.entries.get(absPath);\n\n if (existing) {\n return existing;\n }\n\n const resourcePath = `${state.prefix}/${rel}`;\n\n const entry: ResourceEntry = {\n sourcePath: absPath,\n stagedRelPath: resourcePath.replace(/^\\/+/, \"\"),\n resourcePath,\n };\n\n state.entries.set(absPath, entry);\n state.sourcePaths.add(absPath);\n\n return entry;\n};\n\nconst isTrackedSource = (state: PluginState, file: string): boolean => state.sourcePaths.has(file);\n\nconst dataAssetSource = (source: string): string | null => {\n const clean = stripQuery(source);\n\n if (!clean.startsWith(DATA_PREFIX) || !ASSET_PATH_RE.test(clean)) {\n return null;\n }\n\n return clean;\n};\n\nconst resolvedAssetId = (\n resolved: { id: string; external: boolean | string } | null,\n clean: string,\n): string | undefined => {\n if (!resolved || resolved.external) {\n return undefined;\n }\n\n return toVirtualId(resolved.id) + REL_SEPARATOR + clean.slice(DATA_PREFIX.length);\n};\n\nconst loadInitModule = (state: PluginState): string => {\n if (!state.isBuild) {\n ensureStagingDir(state);\n }\n\n return renderInitModule({ isBuild: state.isBuild, devBundlePath: state.devBundlePath });\n};\n\nconst loadAssetModule = (state: PluginState, virtualId: string): string => {\n const rest = fromVirtualId(virtualId);\n const separatorIndex = rest.indexOf(REL_SEPARATOR);\n const absPath = rest.slice(0, separatorIndex);\n const rel = rest.slice(separatorIndex + REL_SEPARATOR.length);\n const entry = registerEntry(state, absPath, rel);\n const uri = `resource://${entry.resourcePath}`;\n\n if (!state.isBuild) {\n registerDevAsset(state);\n }\n\n return [\n `import { ensureRegistered } from ${JSON.stringify(VIRTUAL_INIT)};`,\n \"ensureRegistered();\",\n `export default ${JSON.stringify(uri)};`,\n `export const path = ${JSON.stringify(entry.resourcePath)};`,\n ].join(\"\\n\");\n};\n\nconst emitBuildBundle = (\n ctx: { emitFile: (asset: { type: \"asset\"; fileName: string; source: Buffer }) => string },\n state: PluginState,\n): void => {\n if (!state.isBuild || state.entries.size === 0) {\n return;\n }\n\n const compiled = withStagingDir(\"resources-out\", (outDir) => compileBundle(state, join(outDir, BUNDLE_FILENAME)));\n ctx.emitFile({ type: \"asset\", fileName: BUNDLE_FILENAME, source: compiled });\n info(`Compiled ${String(state.entries.size)} resource(s) into ${BUNDLE_FILENAME}`);\n};\n\nconst refreshDevRegistration = async (state: PluginState): Promise<void> => {\n compileDevBundle(state);\n\n try {\n await reregisterDevBundle(state);\n } catch (error_) {\n error(\"Failed to refresh GResource bundle:\", error_);\n }\n};\n\nconst resolveResourceConfig = async (state: PluginState, config: UserConfig, loadConfig: ConfigLoader) => {\n const { applicationId } = await loadConfig(config.root ?? process.cwd());\n state.prefix = deriveResourcePrefix(applicationId);\n\n return {\n assetsInclude: [ASSET_RE],\n };\n};\n\nconst refreshTrackedSource = async (state: PluginState, file: string): Promise<void> => {\n if (!isTrackedSource(state, file)) {\n return;\n }\n\n try {\n await refreshDevRegistration(state);\n } catch (error_) {\n error(\"GResource refresh failed:\", error_);\n }\n};\n\nconst attachResourceWatcher = (state: PluginState, server: ViteDevServer): void => {\n state.server = server;\n\n const onFileEvent = (file: string): void => {\n void refreshTrackedSource(state, file);\n };\n\n server.watcher.on(\"change\", onFileEvent);\n server.watcher.on(\"add\", onFileEvent);\n};\n\nconst applyResolvedConfig = (state: PluginState, config: ResolvedConfig): void => {\n state.isBuild = config.command === \"build\";\n\n if (state.isBuild) {\n return;\n }\n\n const relativeDataDir = resolveDataDir(config.root);\n state.dataDir = relativeDataDir === null ? null : join(config.root, relativeDataDir);\n};\n\nconst loadResourceModule = (state: PluginState, id: string): string | undefined => {\n if (id === VIRTUAL_INIT) {\n return loadInitModule(state);\n }\n\n if (!isVirtual(id)) {\n return undefined;\n }\n\n return loadAssetModule(state, id);\n};\n\nfunction gtkxResources(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = {\n prefix: \"\",\n isBuild: false,\n entries: new Map(),\n sourcePaths: new Set(),\n devStagingDir: null,\n devBundlePath: \"\",\n server: null,\n compiledSignature: \"\",\n dataDir: null,\n };\n\n return {\n name: \"gtkx:resources\",\n enforce: \"pre\",\n\n config(config: UserConfig) {\n return resolveResourceConfig(state, config, loadConfig);\n },\n\n configResolved(config: ResolvedConfig) {\n applyResolvedConfig(state, config);\n },\n\n configureServer(server) {\n attachResourceWatcher(state, server);\n primeDevBundle(state);\n },\n\n async resolveId(source, importer, opts) {\n if (source === VIRTUAL_INIT) {\n return VIRTUAL_INIT;\n }\n\n const clean = dataAssetSource(source);\n\n if (clean === null) {\n return;\n }\n\n const resolved = await this.resolve(clean, importer, { ...opts, skipSelf: true });\n\n return resolvedAssetId(resolved, clean);\n },\n\n load(id) {\n return loadResourceModule(state, id);\n },\n\n buildEnd() {\n emitBuildBundle(this, state);\n },\n };\n}\n\nexport { gtkxResources };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-worker-env.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,
|
|
1
|
+
{"version":3,"file":"settings-worker-env.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,iBAAS,qBAAqB,IAAI,MAAM,CAsBvC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { resolveDataDir } from "../internal/data-dir.js";
|
|
2
2
|
import { prependSchemaDir, stageAndCompileProjectSchemas } from "../settings/schema.js";
|
|
3
|
-
|
|
3
|
+
function gtkxSettingsWorkerEnv() {
|
|
4
4
|
return {
|
|
5
5
|
name: "gtkx:settings-worker-env",
|
|
6
6
|
enforce: "pre",
|
|
7
7
|
config(config) {
|
|
8
8
|
const root = config.root ?? process.cwd();
|
|
9
9
|
const dir = stageAndCompileProjectSchemas(root, resolveDataDir(root));
|
|
10
|
-
if (dir === null)
|
|
10
|
+
if (dir === null) {
|
|
11
11
|
return;
|
|
12
|
+
}
|
|
12
13
|
process.env.GTKX_DEV_SCHEMA_DIR = dir;
|
|
13
14
|
return {
|
|
14
15
|
test: {
|
|
@@ -18,4 +19,5 @@ export function gtkxSettingsWorkerEnv() {
|
|
|
18
19
|
},
|
|
19
20
|
};
|
|
20
21
|
}
|
|
22
|
+
export { gtkxSettingsWorkerEnv };
|
|
21
23
|
//# sourceMappingURL=settings-worker-env.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-worker-env.js","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAExF,
|
|
1
|
+
{"version":3,"file":"settings-worker-env.js","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAExF,SAAS,qBAAqB;IAC1B,OAAO;QACH,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QAEd,MAAM,CAAC,MAAkB;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,6BAA6B,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YAEtE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACf,OAAO;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAEtC,OAAO;gBACH,IAAI,EAAE;oBACF,GAAG,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE;iBACzF;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC","sourcesContent":["import type { UserConfig } from \"vite\";\nimport type { Plugin } from \"vitest/config\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { prependSchemaDir, stageAndCompileProjectSchemas } from \"../settings/schema.js\";\n\nfunction gtkxSettingsWorkerEnv(): Plugin {\n return {\n name: \"gtkx:settings-worker-env\",\n enforce: \"pre\",\n\n config(config: UserConfig) {\n const root = config.root ?? process.cwd();\n const dir = stageAndCompileProjectSchemas(root, resolveDataDir(root));\n\n if (dir === null) {\n return;\n }\n\n process.env.GTKX_DEV_SCHEMA_DIR = dir;\n\n return {\n test: {\n env: { GSETTINGS_SCHEMA_DIR: prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR) },\n },\n };\n },\n };\n}\n\nexport { gtkxSettingsWorkerEnv };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,MAAM,EAA6C,MAAM,MAAM,CAAC;AAgO1F,iBAAS,YAAY,IAAI,MAAM,CA2D9B;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { error, errorMessage, info } from "@gtkx/utils";
|
|
1
2
|
import { mkdtempSync, readFileSync } from "node:fs";
|
|
2
3
|
import { tmpdir } from "node:os";
|
|
3
4
|
import { basename, join } from "node:path";
|
|
4
|
-
import { error, errorMessage, info } from "@gtkx/utils";
|
|
5
5
|
import { prependBanner } from "../internal/banner.js";
|
|
6
6
|
import { resolveDataDir } from "../internal/data-dir.js";
|
|
7
7
|
import { removeTempDir, withStagingDir } from "../internal/staging-dir.js";
|
|
@@ -13,12 +13,12 @@ import { createVirtualNamespace } from "./virtual-module.js";
|
|
|
13
13
|
const VIRTUAL_PREFIX = "\0gtkx-settings:";
|
|
14
14
|
const { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);
|
|
15
15
|
const SCHEMA_ENV_BANNER = [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
"process.env.GSETTINGS_SCHEMA_DIR = [",
|
|
17
|
+
" decodeURIComponent(new URL(\".\", import.meta.url).pathname),",
|
|
18
|
+
" process.env.GSETTINGS_SCHEMA_DIR,",
|
|
19
|
+
"]",
|
|
20
|
+
" .filter(Boolean)",
|
|
21
|
+
" .join(\":\");",
|
|
22
22
|
].join("\n");
|
|
23
23
|
const ensureSchemaDir = (state) => {
|
|
24
24
|
if (!state.schemaDir) {
|
|
@@ -29,15 +29,18 @@ const ensureSchemaDir = (state) => {
|
|
|
29
29
|
}
|
|
30
30
|
const dir = mkdtempSync(join(tmpdir(), "gtkx-schemas-"));
|
|
31
31
|
state.schemaDir = dir;
|
|
32
|
-
const cleanup = () =>
|
|
32
|
+
const cleanup = () => {
|
|
33
|
+
removeTempDir(dir);
|
|
34
|
+
};
|
|
33
35
|
state.cleanupProcessExit = cleanup;
|
|
34
36
|
process.once("exit", cleanup);
|
|
35
37
|
}
|
|
36
38
|
return state.schemaDir;
|
|
37
39
|
};
|
|
38
40
|
const releaseSchemaDir = (state) => {
|
|
39
|
-
if (!state.schemaDir)
|
|
41
|
+
if (!state.schemaDir) {
|
|
40
42
|
return;
|
|
43
|
+
}
|
|
41
44
|
if (state.cleanupProcessExit) {
|
|
42
45
|
removeTempDir(state.schemaDir);
|
|
43
46
|
process.removeListener("exit", state.cleanupProcessExit);
|
|
@@ -46,21 +49,31 @@ const releaseSchemaDir = (state) => {
|
|
|
46
49
|
state.schemaDir = null;
|
|
47
50
|
};
|
|
48
51
|
const compileSchemaDir = (state) => {
|
|
49
|
-
if (!state.schemaDir)
|
|
52
|
+
if (!state.schemaDir) {
|
|
50
53
|
return;
|
|
54
|
+
}
|
|
51
55
|
compileSchemas(state.schemaDir);
|
|
52
56
|
process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(state.schemaDir, process.env.GSETTINGS_SCHEMA_DIR);
|
|
53
57
|
};
|
|
54
58
|
const syncSchemaEnv = (state) => {
|
|
55
|
-
if (state.rootDir === null)
|
|
59
|
+
if (state.rootDir === null) {
|
|
56
60
|
return;
|
|
61
|
+
}
|
|
57
62
|
try {
|
|
58
63
|
emitSchemaEnv(state.rootDir, state.dataDir);
|
|
59
64
|
}
|
|
60
|
-
catch (
|
|
61
|
-
error(`Failed to generate GSettings schema types: ${errorMessage(
|
|
65
|
+
catch (error_) {
|
|
66
|
+
error(`Failed to generate GSettings schema types: ${errorMessage(error_)}`);
|
|
62
67
|
}
|
|
63
68
|
};
|
|
69
|
+
const applyUserConfig = (state, config) => {
|
|
70
|
+
state.dataDir = resolveDataDir(config.root ?? process.cwd());
|
|
71
|
+
};
|
|
72
|
+
const applyResolvedConfig = (state, config) => {
|
|
73
|
+
state.isBuild = config.command === "build";
|
|
74
|
+
state.rootDir = typeof config.root === "string" ? config.root : null;
|
|
75
|
+
syncSchemaEnv(state);
|
|
76
|
+
};
|
|
64
77
|
const registerSchemaForMode = (state, filePath, id) => {
|
|
65
78
|
const fileName = basename(filePath);
|
|
66
79
|
if (state.isBuild) {
|
|
@@ -75,8 +88,11 @@ const registerSchemaForMode = (state, filePath, id) => {
|
|
|
75
88
|
info(`Compiled GSettings schema: ${fileName}`);
|
|
76
89
|
};
|
|
77
90
|
const loadSchemaModule = (ctx, state, id) => {
|
|
91
|
+
if (!isVirtual(id)) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
78
94
|
const filePath = fromVirtualId(id);
|
|
79
|
-
const xml = readFileSync(filePath, "
|
|
95
|
+
const xml = readFileSync(filePath, "utf8");
|
|
80
96
|
const fileName = basename(filePath);
|
|
81
97
|
registerSchemaForMode(state, filePath, id);
|
|
82
98
|
let parsed;
|
|
@@ -84,8 +100,9 @@ const loadSchemaModule = (ctx, state, id) => {
|
|
|
84
100
|
parsed = parseSchemaXml(xml, fileName);
|
|
85
101
|
}
|
|
86
102
|
catch (error) {
|
|
87
|
-
if (!(error instanceof SchemaParseError))
|
|
103
|
+
if (!(error instanceof SchemaParseError)) {
|
|
88
104
|
throw error;
|
|
105
|
+
}
|
|
89
106
|
ctx.error(error.message);
|
|
90
107
|
}
|
|
91
108
|
if (parsed.schemas.length === 0) {
|
|
@@ -94,8 +111,9 @@ const loadSchemaModule = (ctx, state, id) => {
|
|
|
94
111
|
return renderRuntimeModule(parsed);
|
|
95
112
|
};
|
|
96
113
|
const emitCompiledSchemas = (ctx, state) => {
|
|
97
|
-
if (!state.isBuild || state.buildSchemas.size === 0)
|
|
114
|
+
if (!state.isBuild || state.buildSchemas.size === 0) {
|
|
98
115
|
return;
|
|
116
|
+
}
|
|
99
117
|
const compiled = withStagingDir("schemas-build", (dir) => {
|
|
100
118
|
for (const filePath of state.buildSchemas) {
|
|
101
119
|
stageSchema(dir, filePath);
|
|
@@ -108,12 +126,16 @@ const emitCompiledSchemas = (ctx, state) => {
|
|
|
108
126
|
fileName: "gschemas.compiled",
|
|
109
127
|
source: compiled,
|
|
110
128
|
});
|
|
111
|
-
info(`Compiled ${state.buildSchemas.size} GSettings schema(s)`);
|
|
129
|
+
info(`Compiled ${String(state.buildSchemas.size)} GSettings schema(s)`);
|
|
112
130
|
};
|
|
113
131
|
const handleSchemaHotUpdate = (state, file, server) => {
|
|
132
|
+
if (file.endsWith(SCHEMA_SUFFIX)) {
|
|
133
|
+
syncSchemaEnv(state);
|
|
134
|
+
}
|
|
114
135
|
const virtualId = state.trackedSchemas.get(file);
|
|
115
|
-
if (!virtualId)
|
|
136
|
+
if (!virtualId) {
|
|
116
137
|
return;
|
|
138
|
+
}
|
|
117
139
|
const dir = ensureSchemaDir(state);
|
|
118
140
|
stageSchema(dir, file);
|
|
119
141
|
compileSchemaDir(state);
|
|
@@ -126,16 +148,21 @@ const handleSchemaHotUpdate = (state, file, server) => {
|
|
|
126
148
|
return undefined;
|
|
127
149
|
};
|
|
128
150
|
const watchSchemaFiles = (state, server) => {
|
|
129
|
-
server.httpServer?.once("close", () =>
|
|
130
|
-
|
|
151
|
+
server.httpServer?.once("close", () => {
|
|
152
|
+
releaseSchemaDir(state);
|
|
153
|
+
});
|
|
154
|
+
server.watcher.once("close", () => {
|
|
155
|
+
releaseSchemaDir(state);
|
|
156
|
+
});
|
|
131
157
|
const refreshSchemaTypes = (file) => {
|
|
132
|
-
if (file.endsWith(SCHEMA_SUFFIX))
|
|
158
|
+
if (file.endsWith(SCHEMA_SUFFIX)) {
|
|
133
159
|
syncSchemaEnv(state);
|
|
160
|
+
}
|
|
134
161
|
};
|
|
135
162
|
server.watcher.on("add", refreshSchemaTypes);
|
|
136
163
|
server.watcher.on("unlink", refreshSchemaTypes);
|
|
137
164
|
};
|
|
138
|
-
|
|
165
|
+
function gtkxSettings() {
|
|
139
166
|
const state = {
|
|
140
167
|
schemaDir: null,
|
|
141
168
|
rootDir: null,
|
|
@@ -149,29 +176,27 @@ export function gtkxSettings() {
|
|
|
149
176
|
name: "gtkx:settings",
|
|
150
177
|
enforce: "pre",
|
|
151
178
|
config(config) {
|
|
152
|
-
state
|
|
179
|
+
applyUserConfig(state, config);
|
|
153
180
|
},
|
|
154
181
|
configResolved(config) {
|
|
155
|
-
state
|
|
156
|
-
state.rootDir = typeof config.root === "string" ? config.root : null;
|
|
157
|
-
syncSchemaEnv(state);
|
|
182
|
+
applyResolvedConfig(state, config);
|
|
158
183
|
},
|
|
159
184
|
configureServer(server) {
|
|
160
185
|
watchSchemaFiles(state, server);
|
|
161
186
|
},
|
|
162
187
|
outputOptions(options) {
|
|
163
|
-
if (!state.isBuild)
|
|
188
|
+
if (!state.isBuild) {
|
|
164
189
|
return;
|
|
190
|
+
}
|
|
165
191
|
return prependBanner(options, SCHEMA_ENV_BANNER);
|
|
166
192
|
},
|
|
167
193
|
async resolveId(source, importer, options) {
|
|
168
|
-
if (!source.endsWith(SCHEMA_SUFFIX))
|
|
194
|
+
if (!source.endsWith(SCHEMA_SUFFIX)) {
|
|
169
195
|
return;
|
|
196
|
+
}
|
|
170
197
|
return resolveToVirtual(this, { source, importer, options });
|
|
171
198
|
},
|
|
172
199
|
load(id) {
|
|
173
|
-
if (!isVirtual(id))
|
|
174
|
-
return;
|
|
175
200
|
return loadSchemaModule(this, state, id);
|
|
176
201
|
},
|
|
177
202
|
buildEnd() {
|
|
@@ -181,10 +206,9 @@ export function gtkxSettings() {
|
|
|
181
206
|
releaseSchemaDir(state);
|
|
182
207
|
},
|
|
183
208
|
handleHotUpdate({ file, server }) {
|
|
184
|
-
if (file.endsWith(SCHEMA_SUFFIX))
|
|
185
|
-
syncSchemaEnv(state);
|
|
186
209
|
return handleSchemaHotUpdate(state, file, server);
|
|
187
210
|
},
|
|
188
211
|
};
|
|
189
212
|
}
|
|
213
|
+
export { gtkxSettings };
|
|
190
214
|
//# sourceMappingURL=settings.js.map
|