@gtkx/cli 1.4.0 → 1.6.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/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +2 -1
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/codegen/reference.d.ts +17 -0
- package/dist/codegen/reference.d.ts.map +1 -0
- package/dist/codegen/reference.js +37 -0
- package/dist/codegen/reference.js.map +1 -0
- package/dist/codegen/report.d.ts.map +1 -1
- package/dist/codegen/report.js +17 -3
- package/dist/codegen/report.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +4 -0
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +93 -27
- 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/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +10 -16
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/mcp.d.ts +13 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +68 -0
- package/dist/commands/mcp.js.map +1 -0
- 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/notices/gtkx.js +1 -1
- package/dist/deploy/notices/gtkx.js.map +1 -1
- package/dist/deploy/notices/libraries.d.ts.map +1 -1
- package/dist/deploy/notices/libraries.js +2 -1
- package/dist/deploy/notices/libraries.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/settings/libraries.d.ts.map +1 -1
- package/dist/deploy/settings/libraries.js +7 -9
- package/dist/deploy/settings/libraries.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 +27 -4
- 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 +4 -1
- 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/agent-rules.d.ts +7 -0
- package/dist/internal/agent-rules.d.ts.map +1 -0
- package/dist/internal/agent-rules.js +106 -0
- package/dist/internal/agent-rules.js.map +1 -0
- package/dist/internal/docs-elements.d.ts +8 -0
- package/dist/internal/docs-elements.d.ts.map +1 -0
- package/dist/internal/docs-elements.js +12 -0
- package/dist/internal/docs-elements.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 +25 -47
- package/dist/internal/source-imports.js.map +1 -1
- package/dist/mcp/client-config.d.ts +22 -0
- package/dist/mcp/client-config.d.ts.map +1 -0
- package/dist/mcp/client-config.js +94 -0
- package/dist/mcp/client-config.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/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/animated.d.ts +5 -0
- package/dist/vite-plugins/animated.d.ts.map +1 -0
- package/dist/vite-plugins/animated.js +325 -0
- package/dist/vite-plugins/animated.js.map +1 -0
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
- package/dist/vite-plugins/asset-imports.js +4 -14
- 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 +5 -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 +12 -57
- 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.js +2 -2
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +2 -1
- package/dist/vite-plugins/settings.js.map +1 -1
- package/package.json +11 -9
- package/src/builder.ts +3 -2
- package/src/cli.ts +5 -0
- package/src/codegen/freshness.ts +2 -1
- package/src/codegen/reference.ts +59 -0
- package/src/codegen/report.ts +18 -3
- package/src/codegen/run-codegen.ts +134 -31
- package/src/commands/codegen.ts +1 -1
- package/src/commands/docs.ts +10 -28
- package/src/commands/mcp.ts +81 -0
- package/src/deploy/freedesktop/localize.ts +144 -0
- package/src/deploy/install-hints.ts +5 -0
- package/src/deploy/notices/gtkx.ts +1 -1
- package/src/deploy/notices/libraries.ts +2 -1
- 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/settings/libraries.ts +7 -10
- package/src/deploy/targets/flatpak-source.ts +33 -10
- package/src/deploy/tools.ts +36 -3
- package/src/dev/locale-dir.ts +22 -0
- package/src/dev/runner-main.ts +4 -1
- 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/agent-rules.ts +135 -0
- package/src/internal/docs-elements.ts +21 -0
- package/src/internal/source-imports.ts +31 -60
- package/src/mcp/client-config.ts +130 -0
- 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/animated.ts +486 -0
- package/src/vite-plugins/asset-imports.ts +5 -17
- package/src/vite-plugins/i18n.ts +146 -0
- package/src/vite-plugins/index.ts +5 -0
- package/src/vite-plugins/resources.ts +12 -74
- package/src/vite-plugins/self-contained.ts +150 -169
- package/src/vite-plugins/settings-worker-env.ts +2 -2
- package/src/vite-plugins/settings.ts +2 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { readGeneratedElements } from "@gtkx/codegen";
|
|
2
|
+
import { createConfigLoader } from "@gtkx/config/internal";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { parseSync } from "vite";
|
|
6
|
+
import { sourceLanguage } from "../internal/source-imports.js";
|
|
7
|
+
import { stripQuery } from "./strip-query.js";
|
|
8
|
+
const ANIMATED_PACKAGE = "@gtkx/animated";
|
|
9
|
+
const INTERNAL_SPECIFIER = "@gtkx/animated/internal";
|
|
10
|
+
const VIRTUAL_ID = "virtual:gtkx-animated";
|
|
11
|
+
const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_ID}`;
|
|
12
|
+
const NAMESPACE_HELPER = "__gtkxAnimated";
|
|
13
|
+
const CALL_HELPER = "__gtkxWithAnimated";
|
|
14
|
+
const BINDING_PARENT_KEYS = {
|
|
15
|
+
VariableDeclarator: "id",
|
|
16
|
+
ImportSpecifier: "local",
|
|
17
|
+
ImportDefaultSpecifier: "local",
|
|
18
|
+
ImportNamespaceSpecifier: "local",
|
|
19
|
+
FunctionDeclaration: "id",
|
|
20
|
+
ClassDeclaration: "id",
|
|
21
|
+
CatchClause: "param",
|
|
22
|
+
AssignmentPattern: "left",
|
|
23
|
+
RestElement: "argument",
|
|
24
|
+
Property: "value",
|
|
25
|
+
};
|
|
26
|
+
const BINDING_PARENT_ARRAY_KEYS = {
|
|
27
|
+
ArrowFunctionExpression: "params",
|
|
28
|
+
FunctionDeclaration: "params",
|
|
29
|
+
FunctionExpression: "params",
|
|
30
|
+
ArrayPattern: "elements",
|
|
31
|
+
};
|
|
32
|
+
const isAstNode = (value) => typeof value === "object" &&
|
|
33
|
+
value !== null &&
|
|
34
|
+
typeof value.type === "string" &&
|
|
35
|
+
typeof value.start === "number" &&
|
|
36
|
+
typeof value.end === "number";
|
|
37
|
+
const walkChildren = (node, visit) => {
|
|
38
|
+
for (const [key, child] of Object.entries(node)) {
|
|
39
|
+
if (key !== "type") {
|
|
40
|
+
walk(child, node, visit);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const walk = (value, parent, visit) => {
|
|
45
|
+
if (Array.isArray(value)) {
|
|
46
|
+
for (const item of value) {
|
|
47
|
+
walk(item, parent, visit);
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!isAstNode(value)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
visit(value, parent);
|
|
55
|
+
walkChildren(value, visit);
|
|
56
|
+
};
|
|
57
|
+
const identifierName = (node) => {
|
|
58
|
+
if (!isAstNode(node)) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
if (node.type !== "Identifier" && node.type !== "JSXIdentifier") {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return typeof node.name === "string" ? node.name : undefined;
|
|
65
|
+
};
|
|
66
|
+
const isValueImportSpecifier = (specifier) => isAstNode(specifier) && specifier.type === "ImportSpecifier" && specifier.importKind !== "type";
|
|
67
|
+
const animatedSpecifierLocal = (node) => {
|
|
68
|
+
const specifiers = node.specifiers ?? [];
|
|
69
|
+
let local;
|
|
70
|
+
for (const specifier of specifiers) {
|
|
71
|
+
if (isValueImportSpecifier(specifier) && identifierName(specifier.imported) === "animated") {
|
|
72
|
+
local ??= identifierName(specifier.local);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return local;
|
|
76
|
+
};
|
|
77
|
+
const animatedLocalName = (program) => {
|
|
78
|
+
let local;
|
|
79
|
+
walk(program, null, (node) => {
|
|
80
|
+
if (node.type !== "ImportDeclaration" || node.source?.value !== ANIMATED_PACKAGE) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (node.importKind === "type") {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
local ??= animatedSpecifierLocal(node);
|
|
87
|
+
});
|
|
88
|
+
return local;
|
|
89
|
+
};
|
|
90
|
+
const isBindingSlot = (node, parent) => {
|
|
91
|
+
const key = BINDING_PARENT_KEYS[parent.type];
|
|
92
|
+
return key !== undefined && parent[key] === node;
|
|
93
|
+
};
|
|
94
|
+
const isBindingListEntry = (node, parent) => {
|
|
95
|
+
const arrayKey = BINDING_PARENT_ARRAY_KEYS[parent.type];
|
|
96
|
+
const entries = arrayKey === undefined ? undefined : parent[arrayKey];
|
|
97
|
+
return Array.isArray(entries) && entries.includes(node);
|
|
98
|
+
};
|
|
99
|
+
const isBindingParent = (node, parent) => isBindingSlot(node, parent) || isBindingListEntry(node, parent);
|
|
100
|
+
const isBindingNamed = (node, parent, name) => node.type === "Identifier" &&
|
|
101
|
+
node.name === name &&
|
|
102
|
+
isBindingParent(node, parent);
|
|
103
|
+
const countDeclarations = (program, name) => {
|
|
104
|
+
const spans = new Set();
|
|
105
|
+
walk(program, null, (node, parent) => {
|
|
106
|
+
if (parent !== null && isBindingNamed(node, parent, name)) {
|
|
107
|
+
spans.add(node.start);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return spans.size;
|
|
111
|
+
};
|
|
112
|
+
const isRewritableJsxMember = (node, local) => node.type === "JSXMemberExpression" && identifierName(node.object) === local;
|
|
113
|
+
const isRewritableObjectMember = (node, local) => node.type === "MemberExpression" &&
|
|
114
|
+
node.computed !== true &&
|
|
115
|
+
node.optional !== true &&
|
|
116
|
+
identifierName(node.object) === local;
|
|
117
|
+
const isForbiddenTarget = (node, parent) => parent !== null &&
|
|
118
|
+
((parent.type === "AssignmentExpression" && parent.left === node) ||
|
|
119
|
+
(parent.type === "UpdateExpression" && parent.argument === node) ||
|
|
120
|
+
(parent.type === "UnaryExpression" && parent.operator === "delete" && parent.argument === node));
|
|
121
|
+
const isRewritableMember = (node, parent, local) => {
|
|
122
|
+
if (isRewritableJsxMember(node, local)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return isRewritableObjectMember(node, local) && !isForbiddenTarget(node, parent);
|
|
126
|
+
};
|
|
127
|
+
const collectMemberEdit = (rewrite, claimed, node, elements) => {
|
|
128
|
+
const property = identifierName(node.property);
|
|
129
|
+
if (property !== undefined && elements.get(property)?.isMountable === true) {
|
|
130
|
+
const object = node.object;
|
|
131
|
+
rewrite.edits.push({ start: object.start, end: object.end, replacement: NAMESPACE_HELPER });
|
|
132
|
+
rewrite.hasMemberEdits = true;
|
|
133
|
+
claimed.add(object.start);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const collectCallEdit = (rewrite, claimed, node) => {
|
|
137
|
+
const callee = node.callee;
|
|
138
|
+
rewrite.edits.push({ start: callee.start, end: callee.end, replacement: CALL_HELPER });
|
|
139
|
+
rewrite.hasCallEdits = true;
|
|
140
|
+
claimed.add(callee.start);
|
|
141
|
+
};
|
|
142
|
+
const isPropertyReference = (node, parent) => parent?.type === "ImportSpecifier" ||
|
|
143
|
+
(parent?.type === "MemberExpression" && parent.property === node) ||
|
|
144
|
+
(parent?.type === "JSXMemberExpression" && parent.property === node);
|
|
145
|
+
const hasDynamicUse = (program, local, claimed) => {
|
|
146
|
+
let isFound = false;
|
|
147
|
+
walk(program, null, (node, parent) => {
|
|
148
|
+
if (identifierName(node) === local && !claimed.has(node.start) && !isPropertyReference(node, parent)) {
|
|
149
|
+
isFound = true;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
return isFound;
|
|
153
|
+
};
|
|
154
|
+
const collectRewrite = (program, local, elements) => {
|
|
155
|
+
const rewrite = { edits: [], hasMemberEdits: false, hasCallEdits: false, hasDynamicUses: false };
|
|
156
|
+
const claimed = new Set();
|
|
157
|
+
walk(program, null, (node, parent) => {
|
|
158
|
+
if (isRewritableMember(node, parent, local)) {
|
|
159
|
+
collectMemberEdit(rewrite, claimed, node, elements);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (node.type === "CallExpression" && identifierName(node.callee) === local) {
|
|
163
|
+
collectCallEdit(rewrite, claimed, node);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
rewrite.hasDynamicUses = hasDynamicUse(program, local, claimed);
|
|
167
|
+
return rewrite;
|
|
168
|
+
};
|
|
169
|
+
const lastImportEnd = (program) => {
|
|
170
|
+
const statements = program.body ?? [];
|
|
171
|
+
let end = 0;
|
|
172
|
+
for (const statement of statements) {
|
|
173
|
+
if (isAstNode(statement) && statement.type === "ImportDeclaration") {
|
|
174
|
+
end = Math.max(end, statement.end);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return end;
|
|
178
|
+
};
|
|
179
|
+
const helperImports = (rewrite) => {
|
|
180
|
+
const lines = [];
|
|
181
|
+
if (rewrite.hasMemberEdits) {
|
|
182
|
+
lines.push(`import * as ${NAMESPACE_HELPER} from ${JSON.stringify(VIRTUAL_ID)};`);
|
|
183
|
+
}
|
|
184
|
+
if (rewrite.hasCallEdits) {
|
|
185
|
+
lines.push(`import { withAnimated as ${CALL_HELPER} } from ${JSON.stringify(INTERNAL_SPECIFIER)};`);
|
|
186
|
+
}
|
|
187
|
+
return lines.join("\n");
|
|
188
|
+
};
|
|
189
|
+
const applyEdits = (code, edits) => {
|
|
190
|
+
const ordered = edits.toSorted((a, b) => b.start - a.start);
|
|
191
|
+
let result = code;
|
|
192
|
+
for (const edit of ordered) {
|
|
193
|
+
result = `${result.slice(0, edit.start)}${edit.replacement}${result.slice(edit.end)}`;
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
};
|
|
197
|
+
const parseProgram = (path, code) => {
|
|
198
|
+
const lang = sourceLanguage(path);
|
|
199
|
+
if (lang === undefined) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
const parsed = parseSync(path, code, { lang });
|
|
203
|
+
return parsed.errors.length > 0 ? undefined : parsed.program;
|
|
204
|
+
};
|
|
205
|
+
const unchangedRewrite = (code, rewrite) => rewrite.hasDynamicUses ? { code, hasDynamicUses: true, hasMemberEdits: false } : undefined;
|
|
206
|
+
const hasHelperCollision = (code) => code.includes(NAMESPACE_HELPER) || code.includes(CALL_HELPER);
|
|
207
|
+
const rewriteModule = (code, id, elements) => {
|
|
208
|
+
if (hasHelperCollision(code)) {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
const program = parseProgram(stripQuery(id), code);
|
|
212
|
+
if (program === undefined) {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
const local = animatedLocalName(program);
|
|
216
|
+
if (local === undefined || countDeclarations(program, local) > 1) {
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
const rewrite = collectRewrite(program, local, elements);
|
|
220
|
+
if (rewrite.edits.length === 0) {
|
|
221
|
+
return unchangedRewrite(code, rewrite);
|
|
222
|
+
}
|
|
223
|
+
const insertAt = lastImportEnd(program);
|
|
224
|
+
const helperEdit = { start: insertAt, end: insertAt, replacement: `\n${helperImports(rewrite)}` };
|
|
225
|
+
const withHelpers = applyEdits(code, [...rewrite.edits, helperEdit]);
|
|
226
|
+
return { code: withHelpers, hasDynamicUses: rewrite.hasDynamicUses, hasMemberEdits: rewrite.hasMemberEdits };
|
|
227
|
+
};
|
|
228
|
+
const renderVirtualModule = (elements) => {
|
|
229
|
+
const mountable = elements.values().filter((element) => element.isMountable).toArray();
|
|
230
|
+
const imports = mountable.map((element) => `${element.glibName} as $${element.glibName}`);
|
|
231
|
+
const consts = mountable.map((element) => `export const ${element.glibName} = /* @__PURE__ */ withAnimated($${element.glibName});`);
|
|
232
|
+
return (`import { ${imports.join(", ")} } from "@gtkx/jsx";\n` +
|
|
233
|
+
`import { withAnimated } from ${JSON.stringify(INTERNAL_SPECIFIER)};\n` +
|
|
234
|
+
`${consts.join("\n")}\n`);
|
|
235
|
+
};
|
|
236
|
+
const loadElements = (state) => {
|
|
237
|
+
if (state.elements !== null) {
|
|
238
|
+
return state.elements;
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
const requireFromRoot = createRequire(join(state.root, "package.json"));
|
|
242
|
+
const jsxStoreDir = dirname(requireFromRoot.resolve("@gtkx/jsx/package.json"));
|
|
243
|
+
state.elements = new Map(readGeneratedElements(jsxStoreDir).map((element) => [element.glibName, element]));
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
return state.elements;
|
|
249
|
+
};
|
|
250
|
+
const resolveVirtualId = (state, source) => {
|
|
251
|
+
if (source === VIRTUAL_ID && state.isEnabled) {
|
|
252
|
+
return RESOLVED_VIRTUAL_ID;
|
|
253
|
+
}
|
|
254
|
+
return undefined;
|
|
255
|
+
};
|
|
256
|
+
const loadVirtualModule = (state, id) => {
|
|
257
|
+
if (id !== RESOLVED_VIRTUAL_ID || !state.isEnabled) {
|
|
258
|
+
return undefined;
|
|
259
|
+
}
|
|
260
|
+
const elements = loadElements(state);
|
|
261
|
+
return elements === null ? undefined : renderVirtualModule(elements);
|
|
262
|
+
};
|
|
263
|
+
const dynamicUseWarning = (id, hasDynamicUses) => hasDynamicUses
|
|
264
|
+
? [
|
|
265
|
+
`${stripQuery(id)} uses the animated binding dynamically, which keeps the whole generated ` +
|
|
266
|
+
"widget namespace in the bundle; use animated(Component) calls to let unused widgets be dropped",
|
|
267
|
+
]
|
|
268
|
+
: [];
|
|
269
|
+
const memberUseWarning = (id, hasMemberEdits) => hasMemberEdits
|
|
270
|
+
? [
|
|
271
|
+
`${stripQuery(id)} reads widget components off the animated binding, which GTKX 2.0 removes; ` +
|
|
272
|
+
"import the component and call animated(Component) instead",
|
|
273
|
+
]
|
|
274
|
+
: [];
|
|
275
|
+
const warningsFor = (state, id, rewritten) => state.isBuild
|
|
276
|
+
? [
|
|
277
|
+
...dynamicUseWarning(id, rewritten.hasDynamicUses),
|
|
278
|
+
...memberUseWarning(id, rewritten.hasMemberEdits),
|
|
279
|
+
]
|
|
280
|
+
: [];
|
|
281
|
+
const transformCode = (state, code, id) => {
|
|
282
|
+
if (!state.isEnabled || id.startsWith("\0") || !code.includes(ANIMATED_PACKAGE)) {
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
const elements = loadElements(state);
|
|
286
|
+
if (elements === null) {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
const rewritten = rewriteModule(code, id, elements);
|
|
290
|
+
if (rewritten === undefined) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
return { code: rewritten.code, warnings: warningsFor(state, id, rewritten) };
|
|
294
|
+
};
|
|
295
|
+
function gtkxAnimated(loadConfig = createConfigLoader()) {
|
|
296
|
+
const state = { isEnabled: false, isBuild: false, root: process.cwd(), elements: null };
|
|
297
|
+
return {
|
|
298
|
+
name: "gtkx:animated",
|
|
299
|
+
enforce: "pre",
|
|
300
|
+
async config(config) {
|
|
301
|
+
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
302
|
+
state.isEnabled = loaded.config.future?.v2TreeShaking === true;
|
|
303
|
+
},
|
|
304
|
+
configResolved(config) {
|
|
305
|
+
state.root = config.root;
|
|
306
|
+
state.isBuild = config.command === "build";
|
|
307
|
+
},
|
|
308
|
+
resolveId(source) {
|
|
309
|
+
return resolveVirtualId(state, source);
|
|
310
|
+
},
|
|
311
|
+
load(id) {
|
|
312
|
+
return loadVirtualModule(state, id);
|
|
313
|
+
},
|
|
314
|
+
transform(code, id) {
|
|
315
|
+
const result = transformCode(state, code, id);
|
|
316
|
+
const warnings = result?.warnings ?? [];
|
|
317
|
+
for (const warning of warnings) {
|
|
318
|
+
this.warn(warning);
|
|
319
|
+
}
|
|
320
|
+
return result?.code;
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export { gtkxAnimated };
|
|
325
|
+
//# sourceMappingURL=animated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animated.js","sourceRoot":"","sources":["../../src/vite-plugins/animated.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { type GeneratedElement, readGeneratedElements } from \"@gtkx/codegen\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { parseSync } from \"vite\";\nimport { sourceLanguage } from \"../internal/source-imports.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype AstNode = {\n type: string;\n start: number;\n end: number;\n} & Record<string, unknown>;\n\ntype Edit = {\n start: number;\n end: number;\n replacement: string;\n};\n\ntype Rewrite = {\n edits: Edit[];\n hasMemberEdits: boolean;\n hasCallEdits: boolean;\n hasDynamicUses: boolean;\n};\n\ntype RewrittenModule = { code: string; hasDynamicUses: boolean; hasMemberEdits: boolean };\n\ntype PluginState = {\n isEnabled: boolean;\n isBuild: boolean;\n root: string;\n elements: Map<string, GeneratedElement> | null;\n};\n\nconst ANIMATED_PACKAGE = \"@gtkx/animated\";\nconst INTERNAL_SPECIFIER = \"@gtkx/animated/internal\";\nconst VIRTUAL_ID = \"virtual:gtkx-animated\";\nconst RESOLVED_VIRTUAL_ID = `\\0${VIRTUAL_ID}`;\nconst NAMESPACE_HELPER = \"__gtkxAnimated\";\nconst CALL_HELPER = \"__gtkxWithAnimated\";\n\nconst BINDING_PARENT_KEYS: Record<string, string> = {\n VariableDeclarator: \"id\",\n ImportSpecifier: \"local\",\n ImportDefaultSpecifier: \"local\",\n ImportNamespaceSpecifier: \"local\",\n FunctionDeclaration: \"id\",\n ClassDeclaration: \"id\",\n CatchClause: \"param\",\n AssignmentPattern: \"left\",\n RestElement: \"argument\",\n Property: \"value\",\n};\n\nconst BINDING_PARENT_ARRAY_KEYS: Record<string, string> = {\n ArrowFunctionExpression: \"params\",\n FunctionDeclaration: \"params\",\n FunctionExpression: \"params\",\n ArrayPattern: \"elements\",\n};\n\nconst isAstNode = (value: unknown): value is AstNode =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as AstNode).type === \"string\" &&\n typeof (value as AstNode).start === \"number\" &&\n typeof (value as AstNode).end === \"number\";\n\nconst walkChildren = (node: AstNode, visit: (node: AstNode, parent: AstNode | null) => void): void => {\n for (const [key, child] of Object.entries(node)) {\n if (key !== \"type\") {\n walk(child, node, visit);\n }\n }\n};\n\nconst walk = (value: unknown, parent: AstNode | null, visit: (node: AstNode, parent: AstNode | null) => void): void => {\n if (Array.isArray(value)) {\n for (const item of value) {\n walk(item, parent, visit);\n }\n\n return;\n }\n\n if (!isAstNode(value)) {\n return;\n }\n\n visit(value, parent);\n walkChildren(value, visit);\n};\n\nconst identifierName = (node: unknown): string | undefined => {\n if (!isAstNode(node)) {\n return undefined;\n }\n\n if (node.type !== \"Identifier\" && node.type !== \"JSXIdentifier\") {\n return undefined;\n }\n\n return typeof node.name === \"string\" ? node.name : undefined;\n};\n\nconst isValueImportSpecifier = (specifier: unknown): specifier is AstNode =>\n isAstNode(specifier) && specifier.type === \"ImportSpecifier\" && specifier.importKind !== \"type\";\n\nconst animatedSpecifierLocal = (node: AstNode): string | undefined => {\n const specifiers = (node.specifiers as unknown[] | undefined) ?? [];\n let local: string | undefined;\n\n for (const specifier of specifiers) {\n if (isValueImportSpecifier(specifier) && identifierName(specifier.imported) === \"animated\") {\n local ??= identifierName(specifier.local);\n }\n }\n\n return local;\n};\n\nconst animatedLocalName = (program: AstNode): string | undefined => {\n let local: string | undefined;\n\n walk(program, null, (node) => {\n if (node.type !== \"ImportDeclaration\" || (node.source as AstNode | undefined)?.value !== ANIMATED_PACKAGE) {\n return;\n }\n\n if (node.importKind === \"type\") {\n return;\n }\n\n local ??= animatedSpecifierLocal(node);\n });\n\n return local;\n};\n\nconst isBindingSlot = (node: AstNode, parent: AstNode): boolean => {\n const key = BINDING_PARENT_KEYS[parent.type];\n\n return key !== undefined && parent[key] === node;\n};\n\nconst isBindingListEntry = (node: AstNode, parent: AstNode): boolean => {\n const arrayKey = BINDING_PARENT_ARRAY_KEYS[parent.type];\n const entries = arrayKey === undefined ? undefined : parent[arrayKey];\n\n return Array.isArray(entries) && entries.includes(node);\n};\n\nconst isBindingParent = (node: AstNode, parent: AstNode): boolean =>\n isBindingSlot(node, parent) || isBindingListEntry(node, parent);\n\nconst isBindingNamed = (node: AstNode, parent: AstNode, name: string): boolean =>\n node.type === \"Identifier\" &&\n node.name === name &&\n isBindingParent(node, parent);\n\nconst countDeclarations = (program: AstNode, name: string): number => {\n const spans: Set<number> = new Set();\n\n walk(program, null, (node, parent) => {\n if (parent !== null && isBindingNamed(node, parent, name)) {\n spans.add(node.start);\n }\n });\n\n return spans.size;\n};\n\nconst isRewritableJsxMember = (node: AstNode, local: string): boolean =>\n node.type === \"JSXMemberExpression\" && identifierName(node.object) === local;\n\nconst isRewritableObjectMember = (node: AstNode, local: string): boolean =>\n node.type === \"MemberExpression\" &&\n node.computed !== true &&\n node.optional !== true &&\n identifierName(node.object) === local;\n\nconst isForbiddenTarget = (node: AstNode, parent: AstNode | null): boolean =>\n parent !== null &&\n ((parent.type === \"AssignmentExpression\" && parent.left === node) ||\n (parent.type === \"UpdateExpression\" && parent.argument === node) ||\n (parent.type === \"UnaryExpression\" && parent.operator === \"delete\" && parent.argument === node));\n\nconst isRewritableMember = (node: AstNode, parent: AstNode | null, local: string): boolean => {\n if (isRewritableJsxMember(node, local)) {\n return true;\n }\n\n return isRewritableObjectMember(node, local) && !isForbiddenTarget(node, parent);\n};\n\nconst collectMemberEdit = (\n rewrite: Rewrite,\n claimed: Set<number>,\n node: AstNode,\n elements: Map<string, GeneratedElement>,\n): void => {\n const property = identifierName(node.property);\n\n if (property !== undefined && elements.get(property)?.isMountable === true) {\n const object = node.object as AstNode;\n rewrite.edits.push({ start: object.start, end: object.end, replacement: NAMESPACE_HELPER });\n rewrite.hasMemberEdits = true;\n claimed.add(object.start);\n }\n};\n\nconst collectCallEdit = (rewrite: Rewrite, claimed: Set<number>, node: AstNode): void => {\n const callee = node.callee as AstNode;\n rewrite.edits.push({ start: callee.start, end: callee.end, replacement: CALL_HELPER });\n rewrite.hasCallEdits = true;\n claimed.add(callee.start);\n};\n\nconst isPropertyReference = (node: AstNode, parent: AstNode | null): boolean =>\n parent?.type === \"ImportSpecifier\" ||\n (parent?.type === \"MemberExpression\" && parent.property === node) ||\n (parent?.type === \"JSXMemberExpression\" && parent.property === node);\n\nconst hasDynamicUse = (program: AstNode, local: string, claimed: Set<number>): boolean => {\n let isFound = false;\n\n walk(program, null, (node, parent) => {\n if (identifierName(node) === local && !claimed.has(node.start) && !isPropertyReference(node, parent)) {\n isFound = true;\n }\n });\n\n return isFound;\n};\n\nconst collectRewrite = (program: AstNode, local: string, elements: Map<string, GeneratedElement>): Rewrite => {\n const rewrite: Rewrite = { edits: [], hasMemberEdits: false, hasCallEdits: false, hasDynamicUses: false };\n const claimed: Set<number> = new Set();\n\n walk(program, null, (node, parent) => {\n if (isRewritableMember(node, parent, local)) {\n collectMemberEdit(rewrite, claimed, node, elements);\n\n return;\n }\n\n if (node.type === \"CallExpression\" && identifierName(node.callee) === local) {\n collectCallEdit(rewrite, claimed, node);\n }\n });\n\n rewrite.hasDynamicUses = hasDynamicUse(program, local, claimed);\n\n return rewrite;\n};\n\nconst lastImportEnd = (program: AstNode): number => {\n const statements = (program.body as unknown[] | undefined) ?? [];\n let end = 0;\n\n for (const statement of statements) {\n if (isAstNode(statement) && statement.type === \"ImportDeclaration\") {\n end = Math.max(end, statement.end);\n }\n }\n\n return end;\n};\n\nconst helperImports = (rewrite: Rewrite): string => {\n const lines: string[] = [];\n\n if (rewrite.hasMemberEdits) {\n lines.push(`import * as ${NAMESPACE_HELPER} from ${JSON.stringify(VIRTUAL_ID)};`);\n }\n\n if (rewrite.hasCallEdits) {\n lines.push(`import { withAnimated as ${CALL_HELPER} } from ${JSON.stringify(INTERNAL_SPECIFIER)};`);\n }\n\n return lines.join(\"\\n\");\n};\n\nconst applyEdits = (code: string, edits: Edit[]): string => {\n const ordered = edits.toSorted((a, b) => b.start - a.start);\n let result = code;\n\n for (const edit of ordered) {\n result = `${result.slice(0, edit.start)}${edit.replacement}${result.slice(edit.end)}`;\n }\n\n return result;\n};\n\nconst parseProgram = (path: string, code: string): AstNode | undefined => {\n const lang = sourceLanguage(path);\n\n if (lang === undefined) {\n return undefined;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n return parsed.errors.length > 0 ? undefined : (parsed.program as unknown as AstNode);\n};\n\nconst unchangedRewrite = (code: string, rewrite: Rewrite): RewrittenModule | undefined =>\n rewrite.hasDynamicUses ? { code, hasDynamicUses: true, hasMemberEdits: false } : undefined;\n\nconst hasHelperCollision = (code: string): boolean =>\n code.includes(NAMESPACE_HELPER) || code.includes(CALL_HELPER);\n\nconst rewriteModule = (\n code: string,\n id: string,\n elements: Map<string, GeneratedElement>,\n): RewrittenModule | undefined => {\n if (hasHelperCollision(code)) {\n return undefined;\n }\n\n const program = parseProgram(stripQuery(id), code);\n\n if (program === undefined) {\n return undefined;\n }\n\n const local = animatedLocalName(program);\n\n if (local === undefined || countDeclarations(program, local) > 1) {\n return undefined;\n }\n\n const rewrite = collectRewrite(program, local, elements);\n\n if (rewrite.edits.length === 0) {\n return unchangedRewrite(code, rewrite);\n }\n\n const insertAt = lastImportEnd(program);\n const helperEdit: Edit = { start: insertAt, end: insertAt, replacement: `\\n${helperImports(rewrite)}` };\n const withHelpers = applyEdits(code, [...rewrite.edits, helperEdit]);\n\n return { code: withHelpers, hasDynamicUses: rewrite.hasDynamicUses, hasMemberEdits: rewrite.hasMemberEdits };\n};\n\nconst renderVirtualModule = (elements: Map<string, GeneratedElement>): string => {\n const mountable = elements.values().filter((element) => element.isMountable).toArray();\n const imports = mountable.map((element) => `${element.glibName} as $${element.glibName}`);\n\n const consts = mountable.map(\n (element) => `export const ${element.glibName} = /* @__PURE__ */ withAnimated($${element.glibName});`,\n );\n\n return (\n `import { ${imports.join(\", \")} } from \"@gtkx/jsx\";\\n` +\n `import { withAnimated } from ${JSON.stringify(INTERNAL_SPECIFIER)};\\n` +\n `${consts.join(\"\\n\")}\\n`\n );\n};\n\nconst loadElements = (state: PluginState): Map<string, GeneratedElement> | null => {\n if (state.elements !== null) {\n return state.elements;\n }\n\n try {\n const requireFromRoot = createRequire(join(state.root, \"package.json\"));\n const jsxStoreDir = dirname(requireFromRoot.resolve(\"@gtkx/jsx/package.json\"));\n state.elements = new Map(readGeneratedElements(jsxStoreDir).map((element) => [element.glibName, element]));\n } catch {\n return null;\n }\n\n return state.elements;\n};\n\nconst resolveVirtualId = (state: PluginState, source: string): string | undefined => {\n if (source === VIRTUAL_ID && state.isEnabled) {\n return RESOLVED_VIRTUAL_ID;\n }\n\n return undefined;\n};\n\nconst loadVirtualModule = (state: PluginState, id: string): string | undefined => {\n if (id !== RESOLVED_VIRTUAL_ID || !state.isEnabled) {\n return undefined;\n }\n\n const elements = loadElements(state);\n\n return elements === null ? undefined : renderVirtualModule(elements);\n};\n\nconst dynamicUseWarning = (id: string, hasDynamicUses: boolean): string[] =>\n hasDynamicUses\n ? [\n `${stripQuery(id)} uses the animated binding dynamically, which keeps the whole generated ` +\n \"widget namespace in the bundle; use animated(Component) calls to let unused widgets be dropped\",\n ]\n : [];\n\nconst memberUseWarning = (id: string, hasMemberEdits: boolean): string[] =>\n hasMemberEdits\n ? [\n `${stripQuery(id)} reads widget components off the animated binding, which GTKX 2.0 removes; ` +\n \"import the component and call animated(Component) instead\",\n ]\n : [];\n\nconst warningsFor = (state: PluginState, id: string, rewritten: RewrittenModule): string[] =>\n state.isBuild\n ? [\n ...dynamicUseWarning(id, rewritten.hasDynamicUses),\n ...memberUseWarning(id, rewritten.hasMemberEdits),\n ]\n : [];\n\nconst transformCode = (\n state: PluginState,\n code: string,\n id: string,\n): { code: string; warnings: string[] } | undefined => {\n if (!state.isEnabled || id.startsWith(\"\\0\") || !code.includes(ANIMATED_PACKAGE)) {\n return undefined;\n }\n\n const elements = loadElements(state);\n\n if (elements === null) {\n return undefined;\n }\n\n const rewritten = rewriteModule(code, id, elements);\n\n if (rewritten === undefined) {\n return undefined;\n }\n\n return { code: rewritten.code, warnings: warningsFor(state, id, rewritten) };\n};\n\nfunction gtkxAnimated(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = { isEnabled: false, isBuild: false, root: process.cwd(), elements: null };\n\n return {\n name: \"gtkx:animated\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isEnabled = loaded.config.future?.v2TreeShaking === true;\n },\n\n configResolved(config) {\n state.root = config.root;\n state.isBuild = config.command === \"build\";\n },\n\n resolveId(source) {\n return resolveVirtualId(state, source);\n },\n\n load(id) {\n return loadVirtualModule(state, id);\n },\n\n transform(code, id) {\n const result = transformCode(state, code, id);\n const warnings = result?.warnings ?? [];\n\n for (const warning of warnings) {\n this.warn(warning);\n }\n\n return result?.code;\n },\n };\n}\n\nexport { gtkxAnimated };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-imports.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"asset-imports.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAe,MAAM,EAAc,MAAM,MAAM,CAAC;AA+I5D,iBAAS,gBAAgB,CAAC,UAAU,GAAE,YAAmC,GAAG,MAAM,CAgBjF;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,20 +1,10 @@
|
|
|
1
|
-
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
|
-
import { extname } from "node:path";
|
|
1
|
+
import { createConfigLoader, resolveFuture } from "@gtkx/config/internal";
|
|
3
2
|
import { parseSync } from "vite";
|
|
3
|
+
import { sourceLanguage } from "../internal/source-imports.js";
|
|
4
4
|
import { ASSET_MENTION_RE } from "./asset-extensions.js";
|
|
5
5
|
import { DATA_PREFIX, isAssetSpecifier, isDataAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, } from "./asset-specifier.js";
|
|
6
6
|
import { RESOURCE_PATH_EXPORT } from "./resource-shared.js";
|
|
7
7
|
import { stripQuery } from "./strip-query.js";
|
|
8
|
-
const SOURCE_LANGUAGES = new Map([
|
|
9
|
-
[".cjs", "jsx"],
|
|
10
|
-
[".cts", "ts"],
|
|
11
|
-
[".js", "jsx"],
|
|
12
|
-
[".jsx", "jsx"],
|
|
13
|
-
[".mjs", "jsx"],
|
|
14
|
-
[".mts", "ts"],
|
|
15
|
-
[".ts", "ts"],
|
|
16
|
-
[".tsx", "tsx"],
|
|
17
|
-
]);
|
|
18
8
|
const NODE_MODULES = /(?:^|\/)node_modules\//;
|
|
19
9
|
const VIRTUAL_PREFIX = "\0";
|
|
20
10
|
const DEFAULT_BINDING = "default";
|
|
@@ -78,7 +68,7 @@ const isCheckedSource = (path) => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODU
|
|
|
78
68
|
const hasCheckedAssetMention = (code) => ASSET_MENTION_RE.test(code) || code.includes("?url");
|
|
79
69
|
const checkAssetImports = (code, id, isV2) => {
|
|
80
70
|
const path = stripQuery(id);
|
|
81
|
-
const lang =
|
|
71
|
+
const lang = sourceLanguage(path);
|
|
82
72
|
if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {
|
|
83
73
|
return;
|
|
84
74
|
}
|
|
@@ -98,7 +88,7 @@ function gtkxAssetImports(loadConfig = createConfigLoader()) {
|
|
|
98
88
|
enforce: "pre",
|
|
99
89
|
async config(config) {
|
|
100
90
|
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
101
|
-
state.isV2 = loaded.config.future
|
|
91
|
+
state.isV2 = resolveFuture(loaded.config.future).isResourceImported;
|
|
102
92
|
},
|
|
103
93
|
transform(code, id) {
|
|
104
94
|
checkAssetImports(code, id, state.isV2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-imports.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { ParseResult, ParserOptions, Plugin, UserConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { extname } from \"node:path\";\nimport { parseSync } from \"vite\";\nimport { ASSET_MENTION_RE } from \"./asset-extensions.js\";\nimport {\n DATA_PREFIX,\n isAssetSpecifier,\n isDataAsset,\n isUrlSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n} from \"./asset-specifier.js\";\nimport { RESOURCE_PATH_EXPORT } from \"./resource-shared.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype SourceLanguage = NonNullable<ParserOptions[\"lang\"]>;\ntype ParsedModule = ParseResult[\"module\"];\ntype ImportStatement = ParsedModule[\"staticImports\"][number];\ntype ExportStatement = ParsedModule[\"staticExports\"][number];\ntype ExportEntry = ExportStatement[\"entries\"][number];\ntype BindingEntry = { importName: { name: string | null }; isType: boolean };\ntype NamedBinding = { name: string; source: string };\ntype PluginState = { isV2: boolean };\n\nconst SOURCE_LANGUAGES: Map<string, SourceLanguage> = new Map([\n [\".cjs\", \"jsx\"],\n [\".cts\", \"ts\"],\n [\".js\", \"jsx\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"jsx\"],\n [\".mts\", \"ts\"],\n [\".ts\", \"ts\"],\n [\".tsx\", \"tsx\"],\n]);\n\nconst NODE_MODULES = /(?:^|\\/)node_modules\\//;\nconst VIRTUAL_PREFIX = \"\\0\";\nconst DEFAULT_BINDING = \"default\";\nconst RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);\nconst DATA_IMPORT_EXAMPLE = `\"${DATA_PREFIX}<path>\"`;\nconst URL_FALLBACK = \", or import the default for the asset URL.\";\n\nconst BUNDLE_ADVICE =\n `An asset staged into the GResource bundle exports ${RESOURCE_BINDING} and a \"resource://\" default, and ` +\n \"nothing else.\";\n\nconst QUERY_ADVICE =\n `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;\n\nconst RESOURCE_ADVICE =\n `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;\n\nconst ICON_ADVICE = \"An icon asset exports only its default icon-theme name, and nothing else.\";\n\nconst RELATIVE_ADVICE =\n `Only assets imported through \"${DATA_PREFIX}\" are staged into the GResource bundle and export ` +\n `${RESOURCE_BINDING}; move the file under the data directory and import it as ` +\n `${DATA_IMPORT_EXAMPLE}${URL_FALLBACK}`;\n\nconst boundName = (entry: BindingEntry): string | null => {\n const { name } = entry.importName;\n\n if (name === null || name === DEFAULT_BINDING || entry.isType) {\n return null;\n }\n\n return name;\n};\n\nconst importBindings = (statement: ImportStatement): NamedBinding[] =>\n statement.entries\n .map((entry) => boundName(entry))\n .filter((name) => name !== null)\n .map((name) => ({ name, source: statement.moduleRequest.value }));\n\nconst exportBinding = (entry: ExportEntry): NamedBinding | null => {\n const name = boundName(entry);\n const source = entry.moduleRequest?.value;\n\n return name === null || source === undefined ? null : { name, source };\n};\n\nconst exportBindings = (statement: ExportStatement): NamedBinding[] =>\n statement.entries.map((entry) => exportBinding(entry)).filter((binding) => binding !== null);\n\nconst bindings = (parsed: ParsedModule): NamedBinding[] => [\n ...parsed.staticImports.flatMap((statement) => importBindings(statement)),\n ...parsed.staticExports.flatMap((statement) => exportBindings(statement)),\n];\n\nconst isBacked = ({ name, source }: NamedBinding, isV2: boolean): boolean => {\n if (name !== RESOURCE_PATH_EXPORT) {\n return false;\n }\n\n return isV2 ? parseResourceSpecifier(source) !== null : isDataAsset(source);\n};\n\nconst isCheckedSpecifier = (source: string): boolean => isAssetSpecifier(source) || isUrlSpecifier(source);\n\nconst unbackedBinding = (parsed: ParsedModule, isV2: boolean): NamedBinding | undefined =>\n bindings(parsed).find((binding) => isCheckedSpecifier(binding.source) && !isBacked(binding, isV2));\n\nconst isBundledResource = (source: string, isV2: boolean): boolean =>\n isV2\n ? parseResourceSpecifier(source) !== null || parseIconSpecifier(source) !== null\n : isDataAsset(source);\n\nconst v2BundleAdvice = (source: string): string =>\n parseIconSpecifier(source) === null ? RESOURCE_ADVICE : ICON_ADVICE;\n\nconst bundleAdvice = (source: string, isV2: boolean): string => {\n if (isBundledResource(source, isV2)) {\n return isV2 ? v2BundleAdvice(source) : BUNDLE_ADVICE;\n }\n\n if (isUrlSpecifier(source)) {\n return QUERY_ADVICE;\n }\n\n return source.startsWith(DATA_PREFIX) ? QUERY_ADVICE : RELATIVE_ADVICE;\n};\n\nconst unbackedBindingError = (path: string, binding: NamedBinding, isV2: boolean): Error =>\n new Error(\n `${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +\n \"gtkx build rejects and gtkx dev would bind as undefined. \" +\n bundleAdvice(binding.source, isV2),\n );\n\nconst isCheckedSource = (path: string): boolean => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);\nconst hasCheckedAssetMention = (code: string): boolean => ASSET_MENTION_RE.test(code) || code.includes(\"?url\");\n\nconst checkAssetImports = (code: string, id: string, isV2: boolean): void => {\n const path = stripQuery(id);\n const lang = SOURCE_LANGUAGES.get(extname(path).toLowerCase());\n\n if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {\n return;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n if (parsed.errors.length > 0) {\n return;\n }\n\n const binding = unbackedBinding(parsed.module, isV2);\n\n if (binding !== undefined) {\n throw unbackedBindingError(path, binding, isV2);\n }\n};\n\nfunction gtkxAssetImports(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = { isV2: false };\n\n return {\n name: \"gtkx:asset-imports\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isV2 = loaded.config.future?.v2ResourceImports === true;\n },\n\n transform(code, id) {\n checkAssetImports(code, id, state.isV2);\n },\n };\n}\n\nexport { gtkxAssetImports };\n"]}
|
|
1
|
+
{"version":3,"file":"asset-imports.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { ParseResult, Plugin, UserConfig } from \"vite\";\nimport { createConfigLoader, resolveFuture } from \"@gtkx/config/internal\";\nimport { parseSync } from \"vite\";\nimport { sourceLanguage } from \"../internal/source-imports.js\";\nimport { ASSET_MENTION_RE } from \"./asset-extensions.js\";\nimport {\n DATA_PREFIX,\n isAssetSpecifier,\n isDataAsset,\n isUrlSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n} from \"./asset-specifier.js\";\nimport { RESOURCE_PATH_EXPORT } from \"./resource-shared.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype ParsedModule = ParseResult[\"module\"];\ntype ImportStatement = ParsedModule[\"staticImports\"][number];\ntype ExportStatement = ParsedModule[\"staticExports\"][number];\ntype ExportEntry = ExportStatement[\"entries\"][number];\ntype BindingEntry = { importName: { name: string | null }; isType: boolean };\ntype NamedBinding = { name: string; source: string };\ntype PluginState = { isV2: boolean };\n\nconst NODE_MODULES = /(?:^|\\/)node_modules\\//;\nconst VIRTUAL_PREFIX = \"\\0\";\nconst DEFAULT_BINDING = \"default\";\nconst RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);\nconst DATA_IMPORT_EXAMPLE = `\"${DATA_PREFIX}<path>\"`;\nconst URL_FALLBACK = \", or import the default for the asset URL.\";\n\nconst BUNDLE_ADVICE =\n `An asset staged into the GResource bundle exports ${RESOURCE_BINDING} and a \"resource://\" default, and ` +\n \"nothing else.\";\n\nconst QUERY_ADVICE =\n `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;\n\nconst RESOURCE_ADVICE =\n `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;\n\nconst ICON_ADVICE = \"An icon asset exports only its default icon-theme name, and nothing else.\";\n\nconst RELATIVE_ADVICE =\n `Only assets imported through \"${DATA_PREFIX}\" are staged into the GResource bundle and export ` +\n `${RESOURCE_BINDING}; move the file under the data directory and import it as ` +\n `${DATA_IMPORT_EXAMPLE}${URL_FALLBACK}`;\n\nconst boundName = (entry: BindingEntry): string | null => {\n const { name } = entry.importName;\n\n if (name === null || name === DEFAULT_BINDING || entry.isType) {\n return null;\n }\n\n return name;\n};\n\nconst importBindings = (statement: ImportStatement): NamedBinding[] =>\n statement.entries\n .map((entry) => boundName(entry))\n .filter((name) => name !== null)\n .map((name) => ({ name, source: statement.moduleRequest.value }));\n\nconst exportBinding = (entry: ExportEntry): NamedBinding | null => {\n const name = boundName(entry);\n const source = entry.moduleRequest?.value;\n\n return name === null || source === undefined ? null : { name, source };\n};\n\nconst exportBindings = (statement: ExportStatement): NamedBinding[] =>\n statement.entries.map((entry) => exportBinding(entry)).filter((binding) => binding !== null);\n\nconst bindings = (parsed: ParsedModule): NamedBinding[] => [\n ...parsed.staticImports.flatMap((statement) => importBindings(statement)),\n ...parsed.staticExports.flatMap((statement) => exportBindings(statement)),\n];\n\nconst isBacked = ({ name, source }: NamedBinding, isV2: boolean): boolean => {\n if (name !== RESOURCE_PATH_EXPORT) {\n return false;\n }\n\n return isV2 ? parseResourceSpecifier(source) !== null : isDataAsset(source);\n};\n\nconst isCheckedSpecifier = (source: string): boolean => isAssetSpecifier(source) || isUrlSpecifier(source);\n\nconst unbackedBinding = (parsed: ParsedModule, isV2: boolean): NamedBinding | undefined =>\n bindings(parsed).find((binding) => isCheckedSpecifier(binding.source) && !isBacked(binding, isV2));\n\nconst isBundledResource = (source: string, isV2: boolean): boolean =>\n isV2\n ? parseResourceSpecifier(source) !== null || parseIconSpecifier(source) !== null\n : isDataAsset(source);\n\nconst v2BundleAdvice = (source: string): string =>\n parseIconSpecifier(source) === null ? RESOURCE_ADVICE : ICON_ADVICE;\n\nconst bundleAdvice = (source: string, isV2: boolean): string => {\n if (isBundledResource(source, isV2)) {\n return isV2 ? v2BundleAdvice(source) : BUNDLE_ADVICE;\n }\n\n if (isUrlSpecifier(source)) {\n return QUERY_ADVICE;\n }\n\n return source.startsWith(DATA_PREFIX) ? QUERY_ADVICE : RELATIVE_ADVICE;\n};\n\nconst unbackedBindingError = (path: string, binding: NamedBinding, isV2: boolean): Error =>\n new Error(\n `${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +\n \"gtkx build rejects and gtkx dev would bind as undefined. \" +\n bundleAdvice(binding.source, isV2),\n );\n\nconst isCheckedSource = (path: string): boolean => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);\nconst hasCheckedAssetMention = (code: string): boolean => ASSET_MENTION_RE.test(code) || code.includes(\"?url\");\n\nconst checkAssetImports = (code: string, id: string, isV2: boolean): void => {\n const path = stripQuery(id);\n const lang = sourceLanguage(path);\n\n if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {\n return;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n if (parsed.errors.length > 0) {\n return;\n }\n\n const binding = unbackedBinding(parsed.module, isV2);\n\n if (binding !== undefined) {\n throw unbackedBindingError(path, binding, isV2);\n }\n};\n\nfunction gtkxAssetImports(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = { isV2: false };\n\n return {\n name: \"gtkx:asset-imports\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isV2 = resolveFuture(loaded.config.future).isResourceImported;\n },\n\n transform(code, id) {\n checkAssetImports(code, id, state.isV2);\n },\n };\n}\n\nexport { gtkxAssetImports };\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ConfigLoader } from "@gtkx/config";
|
|
2
|
+
import type { Plugin } from "vite";
|
|
3
|
+
declare const gtkxI18n: (entryPath: string, loadConfig?: ConfigLoader, shouldPreserveMetadataMessages?: boolean) => Plugin;
|
|
4
|
+
export { gtkxI18n };
|
|
5
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AA2GnD,QAAA,MAAM,QAAQ,GACV,WAAW,MAAM,EACjB,aAAY,YAAmC,EAC/C,wCAAqC,KACtC,MA+BF,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, join, posix, relative, resolve } from "node:path";
|
|
5
|
+
import { compileCatalogs, LOCALE_DIRNAME, resolveCatalogProject, synchronizeCatalogs, } from "../i18n/catalogs.js";
|
|
6
|
+
import { extractSourceCatalog } from "../i18n/source-messages.js";
|
|
7
|
+
import { discoverSourceFiles } from "../internal/source-imports.js";
|
|
8
|
+
import { stripQuery } from "./strip-query.js";
|
|
9
|
+
const BOOTSTRAP_SPECIFIER = "@gtkx/i18n/bootstrap";
|
|
10
|
+
const LOCALE_URL_PLACEHOLDER = "__GTKX_BUNDLE_LOCALE_DIR__";
|
|
11
|
+
const LOCALE_MODULE_PATHS = new Set(["dist/locale.js", "src/locale.ts"]);
|
|
12
|
+
const LOCALE_URL_PATTERN = /new URL\((["'])locale\1,\s*import\.meta\.url\)/;
|
|
13
|
+
const isI18nLocaleModule = (state, id) => {
|
|
14
|
+
if (state.i18nRoot.length === 0) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const path = relative(state.i18nRoot, stripQuery(id)).replaceAll("\\", "/");
|
|
18
|
+
return LOCALE_MODULE_PATHS.has(path);
|
|
19
|
+
};
|
|
20
|
+
const markLocaleUrl = (code) => code.replace(LOCALE_URL_PATTERN, () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`);
|
|
21
|
+
const localeUrlForChunk = (fileName) => {
|
|
22
|
+
const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);
|
|
23
|
+
return path.length === 0 ? "." : path;
|
|
24
|
+
};
|
|
25
|
+
const rebaseLocaleUrl = (state, code, fileName, moduleIds) => {
|
|
26
|
+
if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);
|
|
30
|
+
if (!code.includes(placeholder)) {
|
|
31
|
+
throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);
|
|
32
|
+
}
|
|
33
|
+
return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));
|
|
34
|
+
};
|
|
35
|
+
const applyResolvedConfig = async (state, config, loadConfig) => {
|
|
36
|
+
state.entryPath = resolve(config.root, state.entryPath);
|
|
37
|
+
state.outDir = resolve(config.root, config.build.outDir);
|
|
38
|
+
const application = await loadConfig.resolve(config.root);
|
|
39
|
+
state.project = resolveCatalogProject(config.root, application.applicationId);
|
|
40
|
+
if (state.project !== null) {
|
|
41
|
+
const projectRequire = createRequire(resolve(config.root, "package.json"));
|
|
42
|
+
state.i18nRoot = dirname(projectRequire.resolve("@gtkx/i18n/package.json"));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const buildCatalogs = (state) => {
|
|
46
|
+
const project = state.project;
|
|
47
|
+
if (project === null) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
mkdirSync(state.outDir, { recursive: true });
|
|
51
|
+
compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));
|
|
52
|
+
};
|
|
53
|
+
const extractProjectMessages = async (state, shouldPreserveMetadataMessages) => {
|
|
54
|
+
const project = state.project;
|
|
55
|
+
if (project === null) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const srcDir = join(project.root, "src");
|
|
59
|
+
const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);
|
|
60
|
+
await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);
|
|
61
|
+
synchronizeCatalogs(project);
|
|
62
|
+
};
|
|
63
|
+
const gtkxI18n = (entryPath, loadConfig = createConfigLoader(), shouldPreserveMetadataMessages = true) => {
|
|
64
|
+
const state = { entryPath, i18nRoot: "", outDir: "", project: null };
|
|
65
|
+
return {
|
|
66
|
+
name: "gtkx:i18n",
|
|
67
|
+
enforce: "pre",
|
|
68
|
+
configResolved: (config) => applyResolvedConfig(state, config, loadConfig),
|
|
69
|
+
buildStart: () => extractProjectMessages(state, shouldPreserveMetadataMessages),
|
|
70
|
+
transform(code, id) {
|
|
71
|
+
if (isI18nLocaleModule(state, id)) {
|
|
72
|
+
return markLocaleUrl(code);
|
|
73
|
+
}
|
|
74
|
+
if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\n${code}`;
|
|
78
|
+
},
|
|
79
|
+
renderChunk(code, chunk) {
|
|
80
|
+
return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);
|
|
81
|
+
},
|
|
82
|
+
generateBundle() {
|
|
83
|
+
buildCatalogs(state);
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
export { gtkxI18n };
|
|
88
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, posix, relative, resolve } from \"node:path\";\nimport {\n type CatalogProject,\n compileCatalogs,\n LOCALE_DIRNAME,\n resolveCatalogProject,\n synchronizeCatalogs,\n} from \"../i18n/catalogs.js\";\nimport { extractSourceCatalog } from \"../i18n/source-messages.js\";\nimport { discoverSourceFiles } from \"../internal/source-imports.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype I18nState = {\n entryPath: string;\n i18nRoot: string;\n outDir: string;\n project: CatalogProject | null;\n};\n\nconst BOOTSTRAP_SPECIFIER = \"@gtkx/i18n/bootstrap\";\nconst LOCALE_URL_PLACEHOLDER = \"__GTKX_BUNDLE_LOCALE_DIR__\";\nconst LOCALE_MODULE_PATHS = new Set([\"dist/locale.js\", \"src/locale.ts\"]);\nconst LOCALE_URL_PATTERN = /new URL\\(([\"'])locale\\1,\\s*import\\.meta\\.url\\)/;\n\nconst isI18nLocaleModule = (state: I18nState, id: string): boolean => {\n if (state.i18nRoot.length === 0) {\n return false;\n }\n\n const path = relative(state.i18nRoot, stripQuery(id)).replaceAll(\"\\\\\", \"/\");\n\n return LOCALE_MODULE_PATHS.has(path);\n};\n\nconst markLocaleUrl = (code: string): string =>\n code.replace(\n LOCALE_URL_PATTERN,\n () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`,\n );\n\nconst localeUrlForChunk = (fileName: string): string => {\n const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);\n\n return path.length === 0 ? \".\" : path;\n};\n\nconst rebaseLocaleUrl = (state: I18nState, code: string, fileName: string, moduleIds: string[]): string | null => {\n if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {\n return null;\n }\n\n const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);\n\n if (!code.includes(placeholder)) {\n throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);\n }\n\n return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));\n};\n\nconst applyResolvedConfig = async (\n state: I18nState,\n config: ResolvedConfig,\n loadConfig: ConfigLoader,\n): Promise<void> => {\n state.entryPath = resolve(config.root, state.entryPath);\n state.outDir = resolve(config.root, config.build.outDir);\n const application = await loadConfig.resolve(config.root);\n state.project = resolveCatalogProject(config.root, application.applicationId);\n\n if (state.project !== null) {\n const projectRequire = createRequire(resolve(config.root, \"package.json\"));\n state.i18nRoot = dirname(projectRequire.resolve(\"@gtkx/i18n/package.json\"));\n }\n};\n\nconst buildCatalogs = (state: I18nState): void => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n mkdirSync(state.outDir, { recursive: true });\n compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));\n};\n\nconst extractProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n): Promise<void> => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);\n await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);\n synchronizeCatalogs(project);\n};\n\nconst gtkxI18n = (\n entryPath: string,\n loadConfig: ConfigLoader = createConfigLoader(),\n shouldPreserveMetadataMessages = true,\n): Plugin => {\n const state: I18nState = { entryPath, i18nRoot: \"\", outDir: \"\", project: null };\n\n return {\n name: \"gtkx:i18n\",\n enforce: \"pre\",\n\n configResolved: (config) => applyResolvedConfig(state, config, loadConfig),\n\n buildStart: () => extractProjectMessages(state, shouldPreserveMetadataMessages),\n\n transform(code, id) {\n if (isI18nLocaleModule(state, id)) {\n return markLocaleUrl(code);\n }\n\n if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {\n return;\n }\n\n return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\\n${code}`;\n },\n\n renderChunk(code, chunk) {\n return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);\n },\n\n generateBundle() {\n buildCatalogs(state);\n },\n };\n};\n\nexport { gtkxI18n };\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
2
|
import type { BuildManifestCollector } from "../internal/build-manifest.js";
|
|
3
|
-
declare const gtkxVitePlugins: (mode?: string, entryPath?: string, buildManifest?: BuildManifestCollector) => Plugin[];
|
|
3
|
+
declare const gtkxVitePlugins: (mode?: string, entryPath?: string, buildManifest?: BuildManifestCollector, shouldPreserveI18nMetadata?: boolean) => Plugin[];
|
|
4
4
|
export { gtkxVitePlugins };
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAa5E,QAAA,MAAM,eAAe,GACjB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,gBAAgB,sBAAsB,EACtC,oCAAiC,KAClC,MAAM,EAiBR,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|