@generaltranslation/vue-extractor 0.0.0 → 0.1.0-iris.1
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/LICENSE.md +18 -102
- package/dist/detect.d.ts +8 -0
- package/dist/detect.js +2 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/inspect.d.ts +9 -0
- package/dist/inspect.js +2 -0
- package/dist/integration.d.ts +69 -0
- package/dist/integration.js +162 -0
- package/dist/integration.js.map +1 -0
- package/dist/internal/config/configFiles.d.ts +6 -0
- package/dist/internal/config/configFiles.js +34 -0
- package/dist/internal/config/configFiles.js.map +1 -0
- package/dist/internal/config/resolveVueCompilerOptions.d.ts +6 -0
- package/dist/internal/config/resolveVueCompilerOptions.js +74 -56
- package/dist/internal/config/resolveVueCompilerOptions.js.map +1 -1
- package/dist/internal/extractFromVueSource.d.ts +4 -3
- package/dist/internal/extractFromVueSource.js +255 -12
- package/dist/internal/extractFromVueSource.js.map +1 -1
- package/dist/internal/project/consumerUsage.d.ts +34 -0
- package/dist/internal/project/consumerUsage.js +1220 -0
- package/dist/internal/project/consumerUsage.js.map +1 -0
- package/dist/internal/project/detectVueProject.d.ts +13 -0
- package/dist/internal/project/detectVueProject.js +65 -0
- package/dist/internal/project/detectVueProject.js.map +1 -0
- package/dist/internal/project/extractFromVueProject.d.ts +10 -0
- package/dist/internal/project/extractFromVueProject.js +579 -0
- package/dist/internal/project/extractFromVueProject.js.map +1 -0
- package/dist/internal/project/inspectVueProject.d.ts +48 -0
- package/dist/internal/project/inspectVueProject.js +143 -0
- package/dist/internal/project/inspectVueProject.js.map +1 -0
- package/dist/internal/project/manifest.d.ts +64 -0
- package/dist/internal/project/manifest.js +270 -0
- package/dist/internal/project/manifest.js.map +1 -0
- package/dist/internal/project/mergeVueProjectExtraction.d.ts +18 -0
- package/dist/internal/project/mergeVueProjectExtraction.js +79 -0
- package/dist/internal/project/mergeVueProjectExtraction.js.map +1 -0
- package/dist/internal/project/moduleResolver.d.ts +18 -0
- package/dist/internal/project/moduleResolver.js +325 -0
- package/dist/internal/project/moduleResolver.js.map +1 -0
- package/dist/internal/project/scopes.d.ts +31 -0
- package/dist/internal/project/scopes.js +182 -0
- package/dist/internal/project/scopes.js.map +1 -0
- package/dist/internal/project/sourcePatterns.d.ts +4 -0
- package/dist/internal/project/sourcePatterns.js +32 -0
- package/dist/internal/project/sourcePatterns.js.map +1 -0
- package/dist/internal/project/viteAliases.d.ts +42 -0
- package/dist/internal/project/viteAliases.js +1020 -0
- package/dist/internal/project/viteAliases.js.map +1 -0
- package/dist/internal/project/vueSourceClassification.d.ts +13 -0
- package/dist/internal/project/vueSourceClassification.js +146 -0
- package/dist/internal/project/vueSourceClassification.js.map +1 -0
- package/dist/internal/project/workspaces.d.ts +31 -0
- package/dist/internal/project/workspaces.js +326 -0
- package/dist/internal/project/workspaces.js.map +1 -0
- package/dist/internal/project/wrapperProvenance.d.ts +21 -0
- package/dist/internal/project/wrapperProvenance.js +287 -0
- package/dist/internal/project/wrapperProvenance.js.map +1 -0
- package/dist/internal/script/analyze.js +323 -108
- package/dist/internal/script/analyze.js.map +1 -1
- package/dist/internal/script/jsx.d.ts +7 -4
- package/dist/internal/script/jsx.js +351 -79
- package/dist/internal/script/jsx.js.map +1 -1
- package/dist/internal/script/knownValues.js +4 -0
- package/dist/internal/script/knownValues.js.map +1 -1
- package/dist/internal/script/localModules.d.ts +23 -2
- package/dist/internal/script/localModules.js +535 -20
- package/dist/internal/script/localModules.js.map +1 -1
- package/dist/internal/script/model.d.ts +10 -3
- package/dist/internal/script/parser.js +2 -1
- package/dist/internal/script/parser.js.map +1 -1
- package/dist/internal/script/runtimeModules.d.ts +10 -0
- package/dist/internal/script/runtimeModules.js +27 -0
- package/dist/internal/script/runtimeModules.js.map +1 -0
- package/dist/internal/stringCalls.js +9 -3
- package/dist/internal/stringCalls.js.map +1 -1
- package/dist/internal/template.js +263 -141
- package/dist/internal/template.js.map +1 -1
- package/dist/internal/types.d.ts +5 -2
- package/dist/internal/utils.d.ts +14 -3
- package/dist/internal/utils.js +63 -3
- package/dist/internal/utils.js.map +1 -1
- package/dist/internal/vueCompiler.d.ts +9 -1
- package/dist/internal/vueCompiler.js +37 -14
- package/dist/internal/vueCompiler.js.map +1 -1
- package/dist/project.d.ts +11 -0
- package/dist/project.js +3 -0
- package/dist/types.d.ts +95 -4
- package/package.json +30 -4
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { satisfies, valid, validRange } from "semver";
|
|
5
|
+
//#region src/internal/project/manifest.ts
|
|
6
|
+
/** Runtime package whose direct ownership activates Vue extraction. */
|
|
7
|
+
const GT_VUE_PACKAGE = "gt-vue";
|
|
8
|
+
/** Dependency fields that declare a runtime installed for one package. */
|
|
9
|
+
const INSTALLED_DEPENDENCY_FIELDS = ["dependencies", "devDependencies"];
|
|
10
|
+
/** Reads one package manifest without throwing for absent or malformed input. */
|
|
11
|
+
function readJavaScriptPackageManifest(packagePath) {
|
|
12
|
+
try {
|
|
13
|
+
const parsed = JSON.parse(fs.readFileSync(packagePath, "utf8"));
|
|
14
|
+
return isRecord(parsed) ? parsed : void 0;
|
|
15
|
+
} catch {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Checks dependency fields that make a runtime available to package code. */
|
|
20
|
+
function declaresInstalledJavaScriptDependency(manifest, packageName) {
|
|
21
|
+
return INSTALLED_DEPENDENCY_FIELDS.some((field) => readEffectiveDependencySpecifier(manifest, field, packageName) !== void 0);
|
|
22
|
+
}
|
|
23
|
+
/** Checks direct ownership, requiring optional and peer runtimes to resolve. */
|
|
24
|
+
function declaresAvailableJavaScriptDependency(manifest, packageName, packageDirectory) {
|
|
25
|
+
if (readEffectiveDependencySpecifier(manifest, "devDependencies", packageName) !== void 0) return true;
|
|
26
|
+
const optionalSpecifier = readDependencySpecifier(manifest, "optionalDependencies", packageName);
|
|
27
|
+
if (optionalSpecifier !== void 0) return canResolveDependencyBinding(packageDirectory, {
|
|
28
|
+
name: packageName,
|
|
29
|
+
specifier: optionalSpecifier
|
|
30
|
+
});
|
|
31
|
+
if (readEffectiveDependencySpecifier(manifest, "dependencies", packageName) !== void 0) return true;
|
|
32
|
+
return declaresAvailableRequiredPeerDependency(manifest, packageName, packageDirectory);
|
|
33
|
+
}
|
|
34
|
+
/** Checks package ownership without promoting optional workspace integrations. */
|
|
35
|
+
function declaresWorkspaceJavaScriptDependency(manifest, packageName, packageDirectory) {
|
|
36
|
+
return declaresInstalledJavaScriptDependency(manifest, packageName) || declaresAvailableRequiredPeerDependency(manifest, packageName, packageDirectory);
|
|
37
|
+
}
|
|
38
|
+
/** Lists required dependencies that can bind one workspace package to another. */
|
|
39
|
+
function readWorkspaceDependencyNames(manifest, packageDirectory) {
|
|
40
|
+
const names = /* @__PURE__ */ new Set();
|
|
41
|
+
for (const binding of readWorkspaceDependencyBindings(manifest, packageDirectory)) {
|
|
42
|
+
names.add(binding.name);
|
|
43
|
+
const workspaceAlias = parseWorkspaceDependencyAlias(binding.specifier);
|
|
44
|
+
if (workspaceAlias) names.add(workspaceAlias.packageName);
|
|
45
|
+
const npmAlias = parseNpmDependencyAlias(binding.specifier);
|
|
46
|
+
if (npmAlias) names.add(npmAlias.packageName);
|
|
47
|
+
if (binding.specifier.startsWith("catalog:")) {
|
|
48
|
+
const installed = resolveInstalledJavaScriptPackage(packageDirectory, binding.name);
|
|
49
|
+
if (typeof installed?.manifest.name === "string") names.add(installed.manifest.name);
|
|
50
|
+
}
|
|
51
|
+
const localPackageName = readLocalDependencyPackageName(binding.specifier, packageDirectory);
|
|
52
|
+
if (localPackageName) names.add(localPackageName);
|
|
53
|
+
}
|
|
54
|
+
return [...names];
|
|
55
|
+
}
|
|
56
|
+
/** Reads installed dependencies and resolvable, non-optional required peers. */
|
|
57
|
+
function readWorkspaceDependencyBindings(manifest, packageDirectory) {
|
|
58
|
+
return readDependencyBindings(manifest, packageDirectory, INSTALLED_DEPENDENCY_FIELDS);
|
|
59
|
+
}
|
|
60
|
+
/** Reads dependency edges that may propagate wrapper ownership to consumers. */
|
|
61
|
+
function readPropagatingDependencyBindings(manifest, packageDirectory) {
|
|
62
|
+
return readDependencyBindings(manifest, packageDirectory, ["dependencies"]);
|
|
63
|
+
}
|
|
64
|
+
function readDependencyBindings(manifest, packageDirectory, fields) {
|
|
65
|
+
const bindings = [];
|
|
66
|
+
const seenBindings = /* @__PURE__ */ new Set();
|
|
67
|
+
const addBinding = (name, specifier) => {
|
|
68
|
+
const key = `${name}\0${specifier}`;
|
|
69
|
+
if (seenBindings.has(key)) return;
|
|
70
|
+
seenBindings.add(key);
|
|
71
|
+
bindings.push({
|
|
72
|
+
name,
|
|
73
|
+
specifier
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
for (const field of fields) for (const name of Object.keys(manifest[field] ?? {})) {
|
|
77
|
+
const specifier = readEffectiveDependencySpecifier(manifest, field, name);
|
|
78
|
+
if (specifier !== void 0) addBinding(name, specifier);
|
|
79
|
+
}
|
|
80
|
+
for (const [name, specifier] of Object.entries(manifest.peerDependencies ?? {})) if (typeof specifier === "string" && declaresAvailableRequiredPeerDependency(manifest, name, packageDirectory)) addBinding(name, specifier);
|
|
81
|
+
return bindings;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Resolves an installed package directory without selecting an export branch.
|
|
85
|
+
*
|
|
86
|
+
* `require.resolve()` is insufficient for availability checks because a valid
|
|
87
|
+
* ESM package may intentionally expose only its `import` condition. Walking
|
|
88
|
+
* Node's lookup directories finds the package boundary without importing user
|
|
89
|
+
* code or depending on the package's public subpath exports.
|
|
90
|
+
*/
|
|
91
|
+
function resolveInstalledJavaScriptPackage(directory, bindingName) {
|
|
92
|
+
const packageSegments = readPackageNameSegments(bindingName);
|
|
93
|
+
if (!packageSegments) return void 0;
|
|
94
|
+
try {
|
|
95
|
+
const localRequire = createRequire(path.join(path.resolve(directory), "package.json"));
|
|
96
|
+
for (const modulesDirectory of localRequire.resolve.paths(bindingName) ?? []) {
|
|
97
|
+
const candidate = path.join(modulesDirectory, ...packageSegments);
|
|
98
|
+
let packageDirectory;
|
|
99
|
+
try {
|
|
100
|
+
packageDirectory = fs.realpathSync(candidate);
|
|
101
|
+
} catch {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const manifest = readJavaScriptPackageManifest(path.join(packageDirectory, "package.json"));
|
|
105
|
+
if (!manifest) return void 0;
|
|
106
|
+
return {
|
|
107
|
+
directory: packageDirectory,
|
|
108
|
+
manifest
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
return findPackageBoundary(localRequire.resolve(bindingName));
|
|
113
|
+
} catch {}
|
|
114
|
+
const pnpLocation = resolvePnpPackageLocation(localRequire, bindingName, path.join(path.resolve(directory), "package.json"));
|
|
115
|
+
if (pnpLocation) return readPackageAtLocation(pnpLocation);
|
|
116
|
+
} catch {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Resolves a package location through Yarn Plug'n'Play when it is active. */
|
|
121
|
+
function resolvePnpPackageLocation(localRequire, bindingName, issuer) {
|
|
122
|
+
if (process.versions.pnp === void 0) return void 0;
|
|
123
|
+
try {
|
|
124
|
+
const location = localRequire("pnpapi").resolveToUnqualified?.(bindingName, issuer);
|
|
125
|
+
return typeof location === "string" ? location : void 0;
|
|
126
|
+
} catch {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Reads a package whose resolver may return either its root or an entrypoint. */
|
|
131
|
+
function readPackageAtLocation(location) {
|
|
132
|
+
try {
|
|
133
|
+
if (fs.statSync(location).isDirectory()) {
|
|
134
|
+
const packageDirectory = fs.realpathSync(location);
|
|
135
|
+
const manifest = readJavaScriptPackageManifest(path.join(packageDirectory, "package.json"));
|
|
136
|
+
return manifest ? {
|
|
137
|
+
directory: packageDirectory,
|
|
138
|
+
manifest
|
|
139
|
+
} : void 0;
|
|
140
|
+
}
|
|
141
|
+
} catch {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
let packageDirectory;
|
|
145
|
+
try {
|
|
146
|
+
packageDirectory = fs.realpathSync(location);
|
|
147
|
+
} catch {
|
|
148
|
+
packageDirectory = path.resolve(location);
|
|
149
|
+
}
|
|
150
|
+
const manifest = readJavaScriptPackageManifest(path.join(packageDirectory, "package.json"));
|
|
151
|
+
return manifest ? {
|
|
152
|
+
directory: packageDirectory,
|
|
153
|
+
manifest
|
|
154
|
+
} : findPackageBoundary(location);
|
|
155
|
+
}
|
|
156
|
+
function findPackageBoundary(entry) {
|
|
157
|
+
if (!path.isAbsolute(entry)) return void 0;
|
|
158
|
+
let directory = path.dirname(entry);
|
|
159
|
+
while (true) {
|
|
160
|
+
const manifest = readJavaScriptPackageManifest(path.join(directory, "package.json"));
|
|
161
|
+
if (manifest) return {
|
|
162
|
+
directory,
|
|
163
|
+
manifest
|
|
164
|
+
};
|
|
165
|
+
const parent = path.dirname(directory);
|
|
166
|
+
if (parent === directory) return void 0;
|
|
167
|
+
directory = parent;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Parses pnpm's explicit `workspace:alias@range` dependency syntax. */
|
|
171
|
+
function parseWorkspaceDependencyAlias(specifier) {
|
|
172
|
+
if (!specifier.startsWith("workspace:")) return void 0;
|
|
173
|
+
const value = specifier.slice(10);
|
|
174
|
+
const separator = value.lastIndexOf("@");
|
|
175
|
+
if (separator <= 0) return void 0;
|
|
176
|
+
const packageName = value.slice(0, separator);
|
|
177
|
+
const range = value.slice(separator + 1);
|
|
178
|
+
if (!range || !readPackageNameSegments(packageName)) return void 0;
|
|
179
|
+
return {
|
|
180
|
+
packageName,
|
|
181
|
+
range
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/** Reads the target package name from an npm alias dependency. */
|
|
185
|
+
function parseNpmDependencyAlias(specifier) {
|
|
186
|
+
if (!specifier.startsWith("npm:")) return void 0;
|
|
187
|
+
const value = specifier.slice(4);
|
|
188
|
+
const separator = value.lastIndexOf("@");
|
|
189
|
+
const packageName = separator > 0 ? value.slice(0, separator) : value;
|
|
190
|
+
if (!readPackageNameSegments(packageName)) return void 0;
|
|
191
|
+
return {
|
|
192
|
+
packageName,
|
|
193
|
+
range: separator > 0 ? value.slice(separator + 1) : void 0
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/** Reads a relative directory selected by an explicit local protocol. */
|
|
197
|
+
function parseLocalDependencyPath(specifier) {
|
|
198
|
+
const localPath = specifier.match(/^(?:file|link|portal):(.+)$/)?.[1];
|
|
199
|
+
if (localPath) return localPath;
|
|
200
|
+
return specifier.match(/^workspace:(\.{1,2}(?:\/.*)?)$/)?.[1];
|
|
201
|
+
}
|
|
202
|
+
/** Checks whether one binding's declared range accepts a selected package. */
|
|
203
|
+
function dependencyBindingAcceptsPackageVersion(binding, packageName, packageVersion) {
|
|
204
|
+
if (parseLocalDependencyPath(binding.specifier)) return true;
|
|
205
|
+
const workspaceAlias = parseWorkspaceDependencyAlias(binding.specifier);
|
|
206
|
+
if (workspaceAlias) return workspaceAlias.packageName === packageName && workspaceRangeAcceptsVersion(workspaceAlias.range, packageVersion);
|
|
207
|
+
const npmAlias = parseNpmDependencyAlias(binding.specifier);
|
|
208
|
+
if (npmAlias) return npmAlias.packageName === packageName && (npmAlias.range === void 0 || semverRangeAcceptsVersion(npmAlias.range, packageVersion, true));
|
|
209
|
+
if (binding.specifier.startsWith("catalog:")) return true;
|
|
210
|
+
if (binding.name !== packageName) return false;
|
|
211
|
+
if (binding.specifier.startsWith("workspace:")) return workspaceRangeAcceptsVersion(binding.specifier.slice(10), packageVersion);
|
|
212
|
+
return semverRangeAcceptsVersion(binding.specifier, packageVersion, true);
|
|
213
|
+
}
|
|
214
|
+
function canResolveDependencyBinding(directory, binding) {
|
|
215
|
+
const installed = resolveInstalledJavaScriptPackage(directory, binding.name);
|
|
216
|
+
const installedName = installed?.manifest.name;
|
|
217
|
+
if (!installed || typeof installedName !== "string") return false;
|
|
218
|
+
return installedName === (binding.specifier.startsWith("catalog:") ? installedName : parseWorkspaceDependencyAlias(binding.specifier)?.packageName ?? parseNpmDependencyAlias(binding.specifier)?.packageName ?? readLocalDependencyPackageName(binding.specifier, directory) ?? binding.name) && dependencyBindingAcceptsPackageVersion(binding, installedName, installed.manifest.version);
|
|
219
|
+
}
|
|
220
|
+
function declaresAvailableRequiredPeerDependency(manifest, packageName, packageDirectory) {
|
|
221
|
+
const specifier = manifest.peerDependencies?.[packageName];
|
|
222
|
+
if (typeof specifier !== "string" || manifest.peerDependenciesMeta?.[packageName]?.optional === true) return false;
|
|
223
|
+
return canResolveDependencyBinding(packageDirectory, {
|
|
224
|
+
name: packageName,
|
|
225
|
+
specifier
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function readDependencySpecifier(manifest, field, packageName) {
|
|
229
|
+
const specifier = manifest[field]?.[packageName];
|
|
230
|
+
return typeof specifier === "string" ? specifier : void 0;
|
|
231
|
+
}
|
|
232
|
+
/** Applies npm's rule that an optional dependency replaces the same dependency. */
|
|
233
|
+
function readEffectiveDependencySpecifier(manifest, field, packageName) {
|
|
234
|
+
if (field === "dependencies" && manifest.optionalDependencies !== void 0 && Object.prototype.hasOwnProperty.call(manifest.optionalDependencies, packageName)) return;
|
|
235
|
+
return readDependencySpecifier(manifest, field, packageName);
|
|
236
|
+
}
|
|
237
|
+
function readPackageNameSegments(packageName) {
|
|
238
|
+
if (!packageName || packageName.includes("\\")) return void 0;
|
|
239
|
+
const segments = packageName.split("/");
|
|
240
|
+
const isScoped = packageName.startsWith("@");
|
|
241
|
+
if (isScoped && segments.length !== 2 || !isScoped && segments.length !== 1) return;
|
|
242
|
+
return segments.every((segment) => segment && segment !== "." && segment !== "..") ? segments : void 0;
|
|
243
|
+
}
|
|
244
|
+
function readLocalDependencyPackageName(specifier, packageDirectory) {
|
|
245
|
+
const localPath = parseLocalDependencyPath(specifier);
|
|
246
|
+
if (!localPath) return void 0;
|
|
247
|
+
const packageName = readJavaScriptPackageManifest(path.join(path.resolve(packageDirectory, localPath), "package.json"))?.name;
|
|
248
|
+
return typeof packageName === "string" && packageName ? packageName : void 0;
|
|
249
|
+
}
|
|
250
|
+
function workspaceRangeAcceptsVersion(range, version) {
|
|
251
|
+
return range === "" || range === "*" || range === "^" || range === "~" || semverRangeAcceptsVersion(range, version, true);
|
|
252
|
+
}
|
|
253
|
+
function semverRangeAcceptsVersion(range, version, acceptOpaqueRange = false) {
|
|
254
|
+
const validRange$1 = validRange(range);
|
|
255
|
+
if (!validRange$1) return acceptOpaqueRange;
|
|
256
|
+
if (!version) return false;
|
|
257
|
+
try {
|
|
258
|
+
const validVersion = valid(version);
|
|
259
|
+
return Boolean(validVersion && satisfies(validVersion, validRange$1));
|
|
260
|
+
} catch {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function isRecord(value) {
|
|
265
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
266
|
+
}
|
|
267
|
+
//#endregion
|
|
268
|
+
export { GT_VUE_PACKAGE, declaresAvailableJavaScriptDependency, declaresInstalledJavaScriptDependency, declaresWorkspaceJavaScriptDependency, dependencyBindingAcceptsPackageVersion, parseLocalDependencyPath, parseNpmDependencyAlias, parseWorkspaceDependencyAlias, readJavaScriptPackageManifest, readPropagatingDependencyBindings, readWorkspaceDependencyBindings, readWorkspaceDependencyNames, resolveInstalledJavaScriptPackage };
|
|
269
|
+
|
|
270
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","names":["validRange","validSemverRange","validSemver","satisfiesSemver"],"sources":["../../../src/internal/project/manifest.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport {\n satisfies as satisfiesSemver,\n valid as validSemver,\n validRange as validSemverRange,\n} from 'semver';\n\n/** Runtime package whose direct ownership activates Vue extraction. */\nexport const GT_VUE_PACKAGE = 'gt-vue';\n\n/** Dependency fields that declare a runtime installed for one package. */\nconst INSTALLED_DEPENDENCY_FIELDS = [\n 'dependencies',\n 'devDependencies',\n] as const;\n\n/** Minimal package manifest shape used by Vue project discovery. */\nexport type JavaScriptPackageManifest = {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n workspaces?: string[] | { packages?: string[] };\n};\n\n/** One dependency name and specifier as written by a consuming package. */\nexport type JavaScriptDependencyBinding = {\n name: string;\n specifier: string;\n};\n\n/** An installed package directory resolved without evaluating its entrypoint. */\nexport type InstalledJavaScriptPackage = {\n directory: string;\n manifest: JavaScriptPackageManifest;\n};\n\n/** Reads one package manifest without throwing for absent or malformed input. */\nexport function readJavaScriptPackageManifest(\n packagePath: string\n): JavaScriptPackageManifest | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(packagePath, 'utf8')) as unknown;\n return isRecord(parsed) ? (parsed as JavaScriptPackageManifest) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Checks dependency fields that make a runtime available to package code. */\nexport function declaresInstalledJavaScriptDependency(\n manifest: JavaScriptPackageManifest,\n packageName: string\n): boolean {\n return INSTALLED_DEPENDENCY_FIELDS.some(\n (field) =>\n readEffectiveDependencySpecifier(manifest, field, packageName) !==\n undefined\n );\n}\n\n/** Checks direct ownership, requiring optional and peer runtimes to resolve. */\nexport function declaresAvailableJavaScriptDependency(\n manifest: JavaScriptPackageManifest,\n packageName: string,\n packageDirectory: string\n): boolean {\n if (\n readEffectiveDependencySpecifier(\n manifest,\n 'devDependencies',\n packageName\n ) !== undefined\n ) {\n return true;\n }\n const optionalSpecifier = readDependencySpecifier(\n manifest,\n 'optionalDependencies',\n packageName\n );\n if (optionalSpecifier !== undefined) {\n return canResolveDependencyBinding(packageDirectory, {\n name: packageName,\n specifier: optionalSpecifier,\n });\n }\n if (\n readEffectiveDependencySpecifier(manifest, 'dependencies', packageName) !==\n undefined\n ) {\n return true;\n }\n return declaresAvailableRequiredPeerDependency(\n manifest,\n packageName,\n packageDirectory\n );\n}\n\n/** Checks package ownership without promoting optional workspace integrations. */\nexport function declaresWorkspaceJavaScriptDependency(\n manifest: JavaScriptPackageManifest,\n packageName: string,\n packageDirectory: string\n): boolean {\n return (\n declaresInstalledJavaScriptDependency(manifest, packageName) ||\n declaresAvailableRequiredPeerDependency(\n manifest,\n packageName,\n packageDirectory\n )\n );\n}\n\n/** Lists required dependencies that can bind one workspace package to another. */\nexport function readWorkspaceDependencyNames(\n manifest: JavaScriptPackageManifest,\n packageDirectory: string\n): string[] {\n const names = new Set<string>();\n for (const binding of readWorkspaceDependencyBindings(\n manifest,\n packageDirectory\n )) {\n names.add(binding.name);\n const workspaceAlias = parseWorkspaceDependencyAlias(binding.specifier);\n if (workspaceAlias) names.add(workspaceAlias.packageName);\n const npmAlias = parseNpmDependencyAlias(binding.specifier);\n if (npmAlias) names.add(npmAlias.packageName);\n if (binding.specifier.startsWith('catalog:')) {\n const installed = resolveInstalledJavaScriptPackage(\n packageDirectory,\n binding.name\n );\n if (typeof installed?.manifest.name === 'string') {\n names.add(installed.manifest.name);\n }\n }\n const localPackageName = readLocalDependencyPackageName(\n binding.specifier,\n packageDirectory\n );\n if (localPackageName) names.add(localPackageName);\n }\n return [...names];\n}\n\n/** Reads installed dependencies and resolvable, non-optional required peers. */\nexport function readWorkspaceDependencyBindings(\n manifest: JavaScriptPackageManifest,\n packageDirectory: string\n): JavaScriptDependencyBinding[] {\n return readDependencyBindings(\n manifest,\n packageDirectory,\n INSTALLED_DEPENDENCY_FIELDS\n );\n}\n\n/** Reads dependency edges that may propagate wrapper ownership to consumers. */\nexport function readPropagatingDependencyBindings(\n manifest: JavaScriptPackageManifest,\n packageDirectory: string\n): JavaScriptDependencyBinding[] {\n return readDependencyBindings(manifest, packageDirectory, ['dependencies']);\n}\n\nfunction readDependencyBindings(\n manifest: JavaScriptPackageManifest,\n packageDirectory: string,\n fields: readonly (typeof INSTALLED_DEPENDENCY_FIELDS)[number][]\n): JavaScriptDependencyBinding[] {\n const bindings: JavaScriptDependencyBinding[] = [];\n const seenBindings = new Set<string>();\n const addBinding = (name: string, specifier: string) => {\n const key = `${name}\\0${specifier}`;\n if (seenBindings.has(key)) return;\n seenBindings.add(key);\n bindings.push({ name, specifier });\n };\n for (const field of fields) {\n for (const name of Object.keys(manifest[field] ?? {})) {\n const specifier = readEffectiveDependencySpecifier(manifest, field, name);\n if (specifier !== undefined) addBinding(name, specifier);\n }\n }\n for (const [name, specifier] of Object.entries(\n manifest.peerDependencies ?? {}\n )) {\n if (\n typeof specifier === 'string' &&\n declaresAvailableRequiredPeerDependency(manifest, name, packageDirectory)\n ) {\n addBinding(name, specifier);\n }\n }\n return bindings;\n}\n\n/**\n * Resolves an installed package directory without selecting an export branch.\n *\n * `require.resolve()` is insufficient for availability checks because a valid\n * ESM package may intentionally expose only its `import` condition. Walking\n * Node's lookup directories finds the package boundary without importing user\n * code or depending on the package's public subpath exports.\n */\nexport function resolveInstalledJavaScriptPackage(\n directory: string,\n bindingName: string\n): InstalledJavaScriptPackage | undefined {\n const packageSegments = readPackageNameSegments(bindingName);\n if (!packageSegments) return undefined;\n\n try {\n const localRequire = createRequire(\n path.join(path.resolve(directory), 'package.json')\n );\n for (const modulesDirectory of localRequire.resolve.paths(bindingName) ??\n []) {\n const candidate = path.join(modulesDirectory, ...packageSegments);\n let packageDirectory: string;\n try {\n packageDirectory = fs.realpathSync(candidate);\n } catch {\n continue;\n }\n const manifest = readJavaScriptPackageManifest(\n path.join(packageDirectory, 'package.json')\n );\n if (!manifest) return undefined;\n return { directory: packageDirectory, manifest };\n }\n try {\n const resolvedEntry = localRequire.resolve(bindingName);\n return findPackageBoundary(resolvedEntry);\n } catch {\n // ESM-only packages can omit a `require` export.\n }\n const pnpLocation = resolvePnpPackageLocation(\n localRequire,\n bindingName,\n path.join(path.resolve(directory), 'package.json')\n );\n if (pnpLocation) return readPackageAtLocation(pnpLocation);\n } catch {\n return undefined;\n }\n return undefined;\n}\n\n/** Resolves a package location through Yarn Plug'n'Play when it is active. */\nfunction resolvePnpPackageLocation(\n localRequire: ReturnType<typeof createRequire>,\n bindingName: string,\n issuer: string\n): string | undefined {\n if (process.versions.pnp === undefined) return undefined;\n try {\n const pnpApi = localRequire('pnpapi') as {\n resolveToUnqualified?: (request: string, issuer: string) => string | null;\n };\n const location = pnpApi.resolveToUnqualified?.(bindingName, issuer);\n return typeof location === 'string' ? location : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Reads a package whose resolver may return either its root or an entrypoint. */\nfunction readPackageAtLocation(\n location: string\n): InstalledJavaScriptPackage | undefined {\n try {\n if (fs.statSync(location).isDirectory()) {\n const packageDirectory = fs.realpathSync(location);\n const manifest = readJavaScriptPackageManifest(\n path.join(packageDirectory, 'package.json')\n );\n return manifest ? { directory: packageDirectory, manifest } : undefined;\n }\n } catch {\n return undefined;\n }\n\n let packageDirectory: string;\n try {\n packageDirectory = fs.realpathSync(location);\n } catch {\n packageDirectory = path.resolve(location);\n }\n const manifest = readJavaScriptPackageManifest(\n path.join(packageDirectory, 'package.json')\n );\n return manifest\n ? { directory: packageDirectory, manifest }\n : findPackageBoundary(location);\n}\n\nfunction findPackageBoundary(\n entry: string\n): InstalledJavaScriptPackage | undefined {\n if (!path.isAbsolute(entry)) return undefined;\n let directory = path.dirname(entry);\n while (true) {\n const manifest = readJavaScriptPackageManifest(\n path.join(directory, 'package.json')\n );\n if (manifest) return { directory, manifest };\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\n/** Parses pnpm's explicit `workspace:alias@range` dependency syntax. */\nexport function parseWorkspaceDependencyAlias(\n specifier: string\n): { packageName: string; range: string } | undefined {\n if (!specifier.startsWith('workspace:')) return undefined;\n const value = specifier.slice('workspace:'.length);\n const separator = value.lastIndexOf('@');\n if (separator <= 0) return undefined;\n const packageName = value.slice(0, separator);\n const range = value.slice(separator + 1);\n if (!range || !readPackageNameSegments(packageName)) return undefined;\n return { packageName, range };\n}\n\n/** Reads the target package name from an npm alias dependency. */\nexport function parseNpmDependencyAlias(\n specifier: string\n): { packageName: string; range?: string } | undefined {\n if (!specifier.startsWith('npm:')) return undefined;\n const value = specifier.slice('npm:'.length);\n const separator = value.lastIndexOf('@');\n const packageName = separator > 0 ? value.slice(0, separator) : value;\n if (!readPackageNameSegments(packageName)) return undefined;\n return {\n packageName,\n range: separator > 0 ? value.slice(separator + 1) : undefined,\n };\n}\n\n/** Reads a relative directory selected by an explicit local protocol. */\nexport function parseLocalDependencyPath(\n specifier: string\n): string | undefined {\n const localPath = specifier.match(/^(?:file|link|portal):(.+)$/)?.[1];\n if (localPath) return localPath;\n return specifier.match(/^workspace:(\\.{1,2}(?:\\/.*)?)$/)?.[1];\n}\n\n/** Checks whether one binding's declared range accepts a selected package. */\nexport function dependencyBindingAcceptsPackageVersion(\n binding: JavaScriptDependencyBinding,\n packageName: string,\n packageVersion: string | undefined\n): boolean {\n if (parseLocalDependencyPath(binding.specifier)) return true;\n\n const workspaceAlias = parseWorkspaceDependencyAlias(binding.specifier);\n if (workspaceAlias) {\n return (\n workspaceAlias.packageName === packageName &&\n workspaceRangeAcceptsVersion(workspaceAlias.range, packageVersion)\n );\n }\n\n const npmAlias = parseNpmDependencyAlias(binding.specifier);\n if (npmAlias) {\n return (\n npmAlias.packageName === packageName &&\n (npmAlias.range === undefined ||\n semverRangeAcceptsVersion(npmAlias.range, packageVersion, true))\n );\n }\n if (binding.specifier.startsWith('catalog:')) return true;\n if (binding.name !== packageName) return false;\n if (binding.specifier.startsWith('workspace:')) {\n return workspaceRangeAcceptsVersion(\n binding.specifier.slice('workspace:'.length),\n packageVersion\n );\n }\n return semverRangeAcceptsVersion(binding.specifier, packageVersion, true);\n}\n\nfunction canResolveDependencyBinding(\n directory: string,\n binding: JavaScriptDependencyBinding\n): boolean {\n const installed = resolveInstalledJavaScriptPackage(directory, binding.name);\n const installedName = installed?.manifest.name;\n if (!installed || typeof installedName !== 'string') return false;\n\n const expectedName = binding.specifier.startsWith('catalog:')\n ? installedName\n : (parseWorkspaceDependencyAlias(binding.specifier)?.packageName ??\n parseNpmDependencyAlias(binding.specifier)?.packageName ??\n readLocalDependencyPackageName(binding.specifier, directory) ??\n binding.name);\n return (\n installedName === expectedName &&\n dependencyBindingAcceptsPackageVersion(\n binding,\n installedName,\n installed.manifest.version\n )\n );\n}\n\nfunction declaresAvailableRequiredPeerDependency(\n manifest: JavaScriptPackageManifest,\n packageName: string,\n packageDirectory: string\n): boolean {\n const specifier = manifest.peerDependencies?.[packageName];\n if (\n typeof specifier !== 'string' ||\n manifest.peerDependenciesMeta?.[packageName]?.optional === true\n ) {\n return false;\n }\n return canResolveDependencyBinding(packageDirectory, {\n name: packageName,\n specifier,\n });\n}\n\nfunction readDependencySpecifier(\n manifest: JavaScriptPackageManifest,\n field: (typeof INSTALLED_DEPENDENCY_FIELDS)[number] | 'optionalDependencies',\n packageName: string\n): string | undefined {\n const specifier = manifest[field]?.[packageName];\n return typeof specifier === 'string' ? specifier : undefined;\n}\n\n/** Applies npm's rule that an optional dependency replaces the same dependency. */\nfunction readEffectiveDependencySpecifier(\n manifest: JavaScriptPackageManifest,\n field: (typeof INSTALLED_DEPENDENCY_FIELDS)[number],\n packageName: string\n): string | undefined {\n if (\n field === 'dependencies' &&\n manifest.optionalDependencies !== undefined &&\n Object.prototype.hasOwnProperty.call(\n manifest.optionalDependencies,\n packageName\n )\n ) {\n return undefined;\n }\n return readDependencySpecifier(manifest, field, packageName);\n}\n\nfunction readPackageNameSegments(packageName: string): string[] | undefined {\n if (!packageName || packageName.includes('\\\\')) return undefined;\n const segments = packageName.split('/');\n const isScoped = packageName.startsWith('@');\n if (\n (isScoped && segments.length !== 2) ||\n (!isScoped && segments.length !== 1)\n ) {\n return undefined;\n }\n return segments.every(\n (segment) => segment && segment !== '.' && segment !== '..'\n )\n ? segments\n : undefined;\n}\n\nfunction readLocalDependencyPackageName(\n specifier: string,\n packageDirectory: string\n): string | undefined {\n const localPath = parseLocalDependencyPath(specifier);\n if (!localPath) return undefined;\n const packageName = readJavaScriptPackageManifest(\n path.join(path.resolve(packageDirectory, localPath), 'package.json')\n )?.name;\n return typeof packageName === 'string' && packageName\n ? packageName\n : undefined;\n}\n\nfunction workspaceRangeAcceptsVersion(\n range: string,\n version: string | undefined\n): boolean {\n return (\n range === '' ||\n range === '*' ||\n range === '^' ||\n range === '~' ||\n semverRangeAcceptsVersion(range, version, true)\n );\n}\n\nfunction semverRangeAcceptsVersion(\n range: string,\n version: string | undefined,\n acceptOpaqueRange = false\n): boolean {\n const validRange = validSemverRange(range);\n if (!validRange) return acceptOpaqueRange;\n if (!version) return false;\n try {\n const validVersion = validSemver(version);\n return Boolean(validVersion && satisfiesSemver(validVersion, validRange));\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Updates } from 'generaltranslation/types';
|
|
2
|
+
import type { VueProjectExtractionOutput } from '../../types.js';
|
|
3
|
+
/** Framework-neutral extraction output accepted by the CLI adapter. */
|
|
4
|
+
export type InlineExtractionOutput = {
|
|
5
|
+
updates: Updates;
|
|
6
|
+
errors: string[];
|
|
7
|
+
warnings: string[];
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Appends Vue extraction to an existing framework catalog.
|
|
11
|
+
*
|
|
12
|
+
* Hash collisions represent one catalog entry. Their paths and source context
|
|
13
|
+
* are combined without duplicating identical locations, while the primary
|
|
14
|
+
* framework's ordering and catalog value remain authoritative. Primary input
|
|
15
|
+
* objects are never mutated and their diagnostics retain their original
|
|
16
|
+
* ordering and multiplicity.
|
|
17
|
+
*/
|
|
18
|
+
export declare function mergeVueProjectExtraction(primary: InlineExtractionOutput, vue: VueProjectExtractionOutput): InlineExtractionOutput;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
//#region src/internal/project/mergeVueProjectExtraction.ts
|
|
2
|
+
/**
|
|
3
|
+
* Appends Vue extraction to an existing framework catalog.
|
|
4
|
+
*
|
|
5
|
+
* Hash collisions represent one catalog entry. Their paths and source context
|
|
6
|
+
* are combined without duplicating identical locations, while the primary
|
|
7
|
+
* framework's ordering and catalog value remain authoritative. Primary input
|
|
8
|
+
* objects are never mutated and their diagnostics retain their original
|
|
9
|
+
* ordering and multiplicity.
|
|
10
|
+
*/
|
|
11
|
+
function mergeVueProjectExtraction(primary, vue) {
|
|
12
|
+
return {
|
|
13
|
+
updates: mergeUpdates(primary.updates, vue.updates),
|
|
14
|
+
errors: [...primary.errors, ...vue.errors],
|
|
15
|
+
warnings: [...primary.warnings, ...vue.warnings]
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function mergeUpdates(primary, vue) {
|
|
19
|
+
const updates = [...primary];
|
|
20
|
+
const byHash = new Map(updates.flatMap((update, index) => update.metadata.hash ? [[update.metadata.hash, index]] : []));
|
|
21
|
+
for (const update of vue) {
|
|
22
|
+
const compatibleUpdate = update;
|
|
23
|
+
const hash = update.metadata.hash;
|
|
24
|
+
const existingIndex = hash ? byHash.get(hash) : void 0;
|
|
25
|
+
if (existingIndex === void 0) {
|
|
26
|
+
if (hash) byHash.set(hash, updates.length);
|
|
27
|
+
updates.push(compatibleUpdate);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const existing = updates[existingIndex];
|
|
31
|
+
updates[existingIndex] = {
|
|
32
|
+
...existing,
|
|
33
|
+
metadata: {
|
|
34
|
+
...existing.metadata,
|
|
35
|
+
...mergeFilePaths(existing, compatibleUpdate),
|
|
36
|
+
...mergeSourceCode(existing, compatibleUpdate)
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return updates;
|
|
41
|
+
}
|
|
42
|
+
function mergeFilePaths(existing, incoming) {
|
|
43
|
+
const paths = [...existing.metadata.filePaths ?? [], ...incoming.metadata.filePaths ?? []];
|
|
44
|
+
return paths.length > 0 ? { filePaths: [...new Set(paths)] } : {};
|
|
45
|
+
}
|
|
46
|
+
function mergeSourceCode(existing, incoming) {
|
|
47
|
+
const incomingSourceCode = asSourceCodeMap(incoming.metadata.sourceCode);
|
|
48
|
+
if (!incomingSourceCode) return {};
|
|
49
|
+
const currentSourceCode = existing.metadata.sourceCode;
|
|
50
|
+
const existingSourceCode = currentSourceCode === void 0 ? {} : asSourceCodeMap(currentSourceCode);
|
|
51
|
+
if (!existingSourceCode) return {};
|
|
52
|
+
const mergedSourceCode = Object.fromEntries(Object.entries(existingSourceCode).map(([file, entries]) => [file, [...entries]]));
|
|
53
|
+
for (const [file, entries] of Object.entries(incomingSourceCode)) {
|
|
54
|
+
const target = mergedSourceCode[file] ??= [];
|
|
55
|
+
const known = new Set(target.map(serializeSourceCodeEntry));
|
|
56
|
+
for (const entry of entries) {
|
|
57
|
+
const key = serializeSourceCodeEntry(entry);
|
|
58
|
+
if (known.has(key)) continue;
|
|
59
|
+
target.push(entry);
|
|
60
|
+
known.add(key);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { sourceCode: mergedSourceCode };
|
|
64
|
+
}
|
|
65
|
+
function asSourceCodeMap(value) {
|
|
66
|
+
if (!isRecord(value)) return void 0;
|
|
67
|
+
if (!Object.values(value).every(Array.isArray)) return void 0;
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
function serializeSourceCodeEntry(entry) {
|
|
71
|
+
return JSON.stringify(entry);
|
|
72
|
+
}
|
|
73
|
+
function isRecord(value) {
|
|
74
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { mergeVueProjectExtraction };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=mergeVueProjectExtraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeVueProjectExtraction.js","names":[],"sources":["../../../src/internal/project/mergeVueProjectExtraction.ts"],"sourcesContent":["import type { Updates } from 'generaltranslation/types';\nimport type {\n VueProjectExtractionOutput,\n VueProjectExtractionResult,\n} from '../../types.js';\n\n/** Framework-neutral extraction output accepted by the CLI adapter. */\nexport type InlineExtractionOutput = {\n updates: Updates;\n errors: string[];\n warnings: string[];\n};\n\n/**\n * Appends Vue extraction to an existing framework catalog.\n *\n * Hash collisions represent one catalog entry. Their paths and source context\n * are combined without duplicating identical locations, while the primary\n * framework's ordering and catalog value remain authoritative. Primary input\n * objects are never mutated and their diagnostics retain their original\n * ordering and multiplicity.\n */\nexport function mergeVueProjectExtraction(\n primary: InlineExtractionOutput,\n vue: VueProjectExtractionOutput\n): InlineExtractionOutput {\n return {\n updates: mergeUpdates(primary.updates, vue.updates),\n errors: [...primary.errors, ...vue.errors],\n warnings: [...primary.warnings, ...vue.warnings],\n };\n}\n\nfunction mergeUpdates(\n primary: Updates,\n vue: VueProjectExtractionResult[]\n): Updates {\n const updates = [...primary];\n const byHash = new Map(\n updates.flatMap((update, index) =>\n update.metadata.hash ? [[update.metadata.hash, index] as const] : []\n )\n );\n\n for (const update of vue) {\n // The shared Updates type predates boolean/null branch wire sources.\n // Runtime consumers already accept them; keep the cast at this adapter.\n const compatibleUpdate = update as Updates[number];\n const hash = update.metadata.hash;\n const existingIndex = hash ? byHash.get(hash) : undefined;\n if (existingIndex === undefined) {\n if (hash) byHash.set(hash, updates.length);\n updates.push(compatibleUpdate);\n continue;\n }\n\n const existing = updates[existingIndex]!;\n updates[existingIndex] = {\n ...existing,\n metadata: {\n ...existing.metadata,\n ...mergeFilePaths(existing, compatibleUpdate),\n ...mergeSourceCode(existing, compatibleUpdate),\n },\n };\n }\n return updates;\n}\n\nfunction mergeFilePaths(\n existing: Updates[number],\n incoming: Updates[number]\n): Pick<Updates[number]['metadata'], 'filePaths'> {\n const paths = [\n ...(existing.metadata.filePaths ?? []),\n ...(incoming.metadata.filePaths ?? []),\n ];\n return paths.length > 0 ? { filePaths: [...new Set(paths)] } : {};\n}\n\nfunction mergeSourceCode(\n existing: Updates[number],\n incoming: Updates[number]\n): Pick<Updates[number]['metadata'], 'sourceCode'> {\n const incomingSourceCode = asSourceCodeMap(incoming.metadata.sourceCode);\n if (!incomingSourceCode) return {};\n\n const currentSourceCode = existing.metadata.sourceCode;\n const existingSourceCode =\n currentSourceCode === undefined ? {} : asSourceCodeMap(currentSourceCode);\n if (!existingSourceCode) return {};\n const mergedSourceCode = Object.fromEntries(\n Object.entries(existingSourceCode).map(([file, entries]) => [\n file,\n [...entries],\n ])\n );\n\n for (const [file, entries] of Object.entries(incomingSourceCode)) {\n const target = (mergedSourceCode[file] ??= []);\n const known = new Set(target.map(serializeSourceCodeEntry));\n for (const entry of entries) {\n const key = serializeSourceCodeEntry(entry);\n if (known.has(key)) continue;\n target.push(entry);\n known.add(key);\n }\n }\n return { sourceCode: mergedSourceCode };\n}\n\ntype SourceCodeMap = Record<string, unknown[]>;\n\nfunction asSourceCodeMap(value: unknown): SourceCodeMap | undefined {\n if (!isRecord(value)) return undefined;\n if (!Object.values(value).every(Array.isArray)) return undefined;\n return value as SourceCodeMap;\n}\n\nfunction serializeSourceCodeEntry(entry: unknown): string {\n return JSON.stringify(entry);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n"],"mappings":";;;;;;;;;;AAsBA,SAAgB,0BACd,SACA,KACwB;AACxB,QAAO;EACL,SAAS,aAAa,QAAQ,SAAS,IAAI,QAAQ;EACnD,QAAQ,CAAC,GAAG,QAAQ,QAAQ,GAAG,IAAI,OAAO;EAC1C,UAAU,CAAC,GAAG,QAAQ,UAAU,GAAG,IAAI,SAAS;EACjD;;AAGH,SAAS,aACP,SACA,KACS;CACT,MAAM,UAAU,CAAC,GAAG,QAAQ;CAC5B,MAAM,SAAS,IAAI,IACjB,QAAQ,SAAS,QAAQ,UACvB,OAAO,SAAS,OAAO,CAAC,CAAC,OAAO,SAAS,MAAM,MAAM,CAAU,GAAG,EAAE,CACrE,CACF;AAED,MAAK,MAAM,UAAU,KAAK;EAGxB,MAAM,mBAAmB;EACzB,MAAM,OAAO,OAAO,SAAS;EAC7B,MAAM,gBAAgB,OAAO,OAAO,IAAI,KAAK,GAAG,KAAA;AAChD,MAAI,kBAAkB,KAAA,GAAW;AAC/B,OAAI,KAAM,QAAO,IAAI,MAAM,QAAQ,OAAO;AAC1C,WAAQ,KAAK,iBAAiB;AAC9B;;EAGF,MAAM,WAAW,QAAQ;AACzB,UAAQ,iBAAiB;GACvB,GAAG;GACH,UAAU;IACR,GAAG,SAAS;IACZ,GAAG,eAAe,UAAU,iBAAiB;IAC7C,GAAG,gBAAgB,UAAU,iBAAiB;IAC/C;GACF;;AAEH,QAAO;;AAGT,SAAS,eACP,UACA,UACgD;CAChD,MAAM,QAAQ,CACZ,GAAI,SAAS,SAAS,aAAa,EAAE,EACrC,GAAI,SAAS,SAAS,aAAa,EAAE,CACtC;AACD,QAAO,MAAM,SAAS,IAAI,EAAE,WAAW,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,GAAG,EAAE;;AAGnE,SAAS,gBACP,UACA,UACiD;CACjD,MAAM,qBAAqB,gBAAgB,SAAS,SAAS,WAAW;AACxE,KAAI,CAAC,mBAAoB,QAAO,EAAE;CAElC,MAAM,oBAAoB,SAAS,SAAS;CAC5C,MAAM,qBACJ,sBAAsB,KAAA,IAAY,EAAE,GAAG,gBAAgB,kBAAkB;AAC3E,KAAI,CAAC,mBAAoB,QAAO,EAAE;CAClC,MAAM,mBAAmB,OAAO,YAC9B,OAAO,QAAQ,mBAAmB,CAAC,KAAK,CAAC,MAAM,aAAa,CAC1D,MACA,CAAC,GAAG,QAAQ,CACb,CAAC,CACH;AAED,MAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,mBAAmB,EAAE;EAChE,MAAM,SAAU,iBAAiB,UAAU,EAAE;EAC7C,MAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,yBAAyB,CAAC;AAC3D,OAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,MAAM,yBAAyB,MAAM;AAC3C,OAAI,MAAM,IAAI,IAAI,CAAE;AACpB,UAAO,KAAK,MAAM;AAClB,SAAM,IAAI,IAAI;;;AAGlB,QAAO,EAAE,YAAY,kBAAkB;;AAKzC,SAAS,gBAAgB,OAA2C;AAClE,KAAI,CAAC,SAAS,MAAM,CAAE,QAAO,KAAA;AAC7B,KAAI,CAAC,OAAO,OAAO,MAAM,CAAC,MAAM,MAAM,QAAQ,CAAE,QAAO,KAAA;AACvD,QAAO;;AAGT,SAAS,yBAAyB,OAAwB;AACxD,QAAO,KAAK,UAAU,MAAM;;AAG9B,SAAS,SAAS,OAAkD;AAClE,QAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ConfigLoaderResult } from 'tsconfig-paths';
|
|
2
|
+
import { type JavaScriptPackageManifest } from './manifest.js';
|
|
3
|
+
/** Conditions used by the CLI when no project override is supplied. */
|
|
4
|
+
export declare const DEFAULT_RESOLUTION_CONDITIONS: readonly ["module", "browser", "development|production"];
|
|
5
|
+
type ProjectModuleResolverOptions = {
|
|
6
|
+
/** Package currently being inspected, for standards-compliant self imports. */
|
|
7
|
+
selfPackage?: {
|
|
8
|
+
directory: string;
|
|
9
|
+
manifest: JavaScriptPackageManifest;
|
|
10
|
+
};
|
|
11
|
+
/** Explicit tsconfig.json or jsconfig.json used for every importer. */
|
|
12
|
+
tsconfigPath?: string;
|
|
13
|
+
};
|
|
14
|
+
/** Loads one explicit config without honoring ambient ts-node overrides. */
|
|
15
|
+
export declare function loadExplicitTypeScriptConfig(configPath: string): ConfigLoaderResult;
|
|
16
|
+
/** Creates a deterministic, source-first resolver scoped to one extraction. */
|
|
17
|
+
export declare function createProjectModuleResolver(conditionNames?: readonly string[], options?: ProjectModuleResolverOptions): (specifier: string, importer: string) => string | undefined;
|
|
18
|
+
export {};
|