@gtkx/cli 1.4.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 +1 -1
- package/dist/builder.d.ts +1 -0
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -2
- package/dist/builder.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +2 -0
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +30 -6
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/commands/codegen.js +1 -1
- package/dist/commands/codegen.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/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 +20 -11
- 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 +87 -15
- package/dist/deploy/run-deploy.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +21 -10
- 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/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-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +2 -0
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +6 -0
- package/dist/dev/runner.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/source-imports.d.ts +5 -1
- package/dist/internal/source-imports.d.ts.map +1 -1
- package/dist/internal/source-imports.js +23 -44
- package/dist/internal/source-imports.js.map +1 -1
- 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/settings/render.d.ts +4 -1
- package/dist/settings/render.d.ts.map +1 -1
- package/dist/settings/render.js +11 -2
- package/dist/settings/render.js.map +1 -1
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +3 -1
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
- package/dist/vite-plugins/asset-imports.js +2 -12
- package/dist/vite-plugins/asset-imports.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/index.d.ts +1 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +3 -1
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/resources.d.ts.map +1 -1
- package/dist/vite-plugins/resources.js +10 -55
- 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/package.json +10 -9
- package/src/builder.ts +3 -2
- package/src/codegen/run-codegen.ts +53 -7
- package/src/commands/codegen.ts +1 -1
- package/src/deploy/freedesktop/localize.ts +144 -0
- package/src/deploy/install-hints.ts +5 -0
- package/src/deploy/payload/launcher.ts +2 -0
- package/src/deploy/payload/stage.ts +35 -10
- package/src/deploy/run-deploy.ts +128 -13
- package/src/deploy/targets/flatpak-source.ts +33 -10
- package/src/deploy/tools.ts +35 -0
- package/src/dev/locale-dir.ts +22 -0
- package/src/dev/runner-main.ts +2 -0
- package/src/dev/runner.ts +8 -0
- 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/source-imports.ts +28 -57
- package/src/mcp/client.ts +17 -44
- package/src/mcp/handlers.ts +7 -6
- package/src/settings/render.ts +16 -2
- package/src/settings/schema.ts +3 -1
- package/src/vite-plugins/asset-imports.ts +3 -15
- package/src/vite-plugins/i18n.ts +146 -0
- package/src/vite-plugins/index.ts +3 -0
- package/src/vite-plugins/resources.ts +10 -72
- package/src/vite-plugins/self-contained.ts +150 -169
|
@@ -1,198 +1,191 @@
|
|
|
1
|
-
import { isRecord } from "@gtkx/utils";
|
|
2
1
|
import { isBuiltin } from "node:module";
|
|
3
2
|
import { posix } from "node:path";
|
|
4
|
-
import { parseSync } from "vite";
|
|
3
|
+
import { parseSync, Visitor } from "vite";
|
|
5
4
|
const REQUIRE_FACTORY = "createRequire";
|
|
6
5
|
const REQUIRE_BINDING = "require";
|
|
7
6
|
const RESOLVE_PROPERTY = "resolve";
|
|
8
7
|
const MODULE_BUILTIN = "node:module";
|
|
9
8
|
const OUTPUT_DIRECTORY = ".";
|
|
10
9
|
const RELATIVE_SPECIFIER = /^\.\.?(?:\/|$)/;
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
"ExportNamedDeclaration",
|
|
15
|
-
"ImportDeclaration",
|
|
16
|
-
"ImportExpression",
|
|
17
|
-
]);
|
|
18
|
-
const isAstNode = (value) => isRecord(value) && typeof value.type === "string";
|
|
19
|
-
const nodeType = (node) => (typeof node.type === "string" ? node.type : "");
|
|
20
|
-
const nodeName = (node) => node !== null && typeof node.name === "string" ? node.name : null;
|
|
21
|
-
const childNode = (node, key) => {
|
|
22
|
-
const value = node[key];
|
|
23
|
-
return isAstNode(value) ? value : null;
|
|
24
|
-
};
|
|
25
|
-
const childNodes = (node, key) => {
|
|
26
|
-
const value = node[key];
|
|
27
|
-
if (!Array.isArray(value)) {
|
|
28
|
-
return [];
|
|
29
|
-
}
|
|
30
|
-
const entries = value;
|
|
31
|
-
return entries.filter(isAstNode);
|
|
32
|
-
};
|
|
33
|
-
const childValues = (value) => {
|
|
34
|
-
if (Array.isArray(value)) {
|
|
35
|
-
const entries = value;
|
|
36
|
-
return entries;
|
|
37
|
-
}
|
|
38
|
-
if (!isAstNode(value)) {
|
|
39
|
-
return [];
|
|
40
|
-
}
|
|
41
|
-
return Object.values(value).filter((child) => typeof child === "object" && child !== null);
|
|
42
|
-
};
|
|
43
|
-
const visitNode = (value, visit) => {
|
|
44
|
-
if (isAstNode(value)) {
|
|
45
|
-
visit(value);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
const walk = (root, visit) => {
|
|
49
|
-
const stack = [root];
|
|
50
|
-
while (stack.length > 0) {
|
|
51
|
-
const current = stack.pop();
|
|
52
|
-
visitNode(current, visit);
|
|
53
|
-
for (const value of childValues(current)) {
|
|
54
|
-
stack.push(value);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
const countName = (declarations, node) => {
|
|
59
|
-
const name = nodeName(node);
|
|
10
|
+
const exportName = (name) => (name.type === "Identifier" ? name.name : null);
|
|
11
|
+
const referenceName = (node) => (node.type === "Identifier" ? node.name : null);
|
|
12
|
+
const countName = (declarations, name) => {
|
|
60
13
|
if (name !== null) {
|
|
61
14
|
declarations.set(name, (declarations.get(name) ?? 0) + 1);
|
|
62
15
|
}
|
|
63
16
|
};
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
17
|
+
const boundPattern = (item) => {
|
|
18
|
+
if (item === null) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
if (item.type === "Property") {
|
|
22
|
+
return item.value;
|
|
23
|
+
}
|
|
24
|
+
if (item.type === "RestElement") {
|
|
25
|
+
return item.argument;
|
|
26
|
+
}
|
|
27
|
+
return item.type === "TSParameterProperty" ? item.parameter : item;
|
|
28
|
+
};
|
|
29
|
+
const countPatterns = (declarations, items) => {
|
|
30
|
+
for (const item of items) {
|
|
31
|
+
countPattern(declarations, boundPattern(item));
|
|
69
32
|
}
|
|
70
33
|
};
|
|
34
|
+
const countPattern = (declarations, pattern) => {
|
|
35
|
+
if (pattern === null) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (pattern.type === "Identifier") {
|
|
39
|
+
countName(declarations, pattern.name);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (pattern.type === "AssignmentPattern") {
|
|
43
|
+
countPattern(declarations, pattern.left);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
countPatterns(declarations, pattern.type === "ObjectPattern" ? pattern.properties : pattern.elements);
|
|
47
|
+
};
|
|
48
|
+
const countFunction = (declarations, node) => {
|
|
49
|
+
countPattern(declarations, node.id);
|
|
50
|
+
countPatterns(declarations, node.params);
|
|
51
|
+
};
|
|
52
|
+
const declarationVisitor = (declarations) => ({
|
|
53
|
+
ArrowFunctionExpression: (node) => {
|
|
54
|
+
countFunction(declarations, node);
|
|
55
|
+
},
|
|
56
|
+
CatchClause: (node) => {
|
|
57
|
+
countPattern(declarations, node.param);
|
|
58
|
+
},
|
|
59
|
+
ClassDeclaration: (node) => {
|
|
60
|
+
countPattern(declarations, node.id);
|
|
61
|
+
},
|
|
62
|
+
ClassExpression: (node) => {
|
|
63
|
+
countPattern(declarations, node.id);
|
|
64
|
+
},
|
|
65
|
+
ExportSpecifier: (node) => {
|
|
66
|
+
countName(declarations, exportName(node.local));
|
|
67
|
+
},
|
|
68
|
+
FunctionDeclaration: (node) => {
|
|
69
|
+
countFunction(declarations, node);
|
|
70
|
+
},
|
|
71
|
+
FunctionExpression: (node) => {
|
|
72
|
+
countFunction(declarations, node);
|
|
73
|
+
},
|
|
74
|
+
ImportDefaultSpecifier: (node) => {
|
|
75
|
+
countPattern(declarations, node.local);
|
|
76
|
+
},
|
|
77
|
+
ImportNamespaceSpecifier: (node) => {
|
|
78
|
+
countPattern(declarations, node.local);
|
|
79
|
+
},
|
|
80
|
+
ImportSpecifier: (node) => {
|
|
81
|
+
countPattern(declarations, node.local);
|
|
82
|
+
},
|
|
83
|
+
VariableDeclarator: (node) => {
|
|
84
|
+
countPattern(declarations, node.id);
|
|
85
|
+
},
|
|
86
|
+
});
|
|
71
87
|
const isUnshadowed = (name, bindings) => (bindings.declarations.get(name) ?? 0) <= 1;
|
|
72
88
|
const templateString = (node) => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
const [quasi] = childNodes(node, "quasis");
|
|
77
|
-
const value = quasi === undefined ? null : quasi.value;
|
|
78
|
-
return isRecord(value) && typeof value.cooked === "string" ? value.cooked : null;
|
|
89
|
+
const [quasi] = node.quasis;
|
|
90
|
+
return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;
|
|
79
91
|
};
|
|
80
92
|
const literalString = (node) => {
|
|
81
|
-
if (node ===
|
|
82
|
-
return
|
|
83
|
-
}
|
|
84
|
-
if (nodeType(node) === "Literal") {
|
|
85
|
-
return typeof node.value === "string" ? node.value : null;
|
|
93
|
+
if (node?.type === "TemplateLiteral") {
|
|
94
|
+
return templateString(node);
|
|
86
95
|
}
|
|
87
|
-
return
|
|
96
|
+
return node?.type === "Literal" && typeof node.value === "string" ? node.value : null;
|
|
88
97
|
};
|
|
89
98
|
const isMetaUrl = (node, bindings) => {
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
return object !== null && nodeType(object) === "MetaProperty";
|
|
99
|
+
if (node.type === "MemberExpression") {
|
|
100
|
+
return node.object.type === "MetaProperty";
|
|
93
101
|
}
|
|
94
|
-
const name =
|
|
102
|
+
const name = referenceName(node);
|
|
95
103
|
return name !== null && bindings.urls.has(name) && isUnshadowed(name, bindings);
|
|
96
104
|
};
|
|
97
|
-
const hasMetaUrl = (node, bindings) =>
|
|
105
|
+
const hasMetaUrl = (node, bindings) => node.arguments.some((argument) => isMetaUrl(argument, bindings));
|
|
98
106
|
const isRequireName = (name, bindings) => name !== null && (name === REQUIRE_BINDING || bindings.requires.has(name)) && isUnshadowed(name, bindings);
|
|
99
107
|
const isFactoryName = (name, bindings) => name !== null && (name === REQUIRE_FACTORY || bindings.factories.has(name)) && isUnshadowed(name, bindings);
|
|
100
|
-
const isRequireFactory = (node, bindings) =>
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return isFactoryName(nodeName(childNode(node, "callee")), bindings) || hasMetaUrl(node, bindings);
|
|
105
|
-
};
|
|
106
|
-
const isResolveTarget = (object, bindings) => nodeType(object) === "MetaProperty" ||
|
|
107
|
-
isRequireName(nodeName(object), bindings) ||
|
|
108
|
+
const isRequireFactory = (node, bindings) => node.type === "CallExpression" &&
|
|
109
|
+
(isFactoryName(referenceName(node.callee), bindings) || hasMetaUrl(node, bindings));
|
|
110
|
+
const isResolveTarget = (object, bindings) => object.type === "MetaProperty" ||
|
|
111
|
+
isRequireName(referenceName(object), bindings) ||
|
|
108
112
|
isRequireFactory(object, bindings);
|
|
109
|
-
const isResolveMember = (callee, bindings) =>
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
};
|
|
119
|
-
const isResolvingCall = (call, bindings) => {
|
|
120
|
-
if (hasMetaUrl(call, bindings)) {
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
const callee = childNode(call, "callee");
|
|
124
|
-
if (callee === null) {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
return (isRequireName(nodeName(callee), bindings) ||
|
|
128
|
-
isRequireFactory(callee, bindings) ||
|
|
129
|
-
isResolveMember(callee, bindings));
|
|
130
|
-
};
|
|
113
|
+
const isResolveMember = (callee, bindings) => callee.type === "MemberExpression" &&
|
|
114
|
+
!callee.computed &&
|
|
115
|
+
callee.property.type === "Identifier" &&
|
|
116
|
+
callee.property.name === RESOLVE_PROPERTY &&
|
|
117
|
+
isResolveTarget(callee.object, bindings);
|
|
118
|
+
const isResolvingCall = (call, bindings) => hasMetaUrl(call, bindings) ||
|
|
119
|
+
isRequireName(referenceName(call.callee), bindings) ||
|
|
120
|
+
isRequireFactory(call.callee, bindings) ||
|
|
121
|
+
isResolveMember(call.callee, bindings);
|
|
131
122
|
const collectFactories = (node, bindings) => {
|
|
132
|
-
if (
|
|
123
|
+
if (node.source.value !== MODULE_BUILTIN) {
|
|
133
124
|
return;
|
|
134
125
|
}
|
|
135
|
-
for (const specifier of
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
bindings.factories.add(local);
|
|
126
|
+
for (const specifier of node.specifiers) {
|
|
127
|
+
if (specifier.type === "ImportSpecifier" && exportName(specifier.imported) === REQUIRE_FACTORY) {
|
|
128
|
+
bindings.factories.add(specifier.local.name);
|
|
139
129
|
}
|
|
140
130
|
}
|
|
141
131
|
};
|
|
142
132
|
const collectBinding = (node, bindings) => {
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
if (name === null || init === null) {
|
|
133
|
+
const { id, init } = node;
|
|
134
|
+
if (init === null || id.type !== "Identifier") {
|
|
146
135
|
return;
|
|
147
136
|
}
|
|
148
137
|
if (isMetaUrl(init, bindings)) {
|
|
149
|
-
bindings.urls.add(name);
|
|
138
|
+
bindings.urls.add(id.name);
|
|
150
139
|
}
|
|
151
140
|
if (isRequireFactory(init, bindings)) {
|
|
152
|
-
bindings.requires.add(name);
|
|
141
|
+
bindings.requires.add(id.name);
|
|
153
142
|
}
|
|
154
143
|
};
|
|
155
|
-
const
|
|
156
|
-
const collectSource = (scan, node, type) => {
|
|
157
|
-
if (!SOURCE_STATEMENTS.has(type)) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
const source = literalString(childNode(node, "source"));
|
|
144
|
+
const collectSource = (scan, source) => {
|
|
161
145
|
if (source !== null) {
|
|
162
146
|
scan.sources.push(source);
|
|
163
147
|
}
|
|
164
148
|
};
|
|
165
|
-
const collectCall = (scan, node
|
|
166
|
-
if (
|
|
149
|
+
const collectCall = (scan, node) => {
|
|
150
|
+
if (node.arguments.some((argument) => literalString(argument) !== null)) {
|
|
167
151
|
scan.calls.push(node);
|
|
168
152
|
}
|
|
169
153
|
};
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
154
|
+
const scanVisitor = (scan) => ({
|
|
155
|
+
CallExpression: (node) => {
|
|
156
|
+
collectCall(scan, node);
|
|
157
|
+
},
|
|
158
|
+
ExportAllDeclaration: (node) => {
|
|
159
|
+
collectSource(scan, node.source.value);
|
|
160
|
+
},
|
|
161
|
+
ExportNamedDeclaration: (node) => {
|
|
162
|
+
collectSource(scan, node.source?.value ?? null);
|
|
163
|
+
},
|
|
164
|
+
ImportDeclaration: (node) => {
|
|
174
165
|
collectFactories(node, scan.bindings);
|
|
175
|
-
|
|
176
|
-
|
|
166
|
+
collectSource(scan, node.source.value);
|
|
167
|
+
},
|
|
168
|
+
ImportExpression: (node) => {
|
|
169
|
+
collectSource(scan, literalString(node.source));
|
|
170
|
+
},
|
|
171
|
+
VariableDeclarator: (node) => {
|
|
177
172
|
collectBinding(node, scan.bindings);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
collectCall(scan, node, type);
|
|
181
|
-
};
|
|
173
|
+
},
|
|
174
|
+
});
|
|
182
175
|
const scanChunk = (chunk) => {
|
|
183
176
|
const scan = {
|
|
184
177
|
bindings: { declarations: new Map(), factories: new Set(), requires: new Set(), urls: new Set() },
|
|
185
178
|
calls: [],
|
|
186
179
|
sources: [],
|
|
187
180
|
};
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
181
|
+
const { program } = parseSync(chunk.fileName, chunk.code);
|
|
182
|
+
new Visitor(declarationVisitor(scan.bindings.declarations)).visit(program);
|
|
183
|
+
new Visitor(scanVisitor(scan)).visit(program);
|
|
191
184
|
return scan;
|
|
192
185
|
};
|
|
193
186
|
const callSpecifiers = (scan) => scan.calls
|
|
194
187
|
.filter((call) => isResolvingCall(call, scan.bindings))
|
|
195
|
-
.flatMap((call) =>
|
|
188
|
+
.flatMap((call) => call.arguments)
|
|
196
189
|
.map((argument) => literalString(argument))
|
|
197
190
|
.filter((specifier) => specifier !== null);
|
|
198
191
|
const isReachable = (specifier, directory, emitted) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-contained.js","sourceRoot":"","sources":["../../src/vite-plugins/self-contained.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"vite\";\nimport { isRecord } from \"@gtkx/utils\";\nimport { isBuiltin } from \"node:module\";\nimport { posix } from \"node:path\";\nimport { parseSync } from \"vite\";\n\ntype AstNode = Record<string, unknown>;\n\ntype Bindings = {\n declarations: Map<string, number>;\n factories: Set<string>;\n requires: Set<string>;\n urls: Set<string>;\n};\n\ntype Scan = {\n bindings: Bindings;\n calls: AstNode[];\n sources: string[];\n};\n\ntype Chunk = {\n fileName: string;\n code: string;\n};\n\nconst REQUIRE_FACTORY = \"createRequire\";\nconst REQUIRE_BINDING = \"require\";\nconst RESOLVE_PROPERTY = \"resolve\";\nconst MODULE_BUILTIN = \"node:module\";\nconst OUTPUT_DIRECTORY = \".\";\nconst RELATIVE_SPECIFIER = /^\\.\\.?(?:\\/|$)/;\nconst DECLARATION_KEYS = [\"id\", \"local\", \"param\", \"params\"];\n\nconst SOURCE_STATEMENTS = new Set([\n \"ExportAllDeclaration\",\n \"ExportNamedDeclaration\",\n \"ImportDeclaration\",\n \"ImportExpression\",\n]);\n\nconst isAstNode = (value: unknown): value is AstNode => isRecord(value) && typeof value.type === \"string\";\nconst nodeType = (node: AstNode): string => (typeof node.type === \"string\" ? node.type : \"\");\n\nconst nodeName = (node: AstNode | null): string | null =>\n node !== null && typeof node.name === \"string\" ? node.name : null;\n\nconst childNode = (node: AstNode, key: string): AstNode | null => {\n const value = node[key];\n\n return isAstNode(value) ? value : null;\n};\n\nconst childNodes = (node: AstNode, key: string): AstNode[] => {\n const value = node[key];\n\n if (!Array.isArray(value)) {\n return [];\n }\n\n const entries: unknown[] = value;\n\n return entries.filter(isAstNode);\n};\n\nconst childValues = (value: unknown): unknown[] => {\n if (Array.isArray(value)) {\n const entries: unknown[] = value;\n\n return entries;\n }\n\n if (!isAstNode(value)) {\n return [];\n }\n\n return Object.values(value).filter((child) => typeof child === \"object\" && child !== null);\n};\n\nconst visitNode = (value: unknown, visit: (node: AstNode) => void): void => {\n if (isAstNode(value)) {\n visit(value);\n }\n};\n\nconst walk = (root: unknown, visit: (node: AstNode) => void): void => {\n const stack: unknown[] = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n visitNode(current, visit);\n\n for (const value of childValues(current)) {\n stack.push(value);\n }\n }\n};\n\nconst countName = (declarations: Map<string, number>, node: AstNode): void => {\n const name = nodeName(node);\n\n if (name !== null) {\n declarations.set(name, (declarations.get(name) ?? 0) + 1);\n }\n};\n\nconst countDeclarations = (node: AstNode, declarations: Map<string, number>): void => {\n for (const key of DECLARATION_KEYS) {\n walk(node[key], (declared) => {\n countName(declarations, declared);\n });\n }\n};\n\nconst isUnshadowed = (name: string, bindings: Bindings): boolean => (bindings.declarations.get(name) ?? 0) <= 1;\n\nconst templateString = (node: AstNode): string | null => {\n if (childNodes(node, \"expressions\").length > 0) {\n return null;\n }\n\n const [quasi] = childNodes(node, \"quasis\");\n const value = quasi === undefined ? null : quasi.value;\n\n return isRecord(value) && typeof value.cooked === \"string\" ? value.cooked : null;\n};\n\nconst literalString = (node: AstNode | null): string | null => {\n if (node === null) {\n return null;\n }\n\n if (nodeType(node) === \"Literal\") {\n return typeof node.value === \"string\" ? node.value : null;\n }\n\n return nodeType(node) === \"TemplateLiteral\" ? templateString(node) : null;\n};\n\nconst isMetaUrl = (node: AstNode, bindings: Bindings): boolean => {\n if (nodeType(node) === \"MemberExpression\") {\n const object = childNode(node, \"object\");\n\n return object !== null && nodeType(object) === \"MetaProperty\";\n }\n\n const name = nodeName(node);\n\n return name !== null && bindings.urls.has(name) && isUnshadowed(name, bindings);\n};\n\nconst hasMetaUrl = (node: AstNode, bindings: Bindings): boolean =>\n childNodes(node, \"arguments\").some((argument) => isMetaUrl(argument, bindings));\n\nconst isRequireName = (name: string | null, bindings: Bindings): boolean =>\n name !== null && (name === REQUIRE_BINDING || bindings.requires.has(name)) && isUnshadowed(name, bindings);\n\nconst isFactoryName = (name: string | null, bindings: Bindings): boolean =>\n name !== null && (name === REQUIRE_FACTORY || bindings.factories.has(name)) && isUnshadowed(name, bindings);\n\nconst isRequireFactory = (node: AstNode, bindings: Bindings): boolean => {\n if (nodeType(node) !== \"CallExpression\") {\n return false;\n }\n\n return isFactoryName(nodeName(childNode(node, \"callee\")), bindings) || hasMetaUrl(node, bindings);\n};\n\nconst isResolveTarget = (object: AstNode, bindings: Bindings): boolean =>\n nodeType(object) === \"MetaProperty\" ||\n isRequireName(nodeName(object), bindings) ||\n isRequireFactory(object, bindings);\n\nconst isResolveMember = (callee: AstNode, bindings: Bindings): boolean => {\n if (nodeType(callee) !== \"MemberExpression\" || callee.computed === true) {\n return false;\n }\n\n if (nodeName(childNode(callee, \"property\")) !== RESOLVE_PROPERTY) {\n return false;\n }\n\n const object = childNode(callee, \"object\");\n\n return object !== null && isResolveTarget(object, bindings);\n};\n\nconst isResolvingCall = (call: AstNode, bindings: Bindings): boolean => {\n if (hasMetaUrl(call, bindings)) {\n return true;\n }\n\n const callee = childNode(call, \"callee\");\n\n if (callee === null) {\n return false;\n }\n\n return (\n isRequireName(nodeName(callee), bindings) ||\n isRequireFactory(callee, bindings) ||\n isResolveMember(callee, bindings)\n );\n};\n\nconst collectFactories = (node: AstNode, bindings: Bindings): void => {\n if (literalString(childNode(node, \"source\")) !== MODULE_BUILTIN) {\n return;\n }\n\n for (const specifier of childNodes(node, \"specifiers\")) {\n const local = nodeName(childNode(specifier, \"local\"));\n\n if (local !== null && nodeName(childNode(specifier, \"imported\")) === REQUIRE_FACTORY) {\n bindings.factories.add(local);\n }\n }\n};\n\nconst collectBinding = (node: AstNode, bindings: Bindings): void => {\n const name = nodeName(childNode(node, \"id\"));\n const init = childNode(node, \"init\");\n\n if (name === null || init === null) {\n return;\n }\n\n if (isMetaUrl(init, bindings)) {\n bindings.urls.add(name);\n }\n\n if (isRequireFactory(init, bindings)) {\n bindings.requires.add(name);\n }\n};\n\nconst hasStringArgument = (call: AstNode): boolean =>\n childNodes(call, \"arguments\").some((argument) => literalString(argument) !== null);\n\nconst collectSource = (scan: Scan, node: AstNode, type: string): void => {\n if (!SOURCE_STATEMENTS.has(type)) {\n return;\n }\n\n const source = literalString(childNode(node, \"source\"));\n\n if (source !== null) {\n scan.sources.push(source);\n }\n};\n\nconst collectCall = (scan: Scan, node: AstNode, type: string): void => {\n if (type === \"CallExpression\" && hasStringArgument(node)) {\n scan.calls.push(node);\n }\n};\n\nconst scanNode = (scan: Scan, node: AstNode): void => {\n const type = nodeType(node);\n countDeclarations(node, scan.bindings.declarations);\n\n if (type === \"ImportDeclaration\") {\n collectFactories(node, scan.bindings);\n } else if (type === \"VariableDeclarator\") {\n collectBinding(node, scan.bindings);\n }\n\n collectSource(scan, node, type);\n collectCall(scan, node, type);\n};\n\nconst scanChunk = (chunk: Chunk): Scan => {\n const scan: Scan = {\n bindings: { declarations: new Map(), factories: new Set(), requires: new Set(), urls: new Set() },\n calls: [],\n sources: [],\n };\n\n walk(parseSync(chunk.fileName, chunk.code).program, (node) => {\n scanNode(scan, node);\n });\n\n return scan;\n};\n\nconst callSpecifiers = (scan: Scan): string[] =>\n scan.calls\n .filter((call) => isResolvingCall(call, scan.bindings))\n .flatMap((call) => childNodes(call, \"arguments\"))\n .map((argument) => literalString(argument))\n .filter((specifier) => specifier !== null);\n\nconst isReachable = (specifier: string, directory: string, emitted: Set<string>): boolean => {\n if (isBuiltin(specifier)) {\n return true;\n }\n\n if (!RELATIVE_SPECIFIER.test(specifier)) {\n return false;\n }\n\n const target = posix.normalize(posix.join(directory, specifier));\n\n return target === OUTPUT_DIRECTORY || emitted.has(target);\n};\n\nconst unreachableSpecifiers = (chunk: Chunk, emitted: Set<string>): string[] => {\n const scan = scanChunk(chunk);\n const directory = posix.dirname(chunk.fileName);\n\n return new Set([...scan.sources, ...callSpecifiers(scan)])\n .values()\n .filter((specifier) => !isReachable(specifier, directory, emitted))\n .toArray()\n .toSorted((left, right) => left.localeCompare(right));\n};\n\nconst assertSelfContained = (chunk: Chunk, emitted: Set<string>): void => {\n const specifiers = unreachableSpecifiers(chunk, emitted);\n\n if (specifiers.length === 0) {\n return;\n }\n\n throw new Error(\n [\n `${chunk.fileName} resolves ${specifiers.join(\", \")} at runtime,`,\n \"so the built app only starts where that resolution succeeds from wherever it was installed.\",\n \"The artifact may resolve node: builtins and the files the build emits beside it, nothing else:\",\n \"bundle the module, emit the file, or read the data at build time.\",\n ].join(\" \"),\n );\n};\n\nfunction gtkxSelfContained(): Plugin {\n return {\n name: \"gtkx:self-contained\",\n apply: \"build\",\n\n generateBundle(_options, bundle) {\n const emitted = new Set(Object.keys(bundle));\n\n for (const output of Object.values(bundle)) {\n if (output.type === \"chunk\") {\n assertSelfContained({ fileName: output.fileName, code: output.code }, emitted);\n }\n }\n },\n };\n}\n\nexport { gtkxSelfContained };\n"]}
|
|
1
|
+
{"version":3,"file":"self-contained.js","sourceRoot":"","sources":["../../src/vite-plugins/self-contained.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA4B1C,MAAM,eAAe,GAAG,eAAe,CAAC;AACxC,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C,MAAM,UAAU,GAAG,CAAC,IAA6B,EAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrH,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEhH,MAAM,SAAS,GAAG,CAAC,YAAiC,EAAE,IAAmB,EAAQ,EAAE;IAC/E,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAiB,EAAgC,EAAE;IACrE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,YAAiC,EAAE,KAAoB,EAAQ,EAAE;IACpF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,YAAiC,EAAE,OAAqC,EAAQ,EAAE;IACpG,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEtC,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACvC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzC,OAAO;IACX,CAAC;IAED,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC1G,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAClB,YAAiC,EACjC,IAAsD,EAClD,EAAE;IACN,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,YAAiC,EAAiB,EAAE,CAAC,CAAC;IAC9E,uBAAuB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC9B,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;QACtB,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;QACtB,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC1B,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,sBAAsB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC7B,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,wBAAwB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/B,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;QACtB,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,QAAkB,EAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAEhH,MAAM,cAAc,GAAG,CAAC,IAA4B,EAAiB,EAAE;IACnE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAE5B,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAA4B,EAAiB,EAAE;IAClE,IAAI,IAAI,EAAE,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACnC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,IAAqB,EAAE,QAAkB,EAAW,EAAE;IACrE,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAA2B,EAAE,QAAkB,EAAW,EAAE,CAC5E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAErE,MAAM,aAAa,GAAG,CAAC,IAAmB,EAAE,QAAkB,EAAW,EAAE,CACvE,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAE/G,MAAM,aAAa,GAAG,CAAC,IAAmB,EAAE,QAAkB,EAAW,EAAE,CACvE,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEhH,MAAM,gBAAgB,GAAG,CAAC,IAAqB,EAAE,QAAkB,EAAW,EAAE,CAC5E,IAAI,CAAC,IAAI,KAAK,gBAAgB;IAC9B,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AAExF,MAAM,eAAe,GAAG,CAAC,MAAyB,EAAE,QAAkB,EAAW,EAAE,CAC/E,MAAM,CAAC,IAAI,KAAK,cAAc;IAC9B,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAC9C,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEvC,MAAM,eAAe,GAAG,CAAC,MAAyB,EAAE,QAAkB,EAAW,EAAE,CAC/E,MAAM,CAAC,IAAI,KAAK,kBAAkB;IAClC,CAAC,MAAM,CAAC,QAAQ;IAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;IACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,gBAAgB;IACzC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE7C,MAAM,eAAe,GAAG,CAAC,IAA2B,EAAE,QAAkB,EAAW,EAAE,CACjF,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;IAC1B,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IACnD,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;IACvC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE3C,MAAM,gBAAgB,GAAG,CAAC,IAA8B,EAAE,QAAkB,EAAQ,EAAE;IAClF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;QACvC,OAAO;IACX,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,IAAI,KAAK,iBAAiB,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,eAAe,EAAE,CAAC;YAC7F,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAA+B,EAAE,QAAkB,EAAQ,EAAE;IACjF,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE1B,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC5C,OAAO;IACX,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,MAAqB,EAAQ,EAAE;IAC9D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAU,EAAE,IAA2B,EAAQ,EAAE;IAClE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAU,EAAiB,EAAE,CAAC,CAAC;IAChD,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC3B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,sBAAsB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC7B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,KAAY,EAAQ,EAAE;IACrC,MAAM,IAAI,GAAS;QACf,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE;QACjG,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;KACd,CAAC;IAEF,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE9C,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAU,EAAY,EAAE,CAC5C,IAAI,CAAC,KAAK;KACL,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACtD,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;KACjC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;KAC1C,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;AAEnD,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAoB,EAAW,EAAE;IACxF,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjE,OAAO,MAAM,KAAK,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,KAAY,EAAE,OAAoB,EAAY,EAAE;IAC3E,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEhD,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;SACrD,MAAM,EAAE;SACR,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;SAClE,OAAO,EAAE;SACT,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,KAAY,EAAE,OAAoB,EAAQ,EAAE;IACrE,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACX,CAAC;IAED,MAAM,IAAI,KAAK,CACX;QACI,GAAG,KAAK,CAAC,QAAQ,aAAa,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc;QACjE,6FAA6F;QAC7F,gGAAgG;QAChG,mEAAmE;KACtE,CAAC,IAAI,CAAC,GAAG,CAAC,CACd,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,iBAAiB;IACtB,OAAO;QACH,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,OAAO;QAEd,cAAc,CAAC,QAAQ,EAAE,MAAM;YAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAE7C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC1B,mBAAmB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;gBACnF,CAAC;YACL,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import type { ESTree, Plugin, VisitorObject } from \"vite\";\nimport { isBuiltin } from \"node:module\";\nimport { posix } from \"node:path\";\nimport { parseSync, Visitor } from \"vite\";\n\ntype Bindings = {\n declarations: Map<string, number>;\n factories: Set<string>;\n requires: Set<string>;\n urls: Set<string>;\n};\n\ntype Scan = {\n bindings: Bindings;\n calls: ESTree.CallExpression[];\n sources: string[];\n};\n\ntype Chunk = {\n fileName: string;\n code: string;\n};\n\ntype PatternItem =\n | ESTree.BindingPattern |\n ESTree.BindingProperty |\n ESTree.BindingRestElement |\n ESTree.FormalParameterRest |\n ESTree.TSParameterProperty |\n null;\n\nconst REQUIRE_FACTORY = \"createRequire\";\nconst REQUIRE_BINDING = \"require\";\nconst RESOLVE_PROPERTY = \"resolve\";\nconst MODULE_BUILTIN = \"node:module\";\nconst OUTPUT_DIRECTORY = \".\";\nconst RELATIVE_SPECIFIER = /^\\.\\.?(?:\\/|$)/;\n\nconst exportName = (name: ESTree.ModuleExportName): string | null => (name.type === \"Identifier\" ? name.name : null);\nconst referenceName = (node: ESTree.Argument): string | null => (node.type === \"Identifier\" ? node.name : null);\n\nconst countName = (declarations: Map<string, number>, name: string | null): void => {\n if (name !== null) {\n declarations.set(name, (declarations.get(name) ?? 0) + 1);\n }\n};\n\nconst boundPattern = (item: PatternItem): ESTree.BindingPattern | null => {\n if (item === null) {\n return null;\n }\n\n if (item.type === \"Property\") {\n return item.value;\n }\n\n if (item.type === \"RestElement\") {\n return item.argument;\n }\n\n return item.type === \"TSParameterProperty\" ? item.parameter : item;\n};\n\nconst countPatterns = (declarations: Map<string, number>, items: PatternItem[]): void => {\n for (const item of items) {\n countPattern(declarations, boundPattern(item));\n }\n};\n\nconst countPattern = (declarations: Map<string, number>, pattern: ESTree.BindingPattern | null): void => {\n if (pattern === null) {\n return;\n }\n\n if (pattern.type === \"Identifier\") {\n countName(declarations, pattern.name);\n\n return;\n }\n\n if (pattern.type === \"AssignmentPattern\") {\n countPattern(declarations, pattern.left);\n\n return;\n }\n\n countPatterns(declarations, pattern.type === \"ObjectPattern\" ? pattern.properties : pattern.elements);\n};\n\nconst countFunction = (\n declarations: Map<string, number>,\n node: ESTree.ArrowFunctionExpression | ESTree.Function,\n): void => {\n countPattern(declarations, node.id);\n countPatterns(declarations, node.params);\n};\n\nconst declarationVisitor = (declarations: Map<string, number>): VisitorObject => ({\n ArrowFunctionExpression: (node) => {\n countFunction(declarations, node);\n },\n CatchClause: (node) => {\n countPattern(declarations, node.param);\n },\n ClassDeclaration: (node) => {\n countPattern(declarations, node.id);\n },\n ClassExpression: (node) => {\n countPattern(declarations, node.id);\n },\n ExportSpecifier: (node) => {\n countName(declarations, exportName(node.local));\n },\n FunctionDeclaration: (node) => {\n countFunction(declarations, node);\n },\n FunctionExpression: (node) => {\n countFunction(declarations, node);\n },\n ImportDefaultSpecifier: (node) => {\n countPattern(declarations, node.local);\n },\n ImportNamespaceSpecifier: (node) => {\n countPattern(declarations, node.local);\n },\n ImportSpecifier: (node) => {\n countPattern(declarations, node.local);\n },\n VariableDeclarator: (node) => {\n countPattern(declarations, node.id);\n },\n});\n\nconst isUnshadowed = (name: string, bindings: Bindings): boolean => (bindings.declarations.get(name) ?? 0) <= 1;\n\nconst templateString = (node: ESTree.TemplateLiteral): string | null => {\n const [quasi] = node.quasis;\n\n return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;\n};\n\nconst literalString = (node: ESTree.Argument | null): string | null => {\n if (node?.type === \"TemplateLiteral\") {\n return templateString(node);\n }\n\n return node?.type === \"Literal\" && typeof node.value === \"string\" ? node.value : null;\n};\n\nconst isMetaUrl = (node: ESTree.Argument, bindings: Bindings): boolean => {\n if (node.type === \"MemberExpression\") {\n return node.object.type === \"MetaProperty\";\n }\n\n const name = referenceName(node);\n\n return name !== null && bindings.urls.has(name) && isUnshadowed(name, bindings);\n};\n\nconst hasMetaUrl = (node: ESTree.CallExpression, bindings: Bindings): boolean =>\n node.arguments.some((argument) => isMetaUrl(argument, bindings));\n\nconst isRequireName = (name: string | null, bindings: Bindings): boolean =>\n name !== null && (name === REQUIRE_BINDING || bindings.requires.has(name)) && isUnshadowed(name, bindings);\n\nconst isFactoryName = (name: string | null, bindings: Bindings): boolean =>\n name !== null && (name === REQUIRE_FACTORY || bindings.factories.has(name)) && isUnshadowed(name, bindings);\n\nconst isRequireFactory = (node: ESTree.Argument, bindings: Bindings): boolean =>\n node.type === \"CallExpression\" &&\n (isFactoryName(referenceName(node.callee), bindings) || hasMetaUrl(node, bindings));\n\nconst isResolveTarget = (object: ESTree.Expression, bindings: Bindings): boolean =>\n object.type === \"MetaProperty\" ||\n isRequireName(referenceName(object), bindings) ||\n isRequireFactory(object, bindings);\n\nconst isResolveMember = (callee: ESTree.Expression, bindings: Bindings): boolean =>\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === RESOLVE_PROPERTY &&\n isResolveTarget(callee.object, bindings);\n\nconst isResolvingCall = (call: ESTree.CallExpression, bindings: Bindings): boolean =>\n hasMetaUrl(call, bindings) ||\n isRequireName(referenceName(call.callee), bindings) ||\n isRequireFactory(call.callee, bindings) ||\n isResolveMember(call.callee, bindings);\n\nconst collectFactories = (node: ESTree.ImportDeclaration, bindings: Bindings): void => {\n if (node.source.value !== MODULE_BUILTIN) {\n return;\n }\n\n for (const specifier of node.specifiers) {\n if (specifier.type === \"ImportSpecifier\" && exportName(specifier.imported) === REQUIRE_FACTORY) {\n bindings.factories.add(specifier.local.name);\n }\n }\n};\n\nconst collectBinding = (node: ESTree.VariableDeclarator, bindings: Bindings): void => {\n const { id, init } = node;\n\n if (init === null || id.type !== \"Identifier\") {\n return;\n }\n\n if (isMetaUrl(init, bindings)) {\n bindings.urls.add(id.name);\n }\n\n if (isRequireFactory(init, bindings)) {\n bindings.requires.add(id.name);\n }\n};\n\nconst collectSource = (scan: Scan, source: string | null): void => {\n if (source !== null) {\n scan.sources.push(source);\n }\n};\n\nconst collectCall = (scan: Scan, node: ESTree.CallExpression): void => {\n if (node.arguments.some((argument) => literalString(argument) !== null)) {\n scan.calls.push(node);\n }\n};\n\nconst scanVisitor = (scan: Scan): VisitorObject => ({\n CallExpression: (node) => {\n collectCall(scan, node);\n },\n ExportAllDeclaration: (node) => {\n collectSource(scan, node.source.value);\n },\n ExportNamedDeclaration: (node) => {\n collectSource(scan, node.source?.value ?? null);\n },\n ImportDeclaration: (node) => {\n collectFactories(node, scan.bindings);\n collectSource(scan, node.source.value);\n },\n ImportExpression: (node) => {\n collectSource(scan, literalString(node.source));\n },\n VariableDeclarator: (node) => {\n collectBinding(node, scan.bindings);\n },\n});\n\nconst scanChunk = (chunk: Chunk): Scan => {\n const scan: Scan = {\n bindings: { declarations: new Map(), factories: new Set(), requires: new Set(), urls: new Set() },\n calls: [],\n sources: [],\n };\n\n const { program } = parseSync(chunk.fileName, chunk.code);\n new Visitor(declarationVisitor(scan.bindings.declarations)).visit(program);\n new Visitor(scanVisitor(scan)).visit(program);\n\n return scan;\n};\n\nconst callSpecifiers = (scan: Scan): string[] =>\n scan.calls\n .filter((call) => isResolvingCall(call, scan.bindings))\n .flatMap((call) => call.arguments)\n .map((argument) => literalString(argument))\n .filter((specifier) => specifier !== null);\n\nconst isReachable = (specifier: string, directory: string, emitted: Set<string>): boolean => {\n if (isBuiltin(specifier)) {\n return true;\n }\n\n if (!RELATIVE_SPECIFIER.test(specifier)) {\n return false;\n }\n\n const target = posix.normalize(posix.join(directory, specifier));\n\n return target === OUTPUT_DIRECTORY || emitted.has(target);\n};\n\nconst unreachableSpecifiers = (chunk: Chunk, emitted: Set<string>): string[] => {\n const scan = scanChunk(chunk);\n const directory = posix.dirname(chunk.fileName);\n\n return new Set([...scan.sources, ...callSpecifiers(scan)])\n .values()\n .filter((specifier) => !isReachable(specifier, directory, emitted))\n .toArray()\n .toSorted((left, right) => left.localeCompare(right));\n};\n\nconst assertSelfContained = (chunk: Chunk, emitted: Set<string>): void => {\n const specifiers = unreachableSpecifiers(chunk, emitted);\n\n if (specifiers.length === 0) {\n return;\n }\n\n throw new Error(\n [\n `${chunk.fileName} resolves ${specifiers.join(\", \")} at runtime,`,\n \"so the built app only starts where that resolution succeeds from wherever it was installed.\",\n \"The artifact may resolve node: builtins and the files the build emits beside it, nothing else:\",\n \"bundle the module, emit the file, or read the data at build time.\",\n ].join(\" \"),\n );\n};\n\nfunction gtkxSelfContained(): Plugin {\n return {\n name: \"gtkx:self-contained\",\n apply: \"build\",\n\n generateBundle(_options, bundle) {\n const emitted = new Set(Object.keys(bundle));\n\n for (const output of Object.values(bundle)) {\n if (output.type === \"chunk\") {\n assertSelfContained({ fileName: output.fileName, code: output.code }, emitted);\n }\n }\n },\n };\n}\n\nexport { gtkxSelfContained };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "GTK app toolchain for React: scaffold, dev server, build, docs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -70,22 +70,23 @@
|
|
|
70
70
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
71
71
|
"citty": "^0.2.2",
|
|
72
72
|
"fast-xml-parser": "^5.11.0",
|
|
73
|
+
"i18next-cli": "1.71.3",
|
|
73
74
|
"react-refresh": "^0.18.0",
|
|
74
75
|
"vite": "^8.2.2",
|
|
75
76
|
"yaml": "^2.9.0",
|
|
76
|
-
"@gtkx/codegen": "1.
|
|
77
|
-
"@gtkx/
|
|
78
|
-
"@gtkx/
|
|
79
|
-
"@gtkx/
|
|
80
|
-
"@gtkx/
|
|
81
|
-
"@gtkx/vitest": "1.
|
|
82
|
-
"create-gtkx": "1.
|
|
77
|
+
"@gtkx/codegen": "1.5.0",
|
|
78
|
+
"@gtkx/mcp": "1.5.0",
|
|
79
|
+
"@gtkx/runtime": "1.5.0",
|
|
80
|
+
"@gtkx/config": "1.5.0",
|
|
81
|
+
"@gtkx/utils": "1.5.0",
|
|
82
|
+
"@gtkx/vitest": "1.5.0",
|
|
83
|
+
"create-gtkx": "1.5.0"
|
|
83
84
|
},
|
|
84
85
|
"devDependencies": {
|
|
85
86
|
"@types/babel__core": "^7.20.5",
|
|
86
87
|
"@types/react-refresh": "^0.14.7",
|
|
87
88
|
"vitest": "^4.1.11",
|
|
88
|
-
"@gtkx/testing": "1.
|
|
89
|
+
"@gtkx/testing": "1.5.0"
|
|
89
90
|
},
|
|
90
91
|
"peerDependencies": {
|
|
91
92
|
"react": "^19"
|
package/src/builder.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { gtkxWorker } from "./vite-plugins/worker.js";
|
|
|
10
10
|
|
|
11
11
|
type BuildOptions = {
|
|
12
12
|
entry: string;
|
|
13
|
+
shouldPreserveI18nMetadata?: boolean | undefined;
|
|
13
14
|
vite?: InlineConfig | undefined;
|
|
14
15
|
};
|
|
15
16
|
|
|
@@ -32,14 +33,14 @@ const buildDefaults: InlineConfig = {
|
|
|
32
33
|
};
|
|
33
34
|
|
|
34
35
|
const build = async (options: BuildOptions): Promise<string> => {
|
|
35
|
-
const { entry, vite: viteConfig } = options;
|
|
36
|
+
const { entry, shouldPreserveI18nMetadata = true, vite: viteConfig } = options;
|
|
36
37
|
const root = viteConfig?.root ?? process.cwd();
|
|
37
38
|
const assetsDir = viteConfig?.build?.assetsDir ?? DEFAULT_ASSETS_DIR;
|
|
38
39
|
const buildManifest = createBuildManifestCollector();
|
|
39
40
|
|
|
40
41
|
const forced: InlineConfig = {
|
|
41
42
|
plugins: [
|
|
42
|
-
...gtkxVitePlugins(BUILD_MODE,
|
|
43
|
+
...gtkxVitePlugins(BUILD_MODE, entry, buildManifest, shouldPreserveI18nMetadata),
|
|
43
44
|
gtkxWorker(),
|
|
44
45
|
gtkxNative(root),
|
|
45
46
|
gtkxBuildManifest(root, buildManifest),
|
|
@@ -8,9 +8,13 @@ import {
|
|
|
8
8
|
resolveOmittedProps,
|
|
9
9
|
} from "@gtkx/config/internal";
|
|
10
10
|
import { info, warn } from "@gtkx/utils";
|
|
11
|
-
import { rmSync } from "node:fs";
|
|
12
|
-
import { resolve } from "node:path";
|
|
11
|
+
import { existsSync, rmSync } from "node:fs";
|
|
12
|
+
import { join, resolve } from "node:path";
|
|
13
|
+
import { resolveCatalogProject, synchronizeCatalogs } from "../i18n/catalogs.js";
|
|
14
|
+
import { extractSourceCatalog } from "../i18n/source-messages.js";
|
|
15
|
+
import { emitI18nTypes } from "../i18n/types.js";
|
|
13
16
|
import { resolveDataDir } from "../internal/data-dir.js";
|
|
17
|
+
import { discoverSourceFiles } from "../internal/source-imports.js";
|
|
14
18
|
import { emitSchemaEnv } from "../settings/schema.js";
|
|
15
19
|
import { type CodegenInputs, isCodegenStale, resolveCodegenInputs } from "./freshness.js";
|
|
16
20
|
import { type CodegenContext, type CodegenStore, resolveCodegenContext } from "./store-resolver.js";
|
|
@@ -21,6 +25,7 @@ type RunCodegenOptions = {
|
|
|
21
25
|
isForced?: boolean;
|
|
22
26
|
inputs?: CodegenInputs;
|
|
23
27
|
resolved?: LoadedConfig;
|
|
28
|
+
shouldPreserveI18nMetadata?: boolean | undefined;
|
|
24
29
|
};
|
|
25
30
|
|
|
26
31
|
type LoadedConfig = {
|
|
@@ -52,13 +57,19 @@ type CodegenOptionsInput = {
|
|
|
52
57
|
};
|
|
53
58
|
|
|
54
59
|
type PreparedCodegen = CodegenInputs & { isForced: boolean };
|
|
55
|
-
|
|
60
|
+
|
|
61
|
+
type EnsureGeneratedOptions = {
|
|
62
|
+
shouldAnnounce?: boolean;
|
|
63
|
+
mode?: string;
|
|
64
|
+
shouldPreserveI18nMetadata?: boolean | undefined;
|
|
65
|
+
};
|
|
56
66
|
|
|
57
67
|
type RunOptionsInput = {
|
|
58
68
|
root: string;
|
|
59
69
|
mode: string | undefined;
|
|
60
70
|
inputs: CodegenInputs | null;
|
|
61
71
|
resolved: LoadedConfig;
|
|
72
|
+
shouldPreserveI18nMetadata: boolean | undefined;
|
|
62
73
|
};
|
|
63
74
|
|
|
64
75
|
const GIR_PATH_MISSING_MESSAGE =
|
|
@@ -156,6 +167,7 @@ const prepareCodegen = (options: RunCodegenOptions, cwd: string, config: Config)
|
|
|
156
167
|
const runCodegen = async (options: RunCodegenOptions = {}): Promise<RunCodegenResult> => {
|
|
157
168
|
const cwd = options.cwd ?? process.cwd();
|
|
158
169
|
const { config, configFile } = await resolveLoadedConfig(options, cwd);
|
|
170
|
+
await syncI18n(cwd, config.applicationId, options.shouldPreserveI18nMetadata);
|
|
159
171
|
syncSchemaEnv(cwd, config.future?.v2ResourceImports === true);
|
|
160
172
|
|
|
161
173
|
if (config.codegen === false) {
|
|
@@ -199,6 +211,26 @@ const runCodegen = async (options: RunCodegenOptions = {}): Promise<RunCodegenRe
|
|
|
199
211
|
};
|
|
200
212
|
};
|
|
201
213
|
|
|
214
|
+
const syncI18n = async (
|
|
215
|
+
root: string,
|
|
216
|
+
applicationId: string,
|
|
217
|
+
shouldPreserveMetadataMessages = true,
|
|
218
|
+
): Promise<void> => {
|
|
219
|
+
const project = resolveCatalogProject(root, applicationId);
|
|
220
|
+
|
|
221
|
+
if (project === null) {
|
|
222
|
+
emitI18nTypes(root, [], false);
|
|
223
|
+
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const srcDir = join(root, "src");
|
|
228
|
+
const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : root);
|
|
229
|
+
const catalog = await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);
|
|
230
|
+
synchronizeCatalogs(project);
|
|
231
|
+
emitI18nTypes(root, catalog.messages);
|
|
232
|
+
};
|
|
233
|
+
|
|
202
234
|
const isCodegenDisabled = async (cwd: string, mode?: string): Promise<boolean> => {
|
|
203
235
|
try {
|
|
204
236
|
const { config } = await loadConfig(cwd, { mode });
|
|
@@ -232,12 +264,18 @@ const maybeAnnounceStale = (shouldAnnounce: boolean | undefined, inputs: Codegen
|
|
|
232
264
|
}
|
|
233
265
|
};
|
|
234
266
|
|
|
235
|
-
const getRunOptions = ({
|
|
267
|
+
const getRunOptions = ({
|
|
268
|
+
root,
|
|
269
|
+
mode,
|
|
270
|
+
inputs,
|
|
271
|
+
resolved,
|
|
272
|
+
shouldPreserveI18nMetadata,
|
|
273
|
+
}: RunOptionsInput): RunCodegenOptions => {
|
|
236
274
|
if (inputs === null) {
|
|
237
|
-
return { cwd: root, mode, resolved };
|
|
275
|
+
return { cwd: root, mode, resolved, shouldPreserveI18nMetadata };
|
|
238
276
|
}
|
|
239
277
|
|
|
240
|
-
return { cwd: root, mode, inputs, resolved };
|
|
278
|
+
return { cwd: root, mode, inputs, resolved, shouldPreserveI18nMetadata };
|
|
241
279
|
};
|
|
242
280
|
|
|
243
281
|
const isPreflightSkipped = (options: EnsureGeneratedOptions): boolean =>
|
|
@@ -250,6 +288,7 @@ const generate = async (context: CodegenContext, options: EnsureGeneratedOptions
|
|
|
250
288
|
cwd: context.root,
|
|
251
289
|
mode: options.mode,
|
|
252
290
|
resolved: { config: context.config, configFile: context.configFile },
|
|
291
|
+
shouldPreserveI18nMetadata: options.shouldPreserveI18nMetadata,
|
|
253
292
|
});
|
|
254
293
|
|
|
255
294
|
return result.isRegenerated;
|
|
@@ -258,7 +297,14 @@ const generate = async (context: CodegenContext, options: EnsureGeneratedOptions
|
|
|
258
297
|
const inputs = resolveInputsOrNull(context.root, context.config);
|
|
259
298
|
maybeAnnounceStale(options.shouldAnnounce, inputs);
|
|
260
299
|
const resolved = { config: context.config, configFile: context.configFile };
|
|
261
|
-
|
|
300
|
+
|
|
301
|
+
const result = await runCodegen(getRunOptions({
|
|
302
|
+
root: context.root,
|
|
303
|
+
mode: options.mode,
|
|
304
|
+
inputs,
|
|
305
|
+
resolved,
|
|
306
|
+
shouldPreserveI18nMetadata: options.shouldPreserveI18nMetadata,
|
|
307
|
+
}));
|
|
262
308
|
|
|
263
309
|
return result.isRegenerated;
|
|
264
310
|
};
|
package/src/commands/codegen.ts
CHANGED
|
@@ -12,7 +12,7 @@ const FORCED_WHILE_DISABLED_MESSAGE =
|
|
|
12
12
|
const codegen = defineCommand({
|
|
13
13
|
meta: {
|
|
14
14
|
name: "codegen",
|
|
15
|
-
description: "Generate
|
|
15
|
+
description: "Generate project bindings, translation catalogs, and TypeScript declarations",
|
|
16
16
|
},
|
|
17
17
|
args: {
|
|
18
18
|
force: {
|