@gtkx/config 2.0.0-beta.10 → 2.0.0-beta.11
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 +11 -169
- package/dist/config-dependencies.d.ts.map +1 -1
- package/dist/config-dependencies.js +3 -2
- package/dist/config-dependencies.js.map +1 -1
- package/dist/config-reloader.d.ts +8 -0
- package/dist/config-reloader.d.ts.map +1 -0
- package/dist/config-reloader.js +38 -0
- package/dist/config-reloader.js.map +1 -0
- package/dist/config-source.d.ts +7 -0
- package/dist/config-source.d.ts.map +1 -0
- package/dist/config-source.js +17 -0
- package/dist/config-source.js.map +1 -0
- package/dist/config.d.ts +32 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -10
- package/dist/config.js.map +1 -1
- package/dist/deploy.d.ts +3 -7
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +1 -2
- package/dist/deploy.js.map +1 -1
- package/dist/internal.d.ts +4 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -2
- package/dist/internal.js.map +1 -1
- package/dist/loader.d.ts +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +3 -15
- package/dist/loader.js.map +1 -1
- package/dist/node-version.d.ts +2 -1
- package/dist/node-version.d.ts.map +1 -1
- package/dist/node-version.js +2 -1
- package/dist/node-version.js.map +1 -1
- package/dist/static-dependencies.d.ts +3 -0
- package/dist/static-dependencies.d.ts.map +1 -0
- package/dist/static-dependencies.js +350 -0
- package/dist/static-dependencies.js.map +1 -0
- package/dist/virtual.d.ts.map +1 -1
- package/dist/virtual.js +0 -2
- package/dist/virtual.js.map +1 -1
- package/dist/vite-plugin.d.ts.map +1 -1
- package/dist/vite-plugin.js.map +1 -1
- package/package.json +20 -6
- package/src/config-dependencies.ts +4 -2
- package/src/config-reloader.ts +54 -0
- package/src/config-source.ts +25 -0
- package/src/config.ts +22 -14
- package/src/deploy.ts +2 -3
- package/src/internal.ts +4 -1
- package/src/loader.ts +4 -24
- package/src/node-version.ts +2 -1
- package/src/static-dependencies.ts +464 -0
- package/src/virtual.ts +0 -2
- package/src/vite-plugin.ts +0 -2
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { parseSync, traverse, types } from "@babel/core";
|
|
2
|
+
import { parseJSON, parseJSON5, parseJSONC, parseTOML, parseYAML } from "confbox";
|
|
3
|
+
import { createJiti } from "jiti";
|
|
4
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
import { basename, dirname, extname, isAbsolute, join, resolve, sep } from "node:path";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
7
|
+
import { localConfigSourcePath } from "./config-source.js";
|
|
8
|
+
const MODULE_EXTENSIONS = new Set([
|
|
9
|
+
".cjs",
|
|
10
|
+
".cts",
|
|
11
|
+
".js",
|
|
12
|
+
".mjs",
|
|
13
|
+
".mts",
|
|
14
|
+
".ts",
|
|
15
|
+
]);
|
|
16
|
+
const RESOLVABLE_EXTENSIONS = [
|
|
17
|
+
".js",
|
|
18
|
+
".ts",
|
|
19
|
+
".mjs",
|
|
20
|
+
".cjs",
|
|
21
|
+
".mts",
|
|
22
|
+
".cts",
|
|
23
|
+
".json",
|
|
24
|
+
".jsonc",
|
|
25
|
+
".json5",
|
|
26
|
+
".yaml",
|
|
27
|
+
".yml",
|
|
28
|
+
".toml",
|
|
29
|
+
];
|
|
30
|
+
const JAVASCRIPT_FALLBACKS = {
|
|
31
|
+
".cjs": [".cts"],
|
|
32
|
+
".js": [".ts"],
|
|
33
|
+
".jsx": [".tsx"],
|
|
34
|
+
".mjs": [".mts"],
|
|
35
|
+
};
|
|
36
|
+
const DATA_PARSERS = {
|
|
37
|
+
".json": parseJSON,
|
|
38
|
+
".json5": parseJSON5,
|
|
39
|
+
".jsonc": parseJSONC,
|
|
40
|
+
".toml": parseTOML,
|
|
41
|
+
".yaml": parseYAML,
|
|
42
|
+
".yml": parseYAML,
|
|
43
|
+
};
|
|
44
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
45
|
+
const parserPlugins = (path) => {
|
|
46
|
+
const extension = extname(path).toLowerCase();
|
|
47
|
+
return [
|
|
48
|
+
"decorators",
|
|
49
|
+
...([".cts", ".mts", ".ts"].includes(extension) ? ["typescript"] : []),
|
|
50
|
+
];
|
|
51
|
+
};
|
|
52
|
+
function expressionSources(value) {
|
|
53
|
+
if (types.isStringLiteral(value)) {
|
|
54
|
+
return [value.value];
|
|
55
|
+
}
|
|
56
|
+
if (types.isArrayExpression(value)) {
|
|
57
|
+
return value.elements.flatMap((element) => types.isExpression(element) ? expressionSources(element) : []);
|
|
58
|
+
}
|
|
59
|
+
return types.isObjectExpression(value)
|
|
60
|
+
? value.properties.flatMap((property) => sourcePropertySources(property))
|
|
61
|
+
: [];
|
|
62
|
+
}
|
|
63
|
+
const isNamedProperty = (property, name) => (types.isIdentifier(property.key) && property.key.name === name) ||
|
|
64
|
+
(types.isStringLiteral(property.key) && property.key.value === name);
|
|
65
|
+
function sourcePropertySources(property) {
|
|
66
|
+
return types.isObjectProperty(property) &&
|
|
67
|
+
isNamedProperty(property, "source") &&
|
|
68
|
+
types.isExpression(property.value)
|
|
69
|
+
? expressionSources(property.value)
|
|
70
|
+
: [];
|
|
71
|
+
}
|
|
72
|
+
const extendsSources = (value) => expressionSources(value);
|
|
73
|
+
const isExtendsProperty = (property) => isNamedProperty(property, "extends");
|
|
74
|
+
const parseModule = (path) => {
|
|
75
|
+
try {
|
|
76
|
+
return parseSync(readFileSync(path, "utf8"), {
|
|
77
|
+
ast: true,
|
|
78
|
+
babelrc: false,
|
|
79
|
+
configFile: false,
|
|
80
|
+
filename: path,
|
|
81
|
+
parserOpts: { allowReturnOutsideFunction: true, plugins: parserPlugins(path) },
|
|
82
|
+
sourceType: "unambiguous",
|
|
83
|
+
}) ?? undefined;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const addSource = (sources, source) => {
|
|
90
|
+
if (source !== null && source !== undefined) {
|
|
91
|
+
sources.add(source.value);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const requireSource = (call) => types.isIdentifier(call.callee, { name: "require" }) && types.isStringLiteral(call.arguments[0])
|
|
95
|
+
? call.arguments[0]
|
|
96
|
+
: undefined;
|
|
97
|
+
const importEqualsSource = (declaration) => {
|
|
98
|
+
const { moduleReference } = declaration;
|
|
99
|
+
return types.isTSExternalModuleReference(moduleReference) ? moduleReference.expression : undefined;
|
|
100
|
+
};
|
|
101
|
+
const propertySources = (property) => isExtendsProperty(property) && types.isExpression(property.value)
|
|
102
|
+
? extendsSources(property.value)
|
|
103
|
+
: [];
|
|
104
|
+
const collectModuleSources = (ast) => {
|
|
105
|
+
const sources = new Set();
|
|
106
|
+
const extended = new Set();
|
|
107
|
+
traverse(ast, {
|
|
108
|
+
CallExpression: (nodePath) => {
|
|
109
|
+
addSource(sources, requireSource(nodePath.node));
|
|
110
|
+
},
|
|
111
|
+
ExportAllDeclaration: (nodePath) => {
|
|
112
|
+
addSource(sources, nodePath.node.source);
|
|
113
|
+
},
|
|
114
|
+
ExportNamedDeclaration: (nodePath) => {
|
|
115
|
+
addSource(sources, nodePath.node.source);
|
|
116
|
+
},
|
|
117
|
+
ImportDeclaration: (nodePath) => {
|
|
118
|
+
addSource(sources, nodePath.node.source);
|
|
119
|
+
},
|
|
120
|
+
ImportExpression: (nodePath) => {
|
|
121
|
+
const { source } = nodePath.node;
|
|
122
|
+
addSource(sources, types.isStringLiteral(source) ? source : undefined);
|
|
123
|
+
},
|
|
124
|
+
ObjectProperty: (nodePath) => {
|
|
125
|
+
for (const source of propertySources(nodePath.node)) {
|
|
126
|
+
sources.add(source);
|
|
127
|
+
extended.add(source);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
TSImportEqualsDeclaration: (nodePath) => {
|
|
131
|
+
addSource(sources, importEqualsSource(nodePath.node));
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return { all: [...sources], extended: [...extended] };
|
|
135
|
+
};
|
|
136
|
+
const moduleSources = (path) => {
|
|
137
|
+
const ast = parseModule(path);
|
|
138
|
+
return ast === undefined ? { all: [], extended: [] } : collectModuleSources(ast);
|
|
139
|
+
};
|
|
140
|
+
function parsedExtendsSources(value) {
|
|
141
|
+
if (typeof value === "string") {
|
|
142
|
+
return [value];
|
|
143
|
+
}
|
|
144
|
+
if (Array.isArray(value)) {
|
|
145
|
+
return value.flatMap((item) => parsedExtendsSources(item));
|
|
146
|
+
}
|
|
147
|
+
return objectExtendsSources(value);
|
|
148
|
+
}
|
|
149
|
+
const objectExtendsSources = (value) => {
|
|
150
|
+
if (typeof value !== "object" || value === null) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
return "source" in value ? parsedExtendsSources(value.source) : [];
|
|
154
|
+
};
|
|
155
|
+
const configExtendsSources = (value) => {
|
|
156
|
+
if (typeof value !== "object" || value === null) {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
return "extends" in value ? parsedExtendsSources(value.extends) : [];
|
|
160
|
+
};
|
|
161
|
+
const dataSources = (path) => {
|
|
162
|
+
const parser = DATA_PARSERS[extname(path).toLowerCase()];
|
|
163
|
+
if (parser === undefined) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
return configExtendsSources(parser(readFileSync(path, "utf8")));
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
const extensionCandidates = (path) => {
|
|
174
|
+
const extension = extname(path).toLowerCase();
|
|
175
|
+
if (extension.length === 0) {
|
|
176
|
+
return RESOLVABLE_EXTENSIONS.map((candidate) => `${path}${candidate}`);
|
|
177
|
+
}
|
|
178
|
+
const stem = path.slice(0, -extension.length);
|
|
179
|
+
return (JAVASCRIPT_FALLBACKS[extension] ?? []).map((candidate) => `${stem}${candidate}`);
|
|
180
|
+
};
|
|
181
|
+
const targetCandidates = (target, configName) => {
|
|
182
|
+
const extension = extname(target);
|
|
183
|
+
if (extension.length > 0) {
|
|
184
|
+
return [target, ...extensionCandidates(target)];
|
|
185
|
+
}
|
|
186
|
+
return [
|
|
187
|
+
target,
|
|
188
|
+
...extensionCandidates(target),
|
|
189
|
+
join(target, configName),
|
|
190
|
+
...RESOLVABLE_EXTENSIONS.map((candidate) => join(target, `index${candidate}`)),
|
|
191
|
+
];
|
|
192
|
+
};
|
|
193
|
+
const localSourceTarget = (source, importer) => {
|
|
194
|
+
const clean = source.split(/[?#]/u, 1)[0] ?? "";
|
|
195
|
+
if (clean.startsWith("file:")) {
|
|
196
|
+
return fileURLToPath(clean);
|
|
197
|
+
}
|
|
198
|
+
if (!isAbsolute(clean) && !clean.startsWith(".")) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
return resolve(dirname(importer), clean);
|
|
202
|
+
};
|
|
203
|
+
const unresolvedCandidates = (source, importer, configName) => {
|
|
204
|
+
const target = localSourceTarget(source, importer);
|
|
205
|
+
if (target === undefined) {
|
|
206
|
+
return [];
|
|
207
|
+
}
|
|
208
|
+
return targetCandidates(target, configName);
|
|
209
|
+
};
|
|
210
|
+
const nearestPackageFile = (importer) => {
|
|
211
|
+
let directory = dirname(importer);
|
|
212
|
+
let previous = "";
|
|
213
|
+
while (directory !== previous) {
|
|
214
|
+
const candidate = join(directory, "package.json");
|
|
215
|
+
if (existsSync(candidate)) {
|
|
216
|
+
return candidate;
|
|
217
|
+
}
|
|
218
|
+
previous = directory;
|
|
219
|
+
directory = dirname(directory);
|
|
220
|
+
}
|
|
221
|
+
return undefined;
|
|
222
|
+
};
|
|
223
|
+
const readPackageImports = (importer) => {
|
|
224
|
+
const file = nearestPackageFile(importer);
|
|
225
|
+
if (file === undefined) {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const manifest = parseJSON(readFileSync(file, "utf8"));
|
|
230
|
+
return isRecord(manifest) && isRecord(manifest.imports)
|
|
231
|
+
? { file, imports: manifest.imports, root: dirname(file) }
|
|
232
|
+
: undefined;
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
function stringTargets(value) {
|
|
239
|
+
if (typeof value === "string") {
|
|
240
|
+
return [value];
|
|
241
|
+
}
|
|
242
|
+
if (Array.isArray(value)) {
|
|
243
|
+
return value.flatMap((item) => stringTargets(item));
|
|
244
|
+
}
|
|
245
|
+
return isRecord(value)
|
|
246
|
+
? Object.values(value).flatMap((item) => stringTargets(item))
|
|
247
|
+
: [];
|
|
248
|
+
}
|
|
249
|
+
const importPatternMatch = (pattern, source) => {
|
|
250
|
+
if (pattern === source) {
|
|
251
|
+
return "";
|
|
252
|
+
}
|
|
253
|
+
const wildcard = pattern.indexOf("*");
|
|
254
|
+
if (wildcard === -1) {
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
const prefix = pattern.slice(0, wildcard);
|
|
258
|
+
const suffix = pattern.slice(wildcard + 1);
|
|
259
|
+
return source.startsWith(prefix) && source.endsWith(suffix)
|
|
260
|
+
? source.slice(prefix.length, source.length - suffix.length)
|
|
261
|
+
: undefined;
|
|
262
|
+
};
|
|
263
|
+
const packageImportTargets = (source, imports) => Object.entries(imports).flatMap(([pattern, value]) => {
|
|
264
|
+
const match = importPatternMatch(pattern, source);
|
|
265
|
+
return match === undefined
|
|
266
|
+
? []
|
|
267
|
+
: stringTargets(value).map((target) => target.split("*").join(match));
|
|
268
|
+
});
|
|
269
|
+
const packageImportDependencies = (source, importer, configName) => {
|
|
270
|
+
if (!source.startsWith("#")) {
|
|
271
|
+
return [];
|
|
272
|
+
}
|
|
273
|
+
const packageImports = readPackageImports(importer);
|
|
274
|
+
if (packageImports === undefined) {
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
const targets = packageImportTargets(source, packageImports.imports)
|
|
278
|
+
.filter((target) => target.startsWith("."))
|
|
279
|
+
.flatMap((target) => targetCandidates(resolve(packageImports.root, target), configName));
|
|
280
|
+
return [packageImports.file, ...targets];
|
|
281
|
+
};
|
|
282
|
+
const normalizedResolvedPath = (path) => path.startsWith("file:") ? fileURLToPath(path) : path;
|
|
283
|
+
const resolvedSourcePath = (source, importer, jiti) => {
|
|
284
|
+
try {
|
|
285
|
+
const path = jiti.esmResolve(source, {
|
|
286
|
+
parentURL: pathToFileURL(importer).href,
|
|
287
|
+
try: true,
|
|
288
|
+
});
|
|
289
|
+
return path === undefined ? undefined : normalizedResolvedPath(path);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return undefined;
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
const sourceDependencies = (source, importer, configName, jiti) => {
|
|
296
|
+
const dependency = resolvedSourcePath(source, importer, jiti);
|
|
297
|
+
const packageDependencies = packageImportDependencies(source, importer, configName);
|
|
298
|
+
return dependency === undefined
|
|
299
|
+
? [...unresolvedCandidates(source, importer, configName), ...packageDependencies]
|
|
300
|
+
: [dependency, ...packageDependencies];
|
|
301
|
+
};
|
|
302
|
+
const configLayerDirectory = (path, configName, configRoot) => {
|
|
303
|
+
const segments = configName.split(/[\\/]/u).filter((segment) => segment.length > 0);
|
|
304
|
+
let directory = resolve(path);
|
|
305
|
+
let remaining = segments.length;
|
|
306
|
+
while (remaining > 0) {
|
|
307
|
+
directory = dirname(directory);
|
|
308
|
+
remaining -= 1;
|
|
309
|
+
}
|
|
310
|
+
return resolve(directory, ...segments) === resolve(path) ? directory : resolve(configRoot);
|
|
311
|
+
};
|
|
312
|
+
const c12SourceDependencies = (source, importer, configName, configRoot) => {
|
|
313
|
+
const clean = source.split(/[?#]/u, 1)[0] ?? "";
|
|
314
|
+
const cwd = configLayerDirectory(importer, configName, configRoot);
|
|
315
|
+
const target = localConfigSourcePath(clean, { cwd, configFile: configName });
|
|
316
|
+
return target === undefined ? [] : targetCandidates(target, configName);
|
|
317
|
+
};
|
|
318
|
+
const directDependencies = (path, configName, configRoot) => {
|
|
319
|
+
const module = MODULE_EXTENSIONS.has(extname(path).toLowerCase()) ? moduleSources(path) : undefined;
|
|
320
|
+
const sources = module?.all ?? dataSources(path);
|
|
321
|
+
const extended = module?.extended ?? sources;
|
|
322
|
+
const jiti = createJiti(path, {
|
|
323
|
+
extensions: RESOLVABLE_EXTENSIONS,
|
|
324
|
+
fsCache: false,
|
|
325
|
+
moduleCache: false,
|
|
326
|
+
});
|
|
327
|
+
return [
|
|
328
|
+
...sources.flatMap((source) => sourceDependencies(source, path, configName, jiti)),
|
|
329
|
+
...extended.flatMap((source) => c12SourceDependencies(source, path, configName, configRoot)),
|
|
330
|
+
]
|
|
331
|
+
.filter((dependency) => !dependency.includes(`${sep}node_modules${sep}`));
|
|
332
|
+
};
|
|
333
|
+
const resolveConfigDependencies = (configFile, configName = basename(configFile), configRoot = dirname(configFile)) => {
|
|
334
|
+
const dependencies = new Set();
|
|
335
|
+
const pending = [resolve(configFile)];
|
|
336
|
+
while (pending.length > 0) {
|
|
337
|
+
const path = pending.pop();
|
|
338
|
+
if (path === undefined) {
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
if (dependencies.has(path)) {
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
dependencies.add(path);
|
|
345
|
+
pending.push(...directDependencies(path, configName, configRoot));
|
|
346
|
+
}
|
|
347
|
+
return [...dependencies];
|
|
348
|
+
};
|
|
349
|
+
export { resolveConfigDependencies };
|
|
350
|
+
//# sourceMappingURL=static-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-dependencies.js","sourceRoot":"","sources":["../src/static-dependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseSync, traverse, types } from \"@babel/core\";\nimport { parseJSON, parseJSON5, parseJSONC, parseTOML, parseYAML } from \"confbox\";\nimport { createJiti, type Jiti } from \"jiti\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, extname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { localConfigSourcePath } from \"./config-source.ts\";\n\nconst MODULE_EXTENSIONS: ReadonlySet<string> = new Set([\n \".cjs\",\n \".cts\",\n \".js\",\n \".mjs\",\n \".mts\",\n \".ts\",\n]);\nconst RESOLVABLE_EXTENSIONS = [\n \".js\",\n \".ts\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n \".json\",\n \".jsonc\",\n \".json5\",\n \".yaml\",\n \".yml\",\n \".toml\",\n];\nconst JAVASCRIPT_FALLBACKS: Readonly<Record<string, string[]>> = {\n \".cjs\": [\".cts\"],\n \".js\": [\".ts\"],\n \".jsx\": [\".tsx\"],\n \".mjs\": [\".mts\"],\n};\nconst DATA_PARSERS: Readonly<Record<string, (source: string) => unknown>> = {\n \".json\": parseJSON,\n \".json5\": parseJSON5,\n \".jsonc\": parseJSONC,\n \".toml\": parseTOML,\n \".yaml\": parseYAML,\n \".yml\": parseYAML,\n};\n\ntype PackageImports = { file: string; imports: Record<string, unknown>; root: string };\ntype ModuleSources = { all: string[]; extended: string[] };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parserPlugins = (path: string): (\"decorators\" | \"jsx\" | \"typescript\")[] => {\n const extension = extname(path).toLowerCase();\n\n return [\n \"decorators\",\n ...([\".cts\", \".mts\", \".ts\"].includes(extension) ? [\"typescript\" as const] : []),\n ];\n};\n\nfunction expressionSources(value: types.Expression): string[] {\n if (types.isStringLiteral(value)) {\n return [value.value];\n }\n\n if (types.isArrayExpression(value)) {\n return value.elements.flatMap((element) =>\n types.isExpression(element) ? expressionSources(element) : []);\n }\n\n return types.isObjectExpression(value)\n ? value.properties.flatMap((property) => sourcePropertySources(property))\n : [];\n}\n\nconst isNamedProperty = (property: types.ObjectProperty, name: string): boolean =>\n (types.isIdentifier(property.key) && property.key.name === name) ||\n (types.isStringLiteral(property.key) && property.key.value === name);\n\nfunction sourcePropertySources(\n property: types.ObjectMethod | types.ObjectProperty | types.SpreadElement,\n): string[] {\n return types.isObjectProperty(property) &&\n isNamedProperty(property, \"source\") &&\n types.isExpression(property.value)\n ? expressionSources(property.value)\n : [];\n}\n\nconst extendsSources = (value: types.Expression): string[] => expressionSources(value);\n\nconst isExtendsProperty = (property: types.ObjectProperty): boolean =>\n isNamedProperty(property, \"extends\");\n\ntype ParsedModule = NonNullable<ReturnType<typeof parseSync>>;\n\nconst parseModule = (path: string): ParsedModule | undefined => {\n try {\n return parseSync(readFileSync(path, \"utf8\"), {\n ast: true,\n babelrc: false,\n configFile: false,\n filename: path,\n parserOpts: { allowReturnOutsideFunction: true, plugins: parserPlugins(path) },\n sourceType: \"unambiguous\",\n }) ?? undefined;\n } catch {\n return undefined;\n }\n};\n\nconst addSource = (sources: Set<string>, source: types.StringLiteral | null | undefined): void => {\n if (source !== null && source !== undefined) {\n sources.add(source.value);\n }\n};\n\nconst requireSource = (call: types.CallExpression): types.StringLiteral | undefined =>\n types.isIdentifier(call.callee, { name: \"require\" }) && types.isStringLiteral(call.arguments[0])\n ? call.arguments[0]\n : undefined;\n\nconst importEqualsSource = (declaration: types.TSImportEqualsDeclaration): types.StringLiteral | undefined => {\n const { moduleReference } = declaration;\n\n return types.isTSExternalModuleReference(moduleReference) ? moduleReference.expression : undefined;\n};\n\nconst propertySources = (property: types.ObjectProperty): string[] =>\n isExtendsProperty(property) && types.isExpression(property.value)\n ? extendsSources(property.value)\n : [];\n\nconst collectModuleSources = (ast: ParsedModule): ModuleSources => {\n const sources: Set<string> = new Set();\n const extended: Set<string> = new Set();\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n addSource(sources, requireSource(nodePath.node));\n },\n ExportAllDeclaration: (nodePath) => {\n addSource(sources, nodePath.node.source);\n },\n ExportNamedDeclaration: (nodePath) => {\n addSource(sources, nodePath.node.source);\n },\n ImportDeclaration: (nodePath) => {\n addSource(sources, nodePath.node.source);\n },\n ImportExpression: (nodePath) => {\n const { source } = nodePath.node;\n addSource(sources, types.isStringLiteral(source) ? source : undefined);\n },\n ObjectProperty: (nodePath) => {\n for (const source of propertySources(nodePath.node)) {\n sources.add(source);\n extended.add(source);\n }\n },\n TSImportEqualsDeclaration: (nodePath) => {\n addSource(sources, importEqualsSource(nodePath.node));\n },\n });\n\n return { all: [...sources], extended: [...extended] };\n};\n\nconst moduleSources = (path: string): ModuleSources => {\n const ast = parseModule(path);\n\n return ast === undefined ? { all: [], extended: [] } : collectModuleSources(ast);\n};\n\nfunction parsedExtendsSources(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => parsedExtendsSources(item));\n }\n\n return objectExtendsSources(value);\n}\n\nconst objectExtendsSources = (value: unknown): string[] => {\n if (typeof value !== \"object\" || value === null) {\n return [];\n }\n\n return \"source\" in value ? parsedExtendsSources(value.source) : [];\n};\n\nconst configExtendsSources = (value: unknown): string[] => {\n if (typeof value !== \"object\" || value === null) {\n return [];\n }\n\n return \"extends\" in value ? parsedExtendsSources(value.extends) : [];\n};\n\nconst dataSources = (path: string): string[] => {\n const parser = DATA_PARSERS[extname(path).toLowerCase()];\n\n if (parser === undefined) {\n return [];\n }\n\n try {\n return configExtendsSources(parser(readFileSync(path, \"utf8\")));\n } catch {\n return [];\n }\n};\n\nconst extensionCandidates = (path: string): string[] => {\n const extension = extname(path).toLowerCase();\n\n if (extension.length === 0) {\n return RESOLVABLE_EXTENSIONS.map((candidate) => `${path}${candidate}`);\n }\n\n const stem = path.slice(0, -extension.length);\n\n return (JAVASCRIPT_FALLBACKS[extension] ?? []).map((candidate) => `${stem}${candidate}`);\n};\n\nconst targetCandidates = (target: string, configName: string): string[] => {\n const extension = extname(target);\n\n if (extension.length > 0) {\n return [target, ...extensionCandidates(target)];\n }\n\n return [\n target,\n ...extensionCandidates(target),\n join(target, configName),\n ...RESOLVABLE_EXTENSIONS.map((candidate) => join(target, `index${candidate}`)),\n ];\n};\n\nconst localSourceTarget = (source: string, importer: string): string | undefined => {\n const clean = source.split(/[?#]/u, 1)[0] ?? \"\";\n\n if (clean.startsWith(\"file:\")) {\n return fileURLToPath(clean);\n }\n\n if (!isAbsolute(clean) && !clean.startsWith(\".\")) {\n return undefined;\n }\n\n return resolve(dirname(importer), clean);\n};\n\nconst unresolvedCandidates = (source: string, importer: string, configName: string): string[] => {\n const target = localSourceTarget(source, importer);\n\n if (target === undefined) {\n return [];\n }\n\n return targetCandidates(target, configName);\n};\n\nconst nearestPackageFile = (importer: string): string | undefined => {\n let directory = dirname(importer);\n let previous = \"\";\n\n while (directory !== previous) {\n const candidate = join(directory, \"package.json\");\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n previous = directory;\n directory = dirname(directory);\n }\n\n return undefined;\n};\n\nconst readPackageImports = (importer: string): PackageImports | undefined => {\n const file = nearestPackageFile(importer);\n\n if (file === undefined) {\n return undefined;\n }\n\n try {\n const manifest = parseJSON(readFileSync(file, \"utf8\"));\n\n return isRecord(manifest) && isRecord(manifest.imports)\n ? { file, imports: manifest.imports, root: dirname(file) }\n : undefined;\n } catch {\n return undefined;\n }\n};\n\nfunction stringTargets(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => stringTargets(item));\n }\n\n return isRecord(value)\n ? Object.values(value).flatMap((item) => stringTargets(item))\n : [];\n}\n\nconst importPatternMatch = (pattern: string, source: string): string | undefined => {\n if (pattern === source) {\n return \"\";\n }\n\n const wildcard = pattern.indexOf(\"*\");\n\n if (wildcard === -1) {\n return undefined;\n }\n\n const prefix = pattern.slice(0, wildcard);\n const suffix = pattern.slice(wildcard + 1);\n\n return source.startsWith(prefix) && source.endsWith(suffix)\n ? source.slice(prefix.length, source.length - suffix.length)\n : undefined;\n};\n\nconst packageImportTargets = (source: string, imports: Record<string, unknown>): string[] =>\n Object.entries(imports).flatMap(([pattern, value]) => {\n const match = importPatternMatch(pattern, source);\n\n return match === undefined\n ? []\n : stringTargets(value).map((target) => target.split(\"*\").join(match));\n });\n\nconst packageImportDependencies = (source: string, importer: string, configName: string): string[] => {\n if (!source.startsWith(\"#\")) {\n return [];\n }\n\n const packageImports = readPackageImports(importer);\n\n if (packageImports === undefined) {\n return [];\n }\n\n const targets = packageImportTargets(source, packageImports.imports)\n .filter((target) => target.startsWith(\".\"))\n .flatMap((target) => targetCandidates(resolve(packageImports.root, target), configName));\n\n return [packageImports.file, ...targets];\n};\n\nconst normalizedResolvedPath = (path: string): string =>\n path.startsWith(\"file:\") ? fileURLToPath(path) : path;\n\nconst resolvedSourcePath = (source: string, importer: string, jiti: Jiti): string | undefined => {\n try {\n const path = jiti.esmResolve(source, {\n parentURL: pathToFileURL(importer).href,\n try: true,\n });\n\n return path === undefined ? undefined : normalizedResolvedPath(path);\n } catch {\n return undefined;\n }\n};\n\nconst sourceDependencies = (\n source: string,\n importer: string,\n configName: string,\n jiti: Jiti,\n): string[] => {\n const dependency = resolvedSourcePath(source, importer, jiti);\n const packageDependencies = packageImportDependencies(source, importer, configName);\n\n return dependency === undefined\n ? [...unresolvedCandidates(source, importer, configName), ...packageDependencies]\n : [dependency, ...packageDependencies];\n};\n\nconst configLayerDirectory = (path: string, configName: string, configRoot: string): string => {\n const segments = configName.split(/[\\\\/]/u).filter((segment) => segment.length > 0);\n let directory = resolve(path);\n let remaining = segments.length;\n\n while (remaining > 0) {\n directory = dirname(directory);\n remaining -= 1;\n }\n\n return resolve(directory, ...segments) === resolve(path) ? directory : resolve(configRoot);\n};\n\nconst c12SourceDependencies = (\n source: string,\n importer: string,\n configName: string,\n configRoot: string,\n): string[] => {\n const clean = source.split(/[?#]/u, 1)[0] ?? \"\";\n\n const cwd = configLayerDirectory(importer, configName, configRoot);\n const target = localConfigSourcePath(clean, { cwd, configFile: configName });\n\n return target === undefined ? [] : targetCandidates(target, configName);\n};\n\nconst directDependencies = (path: string, configName: string, configRoot: string): string[] => {\n const module = MODULE_EXTENSIONS.has(extname(path).toLowerCase()) ? moduleSources(path) : undefined;\n const sources = module?.all ?? dataSources(path);\n const extended = module?.extended ?? sources;\n const jiti = createJiti(path, {\n extensions: RESOLVABLE_EXTENSIONS,\n fsCache: false,\n moduleCache: false,\n });\n\n return [\n ...sources.flatMap((source) => sourceDependencies(source, path, configName, jiti)),\n ...extended.flatMap((source) => c12SourceDependencies(source, path, configName, configRoot)),\n ]\n .filter((dependency) => !dependency.includes(`${sep}node_modules${sep}`));\n};\n\nconst resolveConfigDependencies = (\n configFile: string,\n configName = basename(configFile),\n configRoot = dirname(configFile),\n): string[] => {\n const dependencies: Set<string> = new Set();\n const pending = [resolve(configFile)];\n\n while (pending.length > 0) {\n const path = pending.pop();\n\n if (path === undefined) {\n break;\n }\n\n if (dependencies.has(path)) {\n continue;\n }\n\n dependencies.add(path);\n pending.push(...directDependencies(path, configName, configRoot));\n }\n\n return [...dependencies];\n};\n\nexport { resolveConfigDependencies };\n"]}
|
package/dist/virtual.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,QAAA,MAAM,sBAAsB,wBAAwB,CAAC;AACrD,QAAA,MAAM,+BAA+B,0BAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,QAAA,MAAM,sBAAsB,wBAAwB,CAAC;AACrD,QAAA,MAAM,+BAA+B,0BAAgC,CAAC;AAEtE,QAAA,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,MAoBpD,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/virtual.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { resourceBasePath } from "./resource-base-path.js";
|
|
2
2
|
const GTKX_CONFIG_VIRTUAL_ID = "virtual:gtkx-config";
|
|
3
3
|
const RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\0${GTKX_CONFIG_VIRTUAL_ID}`;
|
|
4
|
-
const METADATA_SPECIFIER = "@gtkx/jsx/metadata";
|
|
5
4
|
const renderConfigModule = (config) => {
|
|
6
5
|
const lazyJson = JSON.stringify(Object.fromEntries(config.lazyElements.map((type) => [type, { isLazy: true }])));
|
|
7
6
|
const behaviorImports = config.elements === null
|
|
@@ -12,7 +11,6 @@ const renderConfigModule = (config) => {
|
|
|
12
11
|
];
|
|
13
12
|
return [
|
|
14
13
|
...behaviorImports,
|
|
15
|
-
`export * from ${JSON.stringify(METADATA_SPECIFIER)};`,
|
|
16
14
|
`export const applicationId = ${JSON.stringify(config.applicationId)};`,
|
|
17
15
|
`export const resourceBasePath = ${JSON.stringify(resourceBasePath(config.applicationId))};`,
|
|
18
16
|
`export const userEventSignals = ${JSON.stringify(config.userEventSignals)};`,
|
package/dist/virtual.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AACrD,MAAM,+BAA+B,GAAG,KAAK,sBAAsB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AACrD,MAAM,+BAA+B,GAAG,KAAK,sBAAsB,EAAE,CAAC;AAEtE,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAU,EAAE;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjH,MAAM,eAAe,GACjB,MAAM,CAAC,QAAQ,KAAK,IAAI;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACM,6DAA6D;YAC7D,kCAAkC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;SACvE,CAAC;IAEd,OAAO;QACH,GAAG,eAAe;QAClB,gCAAgC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;QACvE,mCAAmC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG;QAC5F,mCAAmC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG;QAC7E,MAAM,CAAC,QAAQ,KAAK,IAAI;YACpB,CAAC,CAAC,2BAA2B,QAAQ,GAAG;YACxC,CAAC,CAAC,mEAAmE,QAAQ,IAAI;KACxF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC","sourcesContent":["import type { ResolvedConfig } from \"./config.ts\";\nimport { resourceBasePath } from \"./resource-base-path.ts\";\n\nconst GTKX_CONFIG_VIRTUAL_ID = \"virtual:gtkx-config\";\nconst RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\\0${GTKX_CONFIG_VIRTUAL_ID}`;\n\nconst renderConfigModule = (config: ResolvedConfig): string => {\n const lazyJson = JSON.stringify(Object.fromEntries(config.lazyElements.map((type) => [type, { isLazy: true }])));\n\n const behaviorImports =\n config.elements === null\n ? []\n : [\n \"import { mergeElementConfigs } from \\\"@gtkx/react/config\\\";\",\n `import __elementBehaviors from ${JSON.stringify(config.elements)};`,\n ];\n\n return [\n ...behaviorImports,\n `export const applicationId = ${JSON.stringify(config.applicationId)};`,\n `export const resourceBasePath = ${JSON.stringify(resourceBasePath(config.applicationId))};`,\n `export const userEventSignals = ${JSON.stringify(config.userEventSignals)};`,\n config.elements === null\n ? `export const elements = ${lazyJson};`\n : `export const elements = mergeElementConfigs(__elementBehaviors, ${lazyJson});`,\n ].join(\"\\n\");\n};\n\nexport { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigModule };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AA0BpE;;;GAGG;AACH,QAAA,MAAM,kBAAkB,GAAI,SAAS;IACjC,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,gHAAgH;IAChH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;CAChE,KAAG,MAoBH,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
package/dist/vite-plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMjD,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,IAAI,sBAAsB,GAAG,CAAC,CAAC;AAChE,MAAM,sBAAsB,GAAG,IAAI,MAAM,CAAC,IAAI,+BAA+B,GAAG,CAAC,CAAC;AAElF,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAiB,EAAE,CACnD,EAAE,KAAK,sBAAsB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC;AAE3E,MAAM,iBAAiB,GAAG,KAAK,EAC3B,EAAU,EACV,UAAwB,EACxB,KAAkB,EACS,EAAE;IAC7B,IAAI,EAAE,KAAK,+BAA+B,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,OAO3B,EAAU,EAAE;IACT,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAEnD,OAAO;QACH,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,CAAC,MAAkB;YACrB,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YAErC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,SAAS,EAAE;YACP,MAAM,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE;YAC7B,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;SAChD;QACD,IAAI,EAAE;YACF,MAAM,EAAE,EAAE,EAAE,EAAE,sBAAsB,EAAE;YACtC,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC;SACpE;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { type ConfigLoader, createConfigLoader } from \"./loader.ts\";\nimport { GTKX_CONFIG_VIRTUAL_ID, renderConfigModule, RESOLVED_GTKX_CONFIG_VIRTUAL_ID } from \"./virtual.ts\";\nimport { viteProjectRoot } from \"./vite-root.ts\";\n\ntype PluginState = {\n root: string;\n};\n\nconst VIRTUAL_ID_RE = new RegExp(`^${GTKX_CONFIG_VIRTUAL_ID}$`);\nconst RESOLVED_VIRTUAL_ID_RE = new RegExp(`^${RESOLVED_GTKX_CONFIG_VIRTUAL_ID}$`);\n\nconst resolveVirtualId = (id: string): string | null =>\n id === GTKX_CONFIG_VIRTUAL_ID ? RESOLVED_GTKX_CONFIG_VIRTUAL_ID : null;\n\nconst loadVirtualModule = async (\n id: string,\n loadConfig: ConfigLoader,\n state: PluginState,\n): Promise<string | undefined> => {\n if (id !== RESOLVED_GTKX_CONFIG_VIRTUAL_ID) {\n return undefined;\n }\n\n return renderConfigModule(await loadConfig.resolve(state.root));\n};\n\n/**\n * Creates a Vite plugin serving `virtual:gtkx-config`, the module carrying the project's resolved\n * `gtkx.config.ts`.\n */\nconst createConfigPlugin = (options: {\n /** Name the plugin is registered under in Vite. */\n name: string;\n /** Loader the configuration is resolved through, defaulting to a fresh caching loader. */\n loadConfig?: ConfigLoader;\n /** Extra Vite configuration contributed from the plugin's `config` hook, given the user's own configuration. */\n config?: (config: UserConfig) => Omit<UserConfig, \"plugins\">;\n}): Plugin => {\n const loadConfig = options.loadConfig ?? createConfigLoader();\n const state: PluginState = { root: process.cwd() };\n\n return {\n name: options.name,\n config(config: UserConfig) {\n state.root = viteProjectRoot(config);\n\n return options.config?.(config);\n },\n resolveId: {\n filter: { id: VIRTUAL_ID_RE },\n handler: (id: string) => resolveVirtualId(id),\n },\n load: {\n filter: { id: RESOLVED_VIRTUAL_ID_RE },\n handler: (id: string) => loadVirtualModule(id, loadConfig, state),\n },\n };\n};\n\nexport default createConfigPlugin;\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/config",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0-beta.11",
|
|
4
|
+
"description": "Typed application configuration for GTKX.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
7
7
|
"gtk",
|
|
@@ -58,7 +58,19 @@
|
|
|
58
58
|
"options": {
|
|
59
59
|
"cwd": ".",
|
|
60
60
|
"command": "eslint {projectRoot}"
|
|
61
|
-
}
|
|
61
|
+
},
|
|
62
|
+
"dependsOn": []
|
|
63
|
+
},
|
|
64
|
+
"build": {
|
|
65
|
+
"dependsOn": [
|
|
66
|
+
"^build"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"typecheck": {
|
|
70
|
+
"dependsOn": [
|
|
71
|
+
"build",
|
|
72
|
+
"^typecheck"
|
|
73
|
+
]
|
|
62
74
|
}
|
|
63
75
|
}
|
|
64
76
|
},
|
|
@@ -66,12 +78,14 @@
|
|
|
66
78
|
"node": ">=26.7.0"
|
|
67
79
|
},
|
|
68
80
|
"dependencies": {
|
|
69
|
-
"@
|
|
81
|
+
"@babel/core": "^8.0.6",
|
|
82
|
+
"@gtkx/utils": "2.0.0-beta.11",
|
|
70
83
|
"c12": "^3.3.4",
|
|
84
|
+
"confbox": "^0.3.1",
|
|
71
85
|
"defu": "^6.1.7",
|
|
72
86
|
"jiti": "^2.7.0",
|
|
73
|
-
"vite": "^8.
|
|
74
|
-
"zod": "^4.5
|
|
87
|
+
"vite": "^8.3.0",
|
|
88
|
+
"zod": "^4.6.5"
|
|
75
89
|
},
|
|
76
90
|
"scripts": {
|
|
77
91
|
"release": "tsx ../../scripts/release-package.ts"
|
|
@@ -26,7 +26,9 @@ const addUrl = (url: string): void => {
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
const cacheBustedUrl = (url: string): string => {
|
|
29
|
-
|
|
29
|
+
const state = captureStorage.getStore();
|
|
30
|
+
|
|
31
|
+
if (state === undefined || !url.startsWith("file:")) {
|
|
30
32
|
return url;
|
|
31
33
|
}
|
|
32
34
|
|
|
@@ -37,7 +39,7 @@ const cacheBustedUrl = (url: string): string => {
|
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
const parsed = new URL(url);
|
|
40
|
-
parsed.searchParams.set("gtkx-config-load",
|
|
42
|
+
parsed.searchParams.set("gtkx-config-load", state.cacheKey);
|
|
41
43
|
|
|
42
44
|
return parsed.href;
|
|
43
45
|
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { relative, resolve } from "node:path";
|
|
2
|
+
import { configDependenciesFor } from "./config-dependencies.ts";
|
|
3
|
+
import { loadConfig, type LoadConfigOptions, type LoadedConfig } from "./loader.ts";
|
|
4
|
+
import { resolveConfigDependencies } from "./static-dependencies.ts";
|
|
5
|
+
|
|
6
|
+
type ConfigReloader = {
|
|
7
|
+
reload: () => Promise<LoadedConfig>;
|
|
8
|
+
resolvePaths: () => string[];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const createConfigReloader = async (
|
|
12
|
+
cwd: string,
|
|
13
|
+
options: LoadConfigOptions = {},
|
|
14
|
+
initialDependencies: string[] = [],
|
|
15
|
+
): Promise<ConfigReloader> => {
|
|
16
|
+
let selectedConfigFile: string;
|
|
17
|
+
let knownDependencies = initialDependencies;
|
|
18
|
+
|
|
19
|
+
if (options.configFile === undefined) {
|
|
20
|
+
const loaded = await loadConfig(cwd, options);
|
|
21
|
+
selectedConfigFile = loaded.configFile;
|
|
22
|
+
knownDependencies = [...knownDependencies, ...configDependenciesFor(loaded)];
|
|
23
|
+
} else {
|
|
24
|
+
selectedConfigFile = resolve(cwd, options.configFile);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const selectedConfigName = relative(cwd, selectedConfigFile);
|
|
28
|
+
const resolvePaths = (): string[] => [
|
|
29
|
+
...new Set(
|
|
30
|
+
[selectedConfigFile, ...knownDependencies]
|
|
31
|
+
.flatMap((path) => resolveConfigDependencies(path, selectedConfigName, cwd)),
|
|
32
|
+
),
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
resolvePaths,
|
|
37
|
+
reload: async () => {
|
|
38
|
+
let loaded: LoadedConfig;
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
loaded = await loadConfig(cwd, { ...options, configFile: selectedConfigFile });
|
|
42
|
+
} catch (error) {
|
|
43
|
+
knownDependencies = [...new Set([...knownDependencies, ...configDependenciesFor(error)])];
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
knownDependencies = configDependenciesFor(loaded);
|
|
48
|
+
|
|
49
|
+
return loaded;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export { createConfigReloader };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { basename, extname, isAbsolute, resolve } from "node:path";
|
|
2
|
+
|
|
3
|
+
type ConfigResolutionOptions = { configFile?: string | undefined; cwd?: string | undefined };
|
|
4
|
+
|
|
5
|
+
const isLocalConfigSource = (source: string): boolean => source.startsWith(".") || isAbsolute(source);
|
|
6
|
+
|
|
7
|
+
const isDirectoryConfigSource = (source: string): boolean => {
|
|
8
|
+
const extension = extname(source);
|
|
9
|
+
|
|
10
|
+
return extension.length === 0 || extension === basename(source);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const localConfigSourcePath = (source: string, options: ConfigResolutionOptions): string | undefined => {
|
|
14
|
+
if (source === "." || !isLocalConfigSource(source)) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const cwd = options.cwd ?? process.cwd();
|
|
19
|
+
|
|
20
|
+
return isDirectoryConfigSource(source)
|
|
21
|
+
? resolve(cwd, source, options.configFile ?? "gtkx.config")
|
|
22
|
+
: resolve(cwd, source);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { localConfigSourcePath, type ConfigResolutionOptions };
|