@gtkx/cli 1.3.0 → 1.5.0
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 +5 -4
- package/dist/builder.d.ts +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +6 -6
- package/dist/builder.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +3 -2
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +41 -12
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/commands/build.d.ts +0 -4
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +0 -5
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +2 -4
- package/dist/commands/codegen.js.map +1 -1
- package/dist/deploy/depends.d.ts +2 -2
- package/dist/deploy/depends.d.ts.map +1 -1
- package/dist/deploy/depends.js +30 -15
- package/dist/deploy/depends.js.map +1 -1
- package/dist/deploy/freedesktop/localize.d.ts +6 -0
- package/dist/deploy/freedesktop/localize.d.ts.map +1 -0
- package/dist/deploy/freedesktop/localize.js +107 -0
- package/dist/deploy/freedesktop/localize.js.map +1 -0
- package/dist/deploy/install-hints.d.ts.map +1 -1
- package/dist/deploy/install-hints.js +5 -0
- package/dist/deploy/install-hints.js.map +1 -1
- package/dist/deploy/nfpm/config.js +1 -1
- package/dist/deploy/nfpm/config.js.map +1 -1
- package/dist/deploy/node-runtime/elf.d.ts +1 -1
- package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
- package/dist/deploy/node-runtime/elf.js +2 -2
- package/dist/deploy/node-runtime/elf.js.map +1 -1
- package/dist/deploy/node-runtime/index.js +2 -2
- package/dist/deploy/node-runtime/index.js.map +1 -1
- package/dist/deploy/notices/collect.d.ts +3 -1
- package/dist/deploy/notices/collect.d.ts.map +1 -1
- package/dist/deploy/notices/collect.js +2 -2
- package/dist/deploy/notices/collect.js.map +1 -1
- package/dist/deploy/notices/packages.d.ts +2 -1
- package/dist/deploy/notices/packages.d.ts.map +1 -1
- package/dist/deploy/notices/packages.js +4 -27
- package/dist/deploy/notices/packages.js.map +1 -1
- package/dist/deploy/payload/icons.d.ts +7 -3
- package/dist/deploy/payload/icons.d.ts.map +1 -1
- package/dist/deploy/payload/icons.js +46 -28
- package/dist/deploy/payload/icons.js.map +1 -1
- package/dist/deploy/payload/launcher.d.ts.map +1 -1
- package/dist/deploy/payload/launcher.js +2 -0
- package/dist/deploy/payload/launcher.js.map +1 -1
- package/dist/deploy/payload/stage.d.ts +1 -1
- package/dist/deploy/payload/stage.d.ts.map +1 -1
- package/dist/deploy/payload/stage.js +23 -13
- package/dist/deploy/payload/stage.js.map +1 -1
- package/dist/deploy/run-deploy.d.ts.map +1 -1
- package/dist/deploy/run-deploy.js +149 -25
- package/dist/deploy/run-deploy.js.map +1 -1
- package/dist/deploy/settings/build-manifest.d.ts +9 -0
- package/dist/deploy/settings/build-manifest.d.ts.map +1 -0
- package/dist/deploy/settings/build-manifest.js +80 -0
- package/dist/deploy/settings/build-manifest.js.map +1 -0
- package/dist/deploy/settings/index.d.ts.map +1 -1
- package/dist/deploy/settings/index.js +9 -3
- package/dist/deploy/settings/index.js.map +1 -1
- package/dist/deploy/settings/libraries.d.ts +8 -0
- package/dist/deploy/settings/libraries.d.ts.map +1 -0
- package/dist/deploy/settings/libraries.js +39 -0
- package/dist/deploy/settings/libraries.js.map +1 -0
- package/dist/deploy/settings/paths.d.ts +3 -0
- package/dist/deploy/settings/paths.d.ts.map +1 -1
- package/dist/deploy/settings/paths.js +6 -32
- package/dist/deploy/settings/paths.js.map +1 -1
- package/dist/deploy/targets/appimage.d.ts.map +1 -1
- package/dist/deploy/targets/appimage.js +19 -13
- package/dist/deploy/targets/appimage.js.map +1 -1
- package/dist/deploy/targets/flatpak-manifest.d.ts +2 -1
- package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-manifest.js +5 -1
- package/dist/deploy/targets/flatpak-manifest.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +30 -16
- package/dist/deploy/targets/flatpak-source.js.map +1 -1
- package/dist/deploy/tools.d.ts +6 -1
- package/dist/deploy/tools.d.ts.map +1 -1
- package/dist/deploy/tools.js +26 -1
- package/dist/deploy/tools.js.map +1 -1
- package/dist/deploy/types.d.ts +4 -4
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/deploy/types.js.map +1 -1
- package/dist/dev/icon-dir.d.ts +1 -1
- package/dist/dev/icon-dir.d.ts.map +1 -1
- package/dist/dev/icon-dir.js +20 -7
- package/dist/dev/icon-dir.js.map +1 -1
- package/dist/dev/locale-dir.d.ts +3 -0
- package/dist/dev/locale-dir.d.ts.map +1 -0
- package/dist/dev/locale-dir.js +17 -0
- package/dist/dev/locale-dir.js.map +1 -0
- package/dist/dev/runner-deps.d.ts.map +1 -1
- package/dist/dev/runner-deps.js +5 -1
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +6 -4
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/runner.d.ts +1 -1
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +7 -1
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/schema-dir.d.ts +1 -1
- package/dist/dev/schema-dir.d.ts.map +1 -1
- package/dist/dev/schema-dir.js +3 -1
- package/dist/dev/schema-dir.js.map +1 -1
- package/dist/dev/vite-dev-server.d.ts +1 -0
- package/dist/dev/vite-dev-server.d.ts.map +1 -1
- package/dist/dev/vite-dev-server.js.map +1 -1
- package/dist/i18n/binding-extractor.d.ts +30 -0
- package/dist/i18n/binding-extractor.d.ts.map +1 -0
- package/dist/i18n/binding-extractor.js +1324 -0
- package/dist/i18n/binding-extractor.js.map +1 -0
- package/dist/i18n/catalog-template.d.ts +3 -0
- package/dist/i18n/catalog-template.d.ts.map +1 -0
- package/dist/i18n/catalog-template.js +18 -0
- package/dist/i18n/catalog-template.js.map +1 -0
- package/dist/i18n/catalogs.d.ts +21 -0
- package/dist/i18n/catalogs.d.ts.map +1 -0
- package/dist/i18n/catalogs.js +139 -0
- package/dist/i18n/catalogs.js.map +1 -0
- package/dist/i18n/extractor-plugin.d.ts +8 -0
- package/dist/i18n/extractor-plugin.d.ts.map +1 -0
- package/dist/i18n/extractor-plugin.js +247 -0
- package/dist/i18n/extractor-plugin.js.map +1 -0
- package/dist/i18n/metadata-templates.d.ts +11 -0
- package/dist/i18n/metadata-templates.d.ts.map +1 -0
- package/dist/i18n/metadata-templates.js +11 -0
- package/dist/i18n/metadata-templates.js.map +1 -0
- package/dist/i18n/source-messages.d.ts +23 -0
- package/dist/i18n/source-messages.d.ts.map +1 -0
- package/dist/i18n/source-messages.js +403 -0
- package/dist/i18n/source-messages.js.map +1 -0
- package/dist/i18n/types.d.ts +10 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +108 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/internal/build-manifest.d.ts +20 -0
- package/dist/internal/build-manifest.d.ts.map +1 -0
- package/dist/internal/build-manifest.js +6 -0
- package/dist/internal/build-manifest.js.map +1 -0
- package/dist/internal/icon-path.d.ts +13 -0
- package/dist/internal/icon-path.d.ts.map +1 -0
- package/dist/internal/icon-path.js +86 -0
- package/dist/internal/icon-path.js.map +1 -0
- package/dist/internal/source-imports.d.ts +12 -0
- package/dist/internal/source-imports.d.ts.map +1 -0
- package/dist/internal/source-imports.js +123 -0
- package/dist/internal/source-imports.js.map +1 -0
- package/dist/mcp/client.d.ts +0 -1
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +11 -39
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/handlers.d.ts +2 -1
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/widget-properties.d.ts.map +1 -1
- package/dist/mcp/widget-properties.js +3 -12
- package/dist/mcp/widget-properties.js.map +1 -1
- package/dist/settings/render.d.ts +10 -1
- package/dist/settings/render.d.ts.map +1 -1
- package/dist/settings/render.js +78 -20
- package/dist/settings/render.js.map +1 -1
- package/dist/settings/schema.d.ts +4 -3
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +124 -15
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-emitter.d.ts +1 -1
- package/dist/vite-plugins/asset-emitter.d.ts.map +1 -1
- package/dist/vite-plugins/asset-emitter.js.map +1 -1
- package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
- package/dist/vite-plugins/asset-extensions.js +1 -0
- package/dist/vite-plugins/asset-extensions.js.map +1 -1
- package/dist/vite-plugins/asset-imports.d.ts +2 -1
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
- package/dist/vite-plugins/asset-imports.js +39 -28
- package/dist/vite-plugins/asset-imports.js.map +1 -1
- package/dist/vite-plugins/asset-specifier.d.ts +13 -1
- package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
- package/dist/vite-plugins/asset-specifier.js +39 -1
- package/dist/vite-plugins/asset-specifier.js.map +1 -1
- package/dist/vite-plugins/build-manifest.d.ts +5 -0
- package/dist/vite-plugins/build-manifest.d.ts.map +1 -0
- package/dist/vite-plugins/{bundled-packages.js → build-manifest.js} +20 -14
- package/dist/vite-plugins/build-manifest.js.map +1 -0
- package/dist/vite-plugins/built-url.d.ts +1 -1
- package/dist/vite-plugins/built-url.d.ts.map +1 -1
- package/dist/vite-plugins/built-url.js +37 -24
- package/dist/vite-plugins/built-url.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts +5 -0
- package/dist/vite-plugins/i18n.d.ts.map +1 -0
- package/dist/vite-plugins/i18n.js +88 -0
- package/dist/vite-plugins/i18n.js.map +1 -0
- 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 +25 -12
- 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 +9 -5
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/native.d.ts.map +1 -1
- package/dist/vite-plugins/native.js +23 -4
- package/dist/vite-plugins/native.js.map +1 -1
- package/dist/vite-plugins/resource-init-module.d.ts +7 -3
- package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
- package/dist/vite-plugins/resource-init-module.js +39 -14
- package/dist/vite-plugins/resource-init-module.js.map +1 -1
- package/dist/vite-plugins/resource-shared.d.ts +3 -1
- package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
- package/dist/vite-plugins/resource-shared.js +3 -1
- package/dist/vite-plugins/resource-shared.js.map +1 -1
- package/dist/vite-plugins/resources.d.ts +1 -1
- package/dist/vite-plugins/resources.d.ts.map +1 -1
- package/dist/vite-plugins/resources.js +877 -86
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/self-contained.d.ts.map +1 -1
- package/dist/vite-plugins/self-contained.js +128 -135
- package/dist/vite-plugins/self-contained.js.map +1 -1
- package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
- package/dist/vite-plugins/settings-worker-env.js +6 -3
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts +3 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +63 -23
- package/dist/vite-plugins/settings.js.map +1 -1
- package/env.d.ts +11 -192
- package/package.json +11 -10
- package/src/builder.ts +7 -7
- package/src/codegen/run-codegen.ts +64 -15
- package/src/commands/build.ts +0 -5
- package/src/commands/codegen.ts +2 -4
- package/src/deploy/depends.ts +47 -18
- package/src/deploy/freedesktop/localize.ts +144 -0
- package/src/deploy/install-hints.ts +5 -0
- package/src/deploy/nfpm/config.ts +1 -1
- package/src/deploy/node-runtime/elf.ts +3 -3
- package/src/deploy/node-runtime/index.ts +2 -2
- package/src/deploy/notices/collect.ts +4 -2
- package/src/deploy/notices/packages.ts +5 -43
- package/src/deploy/payload/icons.ts +64 -34
- package/src/deploy/payload/launcher.ts +2 -0
- package/src/deploy/payload/stage.ts +40 -12
- package/src/deploy/run-deploy.ts +214 -24
- package/src/deploy/settings/build-manifest.ts +122 -0
- package/src/deploy/settings/index.ts +9 -4
- package/src/deploy/settings/libraries.ts +57 -0
- package/src/deploy/settings/paths.ts +10 -47
- package/src/deploy/targets/appimage.ts +32 -15
- package/src/deploy/targets/flatpak-manifest.ts +7 -1
- package/src/deploy/targets/flatpak-source.ts +42 -20
- package/src/deploy/tools.ts +35 -0
- package/src/deploy/types.ts +4 -4
- package/src/dev/icon-dir.ts +31 -7
- package/src/dev/locale-dir.ts +22 -0
- package/src/dev/runner-deps.ts +5 -1
- package/src/dev/runner-main.ts +6 -4
- package/src/dev/runner.ts +10 -2
- package/src/dev/schema-dir.ts +3 -1
- package/src/dev/vite-dev-server.ts +1 -0
- package/src/i18n/binding-extractor.ts +1969 -0
- package/src/i18n/catalog-template.ts +24 -0
- package/src/i18n/catalogs.ts +216 -0
- package/src/i18n/extractor-plugin.ts +413 -0
- package/src/i18n/metadata-templates.ts +29 -0
- package/src/i18n/source-messages.ts +608 -0
- package/src/i18n/types.ts +154 -0
- package/src/internal/build-manifest.ts +32 -0
- package/src/internal/icon-path.ts +127 -0
- package/src/internal/source-imports.ts +171 -0
- package/src/mcp/client.ts +17 -44
- package/src/mcp/handlers.ts +7 -6
- package/src/mcp/widget-properties.ts +3 -14
- package/src/settings/render.ts +113 -21
- package/src/settings/schema.ts +192 -17
- package/src/vite-plugins/asset-emitter.ts +1 -1
- package/src/vite-plugins/asset-extensions.ts +1 -0
- package/src/vite-plugins/asset-imports.ts +62 -33
- package/src/vite-plugins/asset-specifier.ts +73 -1
- package/src/vite-plugins/{bundled-packages.ts → build-manifest.ts} +30 -19
- package/src/vite-plugins/built-url.ts +49 -28
- package/src/vite-plugins/i18n.ts +146 -0
- package/src/vite-plugins/icons.ts +33 -14
- package/src/vite-plugins/index.ts +15 -5
- package/src/vite-plugins/native.ts +31 -4
- package/src/vite-plugins/resource-init-module.ts +44 -15
- package/src/vite-plugins/resource-shared.ts +4 -0
- package/src/vite-plugins/resources.ts +1397 -100
- package/src/vite-plugins/self-contained.ts +150 -169
- package/src/vite-plugins/settings-worker-env.ts +7 -3
- package/src/vite-plugins/settings.ts +89 -21
- package/dist/vite-plugins/bundled-packages.d.ts +0 -5
- package/dist/vite-plugins/bundled-packages.d.ts.map +0 -1
- package/dist/vite-plugins/bundled-packages.js.map +0 -1
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import type { Plugin } from "vite";
|
|
2
|
-
import { isRecord } from "@gtkx/utils";
|
|
1
|
+
import type { ESTree, Plugin, VisitorObject } from "vite";
|
|
3
2
|
import { isBuiltin } from "node:module";
|
|
4
3
|
import { posix } from "node:path";
|
|
5
|
-
import { parseSync } from "vite";
|
|
6
|
-
|
|
7
|
-
type AstNode = Record<string, unknown>;
|
|
4
|
+
import { parseSync, Visitor } from "vite";
|
|
8
5
|
|
|
9
6
|
type Bindings = {
|
|
10
7
|
declarations: Map<string, number>;
|
|
@@ -15,7 +12,7 @@ type Bindings = {
|
|
|
15
12
|
|
|
16
13
|
type Scan = {
|
|
17
14
|
bindings: Bindings;
|
|
18
|
-
calls:
|
|
15
|
+
calls: ESTree.CallExpression[];
|
|
19
16
|
sources: string[];
|
|
20
17
|
};
|
|
21
18
|
|
|
@@ -24,133 +21,144 @@ type Chunk = {
|
|
|
24
21
|
code: string;
|
|
25
22
|
};
|
|
26
23
|
|
|
24
|
+
type PatternItem =
|
|
25
|
+
| ESTree.BindingPattern |
|
|
26
|
+
ESTree.BindingProperty |
|
|
27
|
+
ESTree.BindingRestElement |
|
|
28
|
+
ESTree.FormalParameterRest |
|
|
29
|
+
ESTree.TSParameterProperty |
|
|
30
|
+
null;
|
|
31
|
+
|
|
27
32
|
const REQUIRE_FACTORY = "createRequire";
|
|
28
33
|
const REQUIRE_BINDING = "require";
|
|
29
34
|
const RESOLVE_PROPERTY = "resolve";
|
|
30
35
|
const MODULE_BUILTIN = "node:module";
|
|
31
36
|
const OUTPUT_DIRECTORY = ".";
|
|
32
37
|
const RELATIVE_SPECIFIER = /^\.\.?(?:\/|$)/;
|
|
33
|
-
const DECLARATION_KEYS = ["id", "local", "param", "params"];
|
|
34
|
-
|
|
35
|
-
const SOURCE_STATEMENTS = new Set([
|
|
36
|
-
"ExportAllDeclaration",
|
|
37
|
-
"ExportNamedDeclaration",
|
|
38
|
-
"ImportDeclaration",
|
|
39
|
-
"ImportExpression",
|
|
40
|
-
]);
|
|
41
|
-
|
|
42
|
-
const isAstNode = (value: unknown): value is AstNode => isRecord(value) && typeof value.type === "string";
|
|
43
|
-
const nodeType = (node: AstNode): string => (typeof node.type === "string" ? node.type : "");
|
|
44
|
-
|
|
45
|
-
const nodeName = (node: AstNode | null): string | null =>
|
|
46
|
-
node !== null && typeof node.name === "string" ? node.name : null;
|
|
47
38
|
|
|
48
|
-
const
|
|
49
|
-
|
|
39
|
+
const exportName = (name: ESTree.ModuleExportName): string | null => (name.type === "Identifier" ? name.name : null);
|
|
40
|
+
const referenceName = (node: ESTree.Argument): string | null => (node.type === "Identifier" ? node.name : null);
|
|
50
41
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const childNodes = (node: AstNode, key: string): AstNode[] => {
|
|
55
|
-
const value = node[key];
|
|
56
|
-
|
|
57
|
-
if (!Array.isArray(value)) {
|
|
58
|
-
return [];
|
|
42
|
+
const countName = (declarations: Map<string, number>, name: string | null): void => {
|
|
43
|
+
if (name !== null) {
|
|
44
|
+
declarations.set(name, (declarations.get(name) ?? 0) + 1);
|
|
59
45
|
}
|
|
60
|
-
|
|
61
|
-
const entries: unknown[] = value;
|
|
62
|
-
|
|
63
|
-
return entries.filter(isAstNode);
|
|
64
46
|
};
|
|
65
47
|
|
|
66
|
-
const
|
|
67
|
-
if (
|
|
68
|
-
|
|
48
|
+
const boundPattern = (item: PatternItem): ESTree.BindingPattern | null => {
|
|
49
|
+
if (item === null) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
69
52
|
|
|
70
|
-
|
|
53
|
+
if (item.type === "Property") {
|
|
54
|
+
return item.value;
|
|
71
55
|
}
|
|
72
56
|
|
|
73
|
-
if (
|
|
74
|
-
return
|
|
57
|
+
if (item.type === "RestElement") {
|
|
58
|
+
return item.argument;
|
|
75
59
|
}
|
|
76
60
|
|
|
77
|
-
return
|
|
61
|
+
return item.type === "TSParameterProperty" ? item.parameter : item;
|
|
78
62
|
};
|
|
79
63
|
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
64
|
+
const countPatterns = (declarations: Map<string, number>, items: PatternItem[]): void => {
|
|
65
|
+
for (const item of items) {
|
|
66
|
+
countPattern(declarations, boundPattern(item));
|
|
83
67
|
}
|
|
84
68
|
};
|
|
85
69
|
|
|
86
|
-
const
|
|
87
|
-
|
|
70
|
+
const countPattern = (declarations: Map<string, number>, pattern: ESTree.BindingPattern | null): void => {
|
|
71
|
+
if (pattern === null) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
88
74
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
visitNode(current, visit);
|
|
75
|
+
if (pattern.type === "Identifier") {
|
|
76
|
+
countName(declarations, pattern.name);
|
|
92
77
|
|
|
93
|
-
|
|
94
|
-
stack.push(value);
|
|
95
|
-
}
|
|
78
|
+
return;
|
|
96
79
|
}
|
|
97
|
-
};
|
|
98
80
|
|
|
99
|
-
|
|
100
|
-
|
|
81
|
+
if (pattern.type === "AssignmentPattern") {
|
|
82
|
+
countPattern(declarations, pattern.left);
|
|
101
83
|
|
|
102
|
-
|
|
103
|
-
declarations.set(name, (declarations.get(name) ?? 0) + 1);
|
|
84
|
+
return;
|
|
104
85
|
}
|
|
86
|
+
|
|
87
|
+
countPatterns(declarations, pattern.type === "ObjectPattern" ? pattern.properties : pattern.elements);
|
|
105
88
|
};
|
|
106
89
|
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
90
|
+
const countFunction = (
|
|
91
|
+
declarations: Map<string, number>,
|
|
92
|
+
node: ESTree.ArrowFunctionExpression | ESTree.Function,
|
|
93
|
+
): void => {
|
|
94
|
+
countPattern(declarations, node.id);
|
|
95
|
+
countPatterns(declarations, node.params);
|
|
113
96
|
};
|
|
114
97
|
|
|
115
|
-
const
|
|
98
|
+
const declarationVisitor = (declarations: Map<string, number>): VisitorObject => ({
|
|
99
|
+
ArrowFunctionExpression: (node) => {
|
|
100
|
+
countFunction(declarations, node);
|
|
101
|
+
},
|
|
102
|
+
CatchClause: (node) => {
|
|
103
|
+
countPattern(declarations, node.param);
|
|
104
|
+
},
|
|
105
|
+
ClassDeclaration: (node) => {
|
|
106
|
+
countPattern(declarations, node.id);
|
|
107
|
+
},
|
|
108
|
+
ClassExpression: (node) => {
|
|
109
|
+
countPattern(declarations, node.id);
|
|
110
|
+
},
|
|
111
|
+
ExportSpecifier: (node) => {
|
|
112
|
+
countName(declarations, exportName(node.local));
|
|
113
|
+
},
|
|
114
|
+
FunctionDeclaration: (node) => {
|
|
115
|
+
countFunction(declarations, node);
|
|
116
|
+
},
|
|
117
|
+
FunctionExpression: (node) => {
|
|
118
|
+
countFunction(declarations, node);
|
|
119
|
+
},
|
|
120
|
+
ImportDefaultSpecifier: (node) => {
|
|
121
|
+
countPattern(declarations, node.local);
|
|
122
|
+
},
|
|
123
|
+
ImportNamespaceSpecifier: (node) => {
|
|
124
|
+
countPattern(declarations, node.local);
|
|
125
|
+
},
|
|
126
|
+
ImportSpecifier: (node) => {
|
|
127
|
+
countPattern(declarations, node.local);
|
|
128
|
+
},
|
|
129
|
+
VariableDeclarator: (node) => {
|
|
130
|
+
countPattern(declarations, node.id);
|
|
131
|
+
},
|
|
132
|
+
});
|
|
116
133
|
|
|
117
|
-
const
|
|
118
|
-
if (childNodes(node, "expressions").length > 0) {
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
134
|
+
const isUnshadowed = (name: string, bindings: Bindings): boolean => (bindings.declarations.get(name) ?? 0) <= 1;
|
|
121
135
|
|
|
122
|
-
|
|
123
|
-
const
|
|
136
|
+
const templateString = (node: ESTree.TemplateLiteral): string | null => {
|
|
137
|
+
const [quasi] = node.quasis;
|
|
124
138
|
|
|
125
|
-
return
|
|
139
|
+
return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;
|
|
126
140
|
};
|
|
127
141
|
|
|
128
|
-
const literalString = (node:
|
|
129
|
-
if (node ===
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (nodeType(node) === "Literal") {
|
|
134
|
-
return typeof node.value === "string" ? node.value : null;
|
|
142
|
+
const literalString = (node: ESTree.Argument | null): string | null => {
|
|
143
|
+
if (node?.type === "TemplateLiteral") {
|
|
144
|
+
return templateString(node);
|
|
135
145
|
}
|
|
136
146
|
|
|
137
|
-
return
|
|
147
|
+
return node?.type === "Literal" && typeof node.value === "string" ? node.value : null;
|
|
138
148
|
};
|
|
139
149
|
|
|
140
|
-
const isMetaUrl = (node:
|
|
141
|
-
if (
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return object !== null && nodeType(object) === "MetaProperty";
|
|
150
|
+
const isMetaUrl = (node: ESTree.Argument, bindings: Bindings): boolean => {
|
|
151
|
+
if (node.type === "MemberExpression") {
|
|
152
|
+
return node.object.type === "MetaProperty";
|
|
145
153
|
}
|
|
146
154
|
|
|
147
|
-
const name =
|
|
155
|
+
const name = referenceName(node);
|
|
148
156
|
|
|
149
157
|
return name !== null && bindings.urls.has(name) && isUnshadowed(name, bindings);
|
|
150
158
|
};
|
|
151
159
|
|
|
152
|
-
const hasMetaUrl = (node:
|
|
153
|
-
|
|
160
|
+
const hasMetaUrl = (node: ESTree.CallExpression, bindings: Bindings): boolean =>
|
|
161
|
+
node.arguments.some((argument) => isMetaUrl(argument, bindings));
|
|
154
162
|
|
|
155
163
|
const isRequireName = (name: string | null, bindings: Bindings): boolean =>
|
|
156
164
|
name !== null && (name === REQUIRE_BINDING || bindings.requires.has(name)) && isUnshadowed(name, bindings);
|
|
@@ -158,116 +166,89 @@ const isRequireName = (name: string | null, bindings: Bindings): boolean =>
|
|
|
158
166
|
const isFactoryName = (name: string | null, bindings: Bindings): boolean =>
|
|
159
167
|
name !== null && (name === REQUIRE_FACTORY || bindings.factories.has(name)) && isUnshadowed(name, bindings);
|
|
160
168
|
|
|
161
|
-
const isRequireFactory = (node:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return isFactoryName(nodeName(childNode(node, "callee")), bindings) || hasMetaUrl(node, bindings);
|
|
167
|
-
};
|
|
169
|
+
const isRequireFactory = (node: ESTree.Argument, bindings: Bindings): boolean =>
|
|
170
|
+
node.type === "CallExpression" &&
|
|
171
|
+
(isFactoryName(referenceName(node.callee), bindings) || hasMetaUrl(node, bindings));
|
|
168
172
|
|
|
169
|
-
const isResolveTarget = (object:
|
|
170
|
-
|
|
171
|
-
isRequireName(
|
|
173
|
+
const isResolveTarget = (object: ESTree.Expression, bindings: Bindings): boolean =>
|
|
174
|
+
object.type === "MetaProperty" ||
|
|
175
|
+
isRequireName(referenceName(object), bindings) ||
|
|
172
176
|
isRequireFactory(object, bindings);
|
|
173
177
|
|
|
174
|
-
const isResolveMember = (callee:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (hasMetaUrl(call, bindings)) {
|
|
190
|
-
return true;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const callee = childNode(call, "callee");
|
|
194
|
-
|
|
195
|
-
if (callee === null) {
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return (
|
|
200
|
-
isRequireName(nodeName(callee), bindings) ||
|
|
201
|
-
isRequireFactory(callee, bindings) ||
|
|
202
|
-
isResolveMember(callee, bindings)
|
|
203
|
-
);
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
const collectFactories = (node: AstNode, bindings: Bindings): void => {
|
|
207
|
-
if (literalString(childNode(node, "source")) !== MODULE_BUILTIN) {
|
|
178
|
+
const isResolveMember = (callee: ESTree.Expression, bindings: Bindings): boolean =>
|
|
179
|
+
callee.type === "MemberExpression" &&
|
|
180
|
+
!callee.computed &&
|
|
181
|
+
callee.property.type === "Identifier" &&
|
|
182
|
+
callee.property.name === RESOLVE_PROPERTY &&
|
|
183
|
+
isResolveTarget(callee.object, bindings);
|
|
184
|
+
|
|
185
|
+
const isResolvingCall = (call: ESTree.CallExpression, bindings: Bindings): boolean =>
|
|
186
|
+
hasMetaUrl(call, bindings) ||
|
|
187
|
+
isRequireName(referenceName(call.callee), bindings) ||
|
|
188
|
+
isRequireFactory(call.callee, bindings) ||
|
|
189
|
+
isResolveMember(call.callee, bindings);
|
|
190
|
+
|
|
191
|
+
const collectFactories = (node: ESTree.ImportDeclaration, bindings: Bindings): void => {
|
|
192
|
+
if (node.source.value !== MODULE_BUILTIN) {
|
|
208
193
|
return;
|
|
209
194
|
}
|
|
210
195
|
|
|
211
|
-
for (const specifier of
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
if (local !== null && nodeName(childNode(specifier, "imported")) === REQUIRE_FACTORY) {
|
|
215
|
-
bindings.factories.add(local);
|
|
196
|
+
for (const specifier of node.specifiers) {
|
|
197
|
+
if (specifier.type === "ImportSpecifier" && exportName(specifier.imported) === REQUIRE_FACTORY) {
|
|
198
|
+
bindings.factories.add(specifier.local.name);
|
|
216
199
|
}
|
|
217
200
|
}
|
|
218
201
|
};
|
|
219
202
|
|
|
220
|
-
const collectBinding = (node:
|
|
221
|
-
const
|
|
222
|
-
const init = childNode(node, "init");
|
|
203
|
+
const collectBinding = (node: ESTree.VariableDeclarator, bindings: Bindings): void => {
|
|
204
|
+
const { id, init } = node;
|
|
223
205
|
|
|
224
|
-
if (
|
|
206
|
+
if (init === null || id.type !== "Identifier") {
|
|
225
207
|
return;
|
|
226
208
|
}
|
|
227
209
|
|
|
228
210
|
if (isMetaUrl(init, bindings)) {
|
|
229
|
-
bindings.urls.add(name);
|
|
211
|
+
bindings.urls.add(id.name);
|
|
230
212
|
}
|
|
231
213
|
|
|
232
214
|
if (isRequireFactory(init, bindings)) {
|
|
233
|
-
bindings.requires.add(name);
|
|
215
|
+
bindings.requires.add(id.name);
|
|
234
216
|
}
|
|
235
217
|
};
|
|
236
218
|
|
|
237
|
-
const
|
|
238
|
-
childNodes(call, "arguments").some((argument) => literalString(argument) !== null);
|
|
239
|
-
|
|
240
|
-
const collectSource = (scan: Scan, node: AstNode, type: string): void => {
|
|
241
|
-
if (!SOURCE_STATEMENTS.has(type)) {
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
const source = literalString(childNode(node, "source"));
|
|
246
|
-
|
|
219
|
+
const collectSource = (scan: Scan, source: string | null): void => {
|
|
247
220
|
if (source !== null) {
|
|
248
221
|
scan.sources.push(source);
|
|
249
222
|
}
|
|
250
223
|
};
|
|
251
224
|
|
|
252
|
-
const collectCall = (scan: Scan, node:
|
|
253
|
-
if (
|
|
225
|
+
const collectCall = (scan: Scan, node: ESTree.CallExpression): void => {
|
|
226
|
+
if (node.arguments.some((argument) => literalString(argument) !== null)) {
|
|
254
227
|
scan.calls.push(node);
|
|
255
228
|
}
|
|
256
229
|
};
|
|
257
230
|
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
231
|
+
const scanVisitor = (scan: Scan): VisitorObject => ({
|
|
232
|
+
CallExpression: (node) => {
|
|
233
|
+
collectCall(scan, node);
|
|
234
|
+
},
|
|
235
|
+
ExportAllDeclaration: (node) => {
|
|
236
|
+
collectSource(scan, node.source.value);
|
|
237
|
+
},
|
|
238
|
+
ExportNamedDeclaration: (node) => {
|
|
239
|
+
collectSource(scan, node.source?.value ?? null);
|
|
240
|
+
},
|
|
241
|
+
ImportDeclaration: (node) => {
|
|
263
242
|
collectFactories(node, scan.bindings);
|
|
264
|
-
|
|
243
|
+
collectSource(scan, node.source.value);
|
|
244
|
+
},
|
|
245
|
+
ImportExpression: (node) => {
|
|
246
|
+
collectSource(scan, literalString(node.source));
|
|
247
|
+
},
|
|
248
|
+
VariableDeclarator: (node) => {
|
|
265
249
|
collectBinding(node, scan.bindings);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
collectSource(scan, node, type);
|
|
269
|
-
collectCall(scan, node, type);
|
|
270
|
-
};
|
|
250
|
+
},
|
|
251
|
+
});
|
|
271
252
|
|
|
272
253
|
const scanChunk = (chunk: Chunk): Scan => {
|
|
273
254
|
const scan: Scan = {
|
|
@@ -276,9 +257,9 @@ const scanChunk = (chunk: Chunk): Scan => {
|
|
|
276
257
|
sources: [],
|
|
277
258
|
};
|
|
278
259
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
260
|
+
const { program } = parseSync(chunk.fileName, chunk.code);
|
|
261
|
+
new Visitor(declarationVisitor(scan.bindings.declarations)).visit(program);
|
|
262
|
+
new Visitor(scanVisitor(scan)).visit(program);
|
|
282
263
|
|
|
283
264
|
return scan;
|
|
284
265
|
};
|
|
@@ -286,7 +267,7 @@ const scanChunk = (chunk: Chunk): Scan => {
|
|
|
286
267
|
const callSpecifiers = (scan: Scan): string[] =>
|
|
287
268
|
scan.calls
|
|
288
269
|
.filter((call) => isResolvingCall(call, scan.bindings))
|
|
289
|
-
.flatMap((call) =>
|
|
270
|
+
.flatMap((call) => call.arguments)
|
|
290
271
|
.map((argument) => literalString(argument))
|
|
291
272
|
.filter((specifier) => specifier !== null);
|
|
292
273
|
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import type { UserConfig } from "vite";
|
|
2
2
|
import type { Plugin } from "vitest/config";
|
|
3
|
+
import { createConfigLoader } from "@gtkx/config/internal";
|
|
3
4
|
import { resolveDataDir } from "../internal/data-dir.js";
|
|
4
5
|
import { prependSchemaDir, stageAndCompileProjectSchemas } from "../settings/schema.js";
|
|
5
6
|
|
|
6
7
|
function gtkxSettingsWorkerEnv(): Plugin {
|
|
8
|
+
const loadConfig = createConfigLoader();
|
|
9
|
+
|
|
7
10
|
return {
|
|
8
11
|
name: "gtkx:settings-worker-env",
|
|
9
12
|
enforce: "pre",
|
|
10
13
|
|
|
11
|
-
config(config: UserConfig) {
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
+
async config(config: UserConfig) {
|
|
15
|
+
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
16
|
+
const dataDir = loaded.config.future?.v2ResourceImports === true ? null : resolveDataDir(loaded.root);
|
|
17
|
+
const dir = stageAndCompileProjectSchemas(loaded.root, dataDir);
|
|
14
18
|
|
|
15
19
|
if (dir === null) {
|
|
16
20
|
return;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { ConfigLoader } from "@gtkx/config";
|
|
1
2
|
import type { ModuleNode, Plugin, ResolvedConfig, UserConfig, ViteDevServer } from "vite";
|
|
2
|
-
import { error, errorMessage, info } from "@gtkx/utils";
|
|
3
|
+
import { error, errorMessage, info, sortStrings } from "@gtkx/utils";
|
|
3
4
|
import { readFileSync } from "node:fs";
|
|
4
5
|
import { basename, join } from "node:path";
|
|
6
|
+
import type { BuildManifestCollector } from "../internal/build-manifest.js";
|
|
5
7
|
import type { AssetEmitter } from "./asset-emitter.js";
|
|
6
8
|
import { prependBanner } from "../internal/banner.js";
|
|
7
9
|
import { resolveDataDir } from "../internal/data-dir.js";
|
|
@@ -9,14 +11,23 @@ import { createRetainedStagingDir, type RetainedStagingDir, withStagingDir } fro
|
|
|
9
11
|
import { compileSchemas } from "../settings/compile.js";
|
|
10
12
|
import { parseSchemaXml, SchemaParseError } from "../settings/parser.js";
|
|
11
13
|
import { renderRuntimeModule } from "../settings/render.js";
|
|
12
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
assertUniqueSchemaBasenames,
|
|
16
|
+
emitSchemaEnv,
|
|
17
|
+
prependSchemaDir,
|
|
18
|
+
projectRelativeSchemaPath,
|
|
19
|
+
SCHEMA_SUFFIX,
|
|
20
|
+
stageSchema,
|
|
21
|
+
} from "../settings/schema.js";
|
|
13
22
|
import { createVirtualNamespace } from "./virtual-module.js";
|
|
14
23
|
|
|
15
24
|
type PluginState = {
|
|
16
25
|
schemaDir: RetainedStagingDir;
|
|
17
26
|
rootDir: string | null;
|
|
18
27
|
dataDir: string | null;
|
|
28
|
+
isV2ResourceImports: boolean;
|
|
19
29
|
isBuild: boolean;
|
|
30
|
+
schemaEnvTimer: ReturnType<typeof setTimeout> | null;
|
|
20
31
|
trackedSchemas: Map<string, string>;
|
|
21
32
|
buildSchemas: Set<string>;
|
|
22
33
|
};
|
|
@@ -27,6 +38,8 @@ type PluginContext = AssetEmitter & {
|
|
|
27
38
|
|
|
28
39
|
const VIRTUAL_PREFIX = "\0gtkx-settings:";
|
|
29
40
|
const SCHEMA_STAGING_PREFIX = "schemas";
|
|
41
|
+
const SOURCE_MODULE_RE = /\.[cm]?[jt]sx?$/;
|
|
42
|
+
const SCHEMA_ENV_DEBOUNCE_MS = 50;
|
|
30
43
|
const { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);
|
|
31
44
|
|
|
32
45
|
const SCHEMA_ENV_BANNER = [
|
|
@@ -67,14 +80,34 @@ const syncSchemaEnv = (state: PluginState): void => {
|
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
try {
|
|
70
|
-
emitSchemaEnv(state.rootDir, state.dataDir);
|
|
83
|
+
emitSchemaEnv(state.rootDir, state.dataDir, state.isV2ResourceImports);
|
|
71
84
|
} catch (error_) {
|
|
72
85
|
error(`Failed to generate GSettings schema types: ${errorMessage(error_)}`);
|
|
73
86
|
}
|
|
74
87
|
};
|
|
75
88
|
|
|
76
|
-
const
|
|
77
|
-
|
|
89
|
+
const cancelSchemaEnvSync = (state: PluginState): void => {
|
|
90
|
+
if (state.schemaEnvTimer === null) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
clearTimeout(state.schemaEnvTimer);
|
|
95
|
+
state.schemaEnvTimer = null;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const scheduleSchemaEnvSync = (state: PluginState): void => {
|
|
99
|
+
cancelSchemaEnvSync(state);
|
|
100
|
+
|
|
101
|
+
state.schemaEnvTimer = setTimeout(() => {
|
|
102
|
+
state.schemaEnvTimer = null;
|
|
103
|
+
syncSchemaEnv(state);
|
|
104
|
+
}, SCHEMA_ENV_DEBOUNCE_MS);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const applyUserConfig = async (state: PluginState, config: UserConfig, loadConfig: ConfigLoader): Promise<void> => {
|
|
108
|
+
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
109
|
+
state.isV2ResourceImports = loaded.config.future?.v2ResourceImports === true;
|
|
110
|
+
state.dataDir = state.isV2ResourceImports ? null : resolveDataDir(loaded.root);
|
|
78
111
|
};
|
|
79
112
|
|
|
80
113
|
const applyResolvedConfig = (state: PluginState, config: ResolvedConfig): void => {
|
|
@@ -128,13 +161,9 @@ const loadSchemaModule = (ctx: PluginContext, state: PluginState, id: string): s
|
|
|
128
161
|
return renderRuntimeModule(parsed);
|
|
129
162
|
};
|
|
130
163
|
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const compiled = withStagingDir("schemas-build", (dir) => {
|
|
137
|
-
for (const filePath of state.buildSchemas) {
|
|
164
|
+
const compileBuildSchemas = (schemaFiles: string[]): Buffer =>
|
|
165
|
+
withStagingDir("schemas-build", (dir) => {
|
|
166
|
+
for (const filePath of schemaFiles) {
|
|
138
167
|
stageSchema(dir, filePath);
|
|
139
168
|
}
|
|
140
169
|
|
|
@@ -143,18 +172,53 @@ const emitCompiledSchemas = (ctx: PluginContext, state: PluginState): void => {
|
|
|
143
172
|
return readFileSync(join(dir, "gschemas.compiled"));
|
|
144
173
|
});
|
|
145
174
|
|
|
175
|
+
const buildSchemaPaths = (rootDir: string, schemaFiles: string[]): string[] =>
|
|
176
|
+
schemaFiles.map((filePath) => {
|
|
177
|
+
const rel = projectRelativeSchemaPath(rootDir, filePath);
|
|
178
|
+
|
|
179
|
+
if (rel === null) {
|
|
180
|
+
throw new Error(`Cannot package the GSettings schema ${filePath}: it is outside ${rootDir}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return rel;
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const emitBuildSchemas = (
|
|
187
|
+
ctx: PluginContext,
|
|
188
|
+
state: PluginState,
|
|
189
|
+
buildManifest: BuildManifestCollector | undefined,
|
|
190
|
+
): void => {
|
|
191
|
+
if (!state.isBuild || state.rootDir === null) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const rootDir = state.rootDir;
|
|
196
|
+
const schemaFiles = sortStrings(state.buildSchemas);
|
|
197
|
+
assertUniqueSchemaBasenames(schemaFiles);
|
|
198
|
+
const schemas = buildSchemaPaths(rootDir, schemaFiles);
|
|
199
|
+
|
|
200
|
+
if (buildManifest !== undefined) {
|
|
201
|
+
buildManifest.schemas = schemas;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (schemaFiles.length === 0) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const compiled = compileBuildSchemas(schemaFiles);
|
|
209
|
+
|
|
146
210
|
ctx.emitFile({
|
|
147
211
|
type: "asset",
|
|
148
212
|
fileName: "gschemas.compiled",
|
|
149
213
|
source: compiled,
|
|
150
214
|
});
|
|
151
215
|
|
|
152
|
-
info(`Compiled ${String(
|
|
216
|
+
info(`Compiled ${String(schemaFiles.length)} GSettings schema(s)`);
|
|
153
217
|
};
|
|
154
218
|
|
|
155
219
|
const handleSchemaHotUpdate = (state: PluginState, file: string, server: ViteDevServer): ModuleNode[] | undefined => {
|
|
156
|
-
if (file.endsWith(SCHEMA_SUFFIX)) {
|
|
157
|
-
|
|
220
|
+
if (file.endsWith(SCHEMA_SUFFIX) || SOURCE_MODULE_RE.test(file)) {
|
|
221
|
+
scheduleSchemaEnvSync(state);
|
|
158
222
|
}
|
|
159
223
|
|
|
160
224
|
const virtualId = state.trackedSchemas.get(file);
|
|
@@ -180,6 +244,7 @@ const handleSchemaHotUpdate = (state: PluginState, file: string, server: ViteDev
|
|
|
180
244
|
|
|
181
245
|
const watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {
|
|
182
246
|
const onClose = (): void => {
|
|
247
|
+
cancelSchemaEnvSync(state);
|
|
183
248
|
state.schemaDir.release();
|
|
184
249
|
};
|
|
185
250
|
|
|
@@ -187,8 +252,8 @@ const watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {
|
|
|
187
252
|
server.watcher.once("close", onClose);
|
|
188
253
|
|
|
189
254
|
const refreshSchemaTypes = (file: string): void => {
|
|
190
|
-
if (file.endsWith(SCHEMA_SUFFIX)) {
|
|
191
|
-
|
|
255
|
+
if (file.endsWith(SCHEMA_SUFFIX) || SOURCE_MODULE_RE.test(file)) {
|
|
256
|
+
scheduleSchemaEnvSync(state);
|
|
192
257
|
}
|
|
193
258
|
};
|
|
194
259
|
|
|
@@ -196,12 +261,14 @@ const watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {
|
|
|
196
261
|
server.watcher.on("unlink", refreshSchemaTypes);
|
|
197
262
|
};
|
|
198
263
|
|
|
199
|
-
function gtkxSettings(): Plugin {
|
|
264
|
+
function gtkxSettings(loadConfig: ConfigLoader, buildManifest?: BuildManifestCollector): Plugin {
|
|
200
265
|
const state: PluginState = {
|
|
201
266
|
schemaDir: createRetainedStagingDir(SCHEMA_STAGING_PREFIX),
|
|
202
267
|
rootDir: null,
|
|
203
268
|
dataDir: null,
|
|
269
|
+
isV2ResourceImports: false,
|
|
204
270
|
isBuild: false,
|
|
271
|
+
schemaEnvTimer: null,
|
|
205
272
|
trackedSchemas: new Map(),
|
|
206
273
|
buildSchemas: new Set(),
|
|
207
274
|
};
|
|
@@ -210,8 +277,8 @@ function gtkxSettings(): Plugin {
|
|
|
210
277
|
name: "gtkx:settings",
|
|
211
278
|
enforce: "pre",
|
|
212
279
|
|
|
213
|
-
config(config: UserConfig) {
|
|
214
|
-
applyUserConfig(state, config);
|
|
280
|
+
async config(config: UserConfig) {
|
|
281
|
+
await applyUserConfig(state, config, loadConfig);
|
|
215
282
|
},
|
|
216
283
|
|
|
217
284
|
configResolved(config) {
|
|
@@ -243,10 +310,11 @@ function gtkxSettings(): Plugin {
|
|
|
243
310
|
},
|
|
244
311
|
|
|
245
312
|
buildEnd() {
|
|
246
|
-
|
|
313
|
+
emitBuildSchemas(this, state, buildManifest);
|
|
247
314
|
},
|
|
248
315
|
|
|
249
316
|
closeBundle() {
|
|
317
|
+
cancelSchemaEnvSync(state);
|
|
250
318
|
state.schemaDir.release();
|
|
251
319
|
},
|
|
252
320
|
|