@generaltranslation/vue-extractor 0.0.0 → 0.1.0-iris.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE.md +18 -102
  2. package/dist/detect.d.ts +8 -0
  3. package/dist/detect.js +2 -0
  4. package/dist/index.d.ts +3 -1
  5. package/dist/index.js +2 -1
  6. package/dist/inspect.d.ts +9 -0
  7. package/dist/inspect.js +2 -0
  8. package/dist/integration.d.ts +69 -0
  9. package/dist/integration.js +162 -0
  10. package/dist/integration.js.map +1 -0
  11. package/dist/internal/config/configFiles.d.ts +6 -0
  12. package/dist/internal/config/configFiles.js +34 -0
  13. package/dist/internal/config/configFiles.js.map +1 -0
  14. package/dist/internal/config/resolveVueCompilerOptions.d.ts +6 -0
  15. package/dist/internal/config/resolveVueCompilerOptions.js +74 -56
  16. package/dist/internal/config/resolveVueCompilerOptions.js.map +1 -1
  17. package/dist/internal/extractFromVueSource.d.ts +4 -3
  18. package/dist/internal/extractFromVueSource.js +255 -12
  19. package/dist/internal/extractFromVueSource.js.map +1 -1
  20. package/dist/internal/project/consumerUsage.d.ts +34 -0
  21. package/dist/internal/project/consumerUsage.js +1220 -0
  22. package/dist/internal/project/consumerUsage.js.map +1 -0
  23. package/dist/internal/project/detectVueProject.d.ts +13 -0
  24. package/dist/internal/project/detectVueProject.js +65 -0
  25. package/dist/internal/project/detectVueProject.js.map +1 -0
  26. package/dist/internal/project/extractFromVueProject.d.ts +10 -0
  27. package/dist/internal/project/extractFromVueProject.js +579 -0
  28. package/dist/internal/project/extractFromVueProject.js.map +1 -0
  29. package/dist/internal/project/inspectVueProject.d.ts +48 -0
  30. package/dist/internal/project/inspectVueProject.js +143 -0
  31. package/dist/internal/project/inspectVueProject.js.map +1 -0
  32. package/dist/internal/project/manifest.d.ts +64 -0
  33. package/dist/internal/project/manifest.js +270 -0
  34. package/dist/internal/project/manifest.js.map +1 -0
  35. package/dist/internal/project/mergeVueProjectExtraction.d.ts +18 -0
  36. package/dist/internal/project/mergeVueProjectExtraction.js +79 -0
  37. package/dist/internal/project/mergeVueProjectExtraction.js.map +1 -0
  38. package/dist/internal/project/moduleResolver.d.ts +18 -0
  39. package/dist/internal/project/moduleResolver.js +325 -0
  40. package/dist/internal/project/moduleResolver.js.map +1 -0
  41. package/dist/internal/project/scopes.d.ts +31 -0
  42. package/dist/internal/project/scopes.js +182 -0
  43. package/dist/internal/project/scopes.js.map +1 -0
  44. package/dist/internal/project/sourcePatterns.d.ts +4 -0
  45. package/dist/internal/project/sourcePatterns.js +32 -0
  46. package/dist/internal/project/sourcePatterns.js.map +1 -0
  47. package/dist/internal/project/viteAliases.d.ts +42 -0
  48. package/dist/internal/project/viteAliases.js +1020 -0
  49. package/dist/internal/project/viteAliases.js.map +1 -0
  50. package/dist/internal/project/vueSourceClassification.d.ts +13 -0
  51. package/dist/internal/project/vueSourceClassification.js +146 -0
  52. package/dist/internal/project/vueSourceClassification.js.map +1 -0
  53. package/dist/internal/project/workspaces.d.ts +31 -0
  54. package/dist/internal/project/workspaces.js +326 -0
  55. package/dist/internal/project/workspaces.js.map +1 -0
  56. package/dist/internal/project/wrapperProvenance.d.ts +21 -0
  57. package/dist/internal/project/wrapperProvenance.js +287 -0
  58. package/dist/internal/project/wrapperProvenance.js.map +1 -0
  59. package/dist/internal/script/analyze.js +252 -85
  60. package/dist/internal/script/analyze.js.map +1 -1
  61. package/dist/internal/script/jsx.d.ts +7 -4
  62. package/dist/internal/script/jsx.js +351 -79
  63. package/dist/internal/script/jsx.js.map +1 -1
  64. package/dist/internal/script/localModules.d.ts +23 -2
  65. package/dist/internal/script/localModules.js +533 -20
  66. package/dist/internal/script/localModules.js.map +1 -1
  67. package/dist/internal/script/model.d.ts +9 -2
  68. package/dist/internal/script/parser.js +2 -1
  69. package/dist/internal/script/parser.js.map +1 -1
  70. package/dist/internal/script/runtimeModules.d.ts +10 -0
  71. package/dist/internal/script/runtimeModules.js +27 -0
  72. package/dist/internal/script/runtimeModules.js.map +1 -0
  73. package/dist/internal/stringCalls.js +1 -1
  74. package/dist/internal/stringCalls.js.map +1 -1
  75. package/dist/internal/template.js +263 -141
  76. package/dist/internal/template.js.map +1 -1
  77. package/dist/internal/types.d.ts +4 -1
  78. package/dist/internal/utils.d.ts +14 -3
  79. package/dist/internal/utils.js +63 -3
  80. package/dist/internal/utils.js.map +1 -1
  81. package/dist/internal/vueCompiler.d.ts +9 -1
  82. package/dist/internal/vueCompiler.js +37 -14
  83. package/dist/internal/vueCompiler.js.map +1 -1
  84. package/dist/project.d.ts +11 -0
  85. package/dist/project.js +3 -0
  86. package/dist/types.d.ts +95 -4
  87. package/package.json +30 -4
@@ -0,0 +1,326 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import fg from "fast-glob";
4
+ import { parse } from "yaml";
5
+ //#region src/internal/project/workspaces.ts
6
+ const ASYNC_WORKSPACE_READ_CONCURRENCY = 64;
7
+ /** Creates an isolated workspace cache for one detection or extraction call. */
8
+ function createWorkspaceDiscoveryCache() {
9
+ return /* @__PURE__ */ new Map();
10
+ }
11
+ /**
12
+ * Reads declared workspace packages without following paths outside the root.
13
+ *
14
+ * A valid `pnpm-workspace.yaml` is authoritative over `package.json` because
15
+ * pnpm uses that file to include and exclude packages. Malformed workspace
16
+ * metadata is treated as no optional workspaces; it never hides a known root
17
+ * application or causes extraction to traverse the filesystem recursively.
18
+ */
19
+ function readDeclaredWorkspacePackages(cwd, rootManifest, cache) {
20
+ const cacheKey = path.resolve(cwd);
21
+ const manifestWorkspaces = JSON.stringify(rootManifest.workspaces ?? null);
22
+ const cached = cache.get(cacheKey);
23
+ if (cached?.manifestWorkspaces === manifestWorkspaces) return cached.packages;
24
+ const patterns = getPnpmWorkspacePatterns(cwd) ?? getPackageJsonWorkspacePatterns(rootManifest);
25
+ const manifestPatterns = [...new Set(patterns.map(toManifestPattern))].filter((pattern) => pattern !== null);
26
+ if (!manifestPatterns.some((pattern) => !pattern.startsWith("!"))) return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);
27
+ const realRoot = readRealPath(cwd);
28
+ if (!realRoot) return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);
29
+ const shallowPackagePaths = readShallowWorkspaceManifestPaths(cwd, realRoot, manifestPatterns);
30
+ const packagePaths = shallowPackagePaths ?? readWorkspaceManifestPathsWithGlob(cwd, manifestPatterns);
31
+ if (!packagePaths) return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);
32
+ packagePaths.sort(comparePaths);
33
+ const rootPackagePath = path.resolve(cwd, "package.json");
34
+ return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, packagePaths.flatMap((packagePath) => {
35
+ const absolutePath = path.resolve(packagePath);
36
+ if (absolutePath === rootPackagePath || !isWithinRoot(cwd, absolutePath) || absolutePath.split(path.sep).includes("node_modules")) return [];
37
+ const manifestPath = shallowPackagePaths ? absolutePath : readValidatedManifestPath(realRoot, absolutePath);
38
+ if (!manifestPath) return [];
39
+ const manifest = readWorkspacePackageManifest(manifestPath);
40
+ return manifest ? [{
41
+ directory: path.dirname(absolutePath),
42
+ manifest
43
+ }] : [];
44
+ }));
45
+ }
46
+ /**
47
+ * Reads declared workspace packages without blocking on every manifest.
48
+ *
49
+ * The returned packages and cache entry are identical to the synchronous
50
+ * implementation. Project inspection can populate this cache concurrently
51
+ * with a host framework's existing extraction, then reuse the established
52
+ * synchronous ownership logic without traversing the workspace twice.
53
+ */
54
+ async function readDeclaredWorkspacePackagesAsync(cwd, rootManifest, cache) {
55
+ const cacheKey = path.resolve(cwd);
56
+ const manifestWorkspaces = JSON.stringify(rootManifest.workspaces ?? null);
57
+ const cached = cache.get(cacheKey);
58
+ if (cached?.manifestWorkspaces === manifestWorkspaces) return cached.packages;
59
+ const patterns = await getPnpmWorkspacePatternsAsync(cwd) ?? getPackageJsonWorkspacePatterns(rootManifest);
60
+ const manifestPatterns = [...new Set(patterns.map(toManifestPattern))].filter((pattern) => pattern !== null);
61
+ if (!manifestPatterns.some((pattern) => !pattern.startsWith("!"))) return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);
62
+ const realRoot = await readRealPathAsync(cwd);
63
+ if (!realRoot) return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);
64
+ const shallowPackagePaths = await readShallowWorkspaceManifestPathsAsync(cwd, realRoot, manifestPatterns);
65
+ let packagePaths;
66
+ if (shallowPackagePaths) packagePaths = shallowPackagePaths;
67
+ else try {
68
+ packagePaths = await fg([...manifestPatterns], workspaceGlobOptions(cwd));
69
+ } catch {
70
+ packagePaths = void 0;
71
+ }
72
+ if (!packagePaths) return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);
73
+ packagePaths.sort(comparePaths);
74
+ const rootPackagePath = path.resolve(cwd, "package.json");
75
+ return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, (await mapWithConcurrency(packagePaths, ASYNC_WORKSPACE_READ_CONCURRENCY, async (packagePath) => {
76
+ const absolutePath = path.resolve(packagePath);
77
+ if (absolutePath === rootPackagePath || !isWithinRoot(cwd, absolutePath) || absolutePath.split(path.sep).includes("node_modules")) return;
78
+ const manifestPath = shallowPackagePaths ? absolutePath : await readValidatedManifestPathAsync(realRoot, absolutePath);
79
+ if (!manifestPath) return void 0;
80
+ const manifest = await readJavaScriptPackageManifestAsync(manifestPath);
81
+ return manifest ? {
82
+ directory: path.dirname(absolutePath),
83
+ manifest
84
+ } : void 0;
85
+ })).filter((workspacePackage) => workspacePackage !== void 0));
86
+ }
87
+ /**
88
+ * Finds workspace manifests, optimizing only the common shallow-positive form.
89
+ *
90
+ * A pattern such as `packages/<child>/package.json` can be resolved with one
91
+ * directory read instead of traversing every child directory. All negative,
92
+ * nested, or otherwise dynamic patterns keep fast-glob's existing behavior.
93
+ */
94
+ function readShallowWorkspaceManifestPaths(cwd, realRoot, manifestPatterns) {
95
+ const shallowBases = readShallowPositiveBases(manifestPatterns);
96
+ if (!shallowBases) return void 0;
97
+ try {
98
+ const paths = shallowBases.flatMap((base) => {
99
+ const baseDirectory = path.resolve(cwd, base);
100
+ if (!isSafeShallowBase(realRoot, readRealPath(baseDirectory))) return [];
101
+ try {
102
+ return fs.readdirSync(baseDirectory, { withFileTypes: true }).filter(isVisibleDirectoryEntry).map((entry) => path.join(baseDirectory, entry.name, "package.json"));
103
+ } catch {
104
+ return [];
105
+ }
106
+ });
107
+ return [...new Set(paths)];
108
+ } catch {
109
+ return;
110
+ }
111
+ }
112
+ /** Asynchronous counterpart to {@link readShallowWorkspaceManifestPaths}. */
113
+ async function readShallowWorkspaceManifestPathsAsync(cwd, realRoot, manifestPatterns) {
114
+ const shallowBases = readShallowPositiveBases(manifestPatterns);
115
+ if (!shallowBases) return void 0;
116
+ try {
117
+ const paths = (await Promise.all(shallowBases.map(async (base) => {
118
+ const baseDirectory = path.resolve(cwd, base);
119
+ if (!isSafeShallowBase(realRoot, await readRealPathAsync(baseDirectory))) return {
120
+ baseDirectory,
121
+ entries: []
122
+ };
123
+ try {
124
+ return {
125
+ baseDirectory,
126
+ entries: await fs.promises.readdir(baseDirectory, { withFileTypes: true })
127
+ };
128
+ } catch {
129
+ return {
130
+ baseDirectory,
131
+ entries: []
132
+ };
133
+ }
134
+ }))).flatMap(({ baseDirectory, entries }) => entries.filter(isVisibleDirectoryEntry).map((entry) => path.join(baseDirectory, entry.name, "package.json")));
135
+ return [...new Set(paths)];
136
+ } catch {
137
+ return;
138
+ }
139
+ }
140
+ /** Uses fast-glob for workspace layouts outside the bounded shallow form. */
141
+ function readWorkspaceManifestPathsWithGlob(cwd, manifestPatterns) {
142
+ try {
143
+ return fg.sync([...manifestPatterns], workspaceGlobOptions(cwd));
144
+ } catch {
145
+ return;
146
+ }
147
+ }
148
+ /** Shared options preserve the historical fast-glob matching semantics. */
149
+ function workspaceGlobOptions(cwd) {
150
+ return {
151
+ absolute: true,
152
+ cwd,
153
+ followSymbolicLinks: false,
154
+ ignore: ["**/node_modules/**"],
155
+ onlyFiles: true,
156
+ unique: true
157
+ };
158
+ }
159
+ /**
160
+ * Reads literal bases from patterns shaped like `<base>/<child>/package.json`.
161
+ * Hidden child directories are intentionally excluded to match fast-glob's
162
+ * default `dot: false` behavior.
163
+ */
164
+ function readShallowPositiveBases(manifestPatterns) {
165
+ const bases = [];
166
+ for (const pattern of manifestPatterns) {
167
+ if (pattern.startsWith("!")) return void 0;
168
+ const segments = pattern.split("/");
169
+ if (segments.length < 2 || segments.at(-1) !== "package.json" || segments.at(-2) !== "*") return;
170
+ const base = segments.slice(0, -2).join("/") || ".";
171
+ if (fg.isDynamicPattern(base)) return void 0;
172
+ bases.push(base);
173
+ }
174
+ return [...new Set(bases)];
175
+ }
176
+ /** Matches only visible physical directories, excluding symlinked workspaces. */
177
+ function isVisibleDirectoryEntry(entry) {
178
+ return !entry.name.startsWith(".") && entry.isDirectory();
179
+ }
180
+ /** Validates one physical shallow base before skipping per-manifest realpath. */
181
+ function isSafeShallowBase(realRoot, realBase) {
182
+ if (!realBase || !isWithinOrEqualRoot(realRoot, realBase)) return false;
183
+ return !path.relative(realRoot, realBase).split(path.sep).includes("node_modules");
184
+ }
185
+ function cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, packages) {
186
+ cache.set(cacheKey, {
187
+ manifestWorkspaces,
188
+ packages
189
+ });
190
+ return packages;
191
+ }
192
+ function getPackageJsonWorkspacePatterns(manifest) {
193
+ if (Array.isArray(manifest.workspaces)) return manifest.workspaces.filter((pattern) => typeof pattern === "string");
194
+ if (manifest.workspaces && typeof manifest.workspaces === "object" && Array.isArray(manifest.workspaces.packages)) return manifest.workspaces.packages.filter((pattern) => typeof pattern === "string");
195
+ return [];
196
+ }
197
+ function getPnpmWorkspacePatterns(cwd) {
198
+ const workspacePath = path.join(cwd, "pnpm-workspace.yaml");
199
+ if (!fs.existsSync(workspacePath)) return void 0;
200
+ try {
201
+ const parsed = parse(fs.readFileSync(workspacePath, "utf8"));
202
+ if (parsed == null) return [];
203
+ if (!isRecord(parsed)) return [];
204
+ if (parsed.packages == null) return [];
205
+ if (!Array.isArray(parsed.packages)) return [];
206
+ return parsed.packages.filter((pattern) => typeof pattern === "string");
207
+ } catch {
208
+ return [];
209
+ }
210
+ }
211
+ async function getPnpmWorkspacePatternsAsync(cwd) {
212
+ const workspacePath = path.join(cwd, "pnpm-workspace.yaml");
213
+ if (!fs.existsSync(workspacePath)) return void 0;
214
+ try {
215
+ const parsed = parse(await fs.promises.readFile(workspacePath, "utf8"));
216
+ if (parsed == null) return [];
217
+ if (!isRecord(parsed)) return [];
218
+ if (parsed.packages == null) return [];
219
+ if (!Array.isArray(parsed.packages)) return [];
220
+ return parsed.packages.filter((pattern) => typeof pattern === "string");
221
+ } catch {
222
+ return [];
223
+ }
224
+ }
225
+ function toManifestPattern(pattern) {
226
+ const trimmed = pattern.trim();
227
+ const negated = trimmed.startsWith("!");
228
+ const rawPattern = negated ? trimmed.slice(1) : trimmed;
229
+ if (!rawPattern) return null;
230
+ const normalized = path.posix.normalize(rawPattern.replaceAll("\\", "/"));
231
+ if (path.posix.isAbsolute(normalized) || path.win32.isAbsolute(normalized) || /^[A-Za-z]:/.test(normalized) || containsParentTraversal(normalized) || normalized === ".." || normalized.startsWith("../")) return null;
232
+ const withoutTrailingSlash = normalized.replace(/\/+$/, "");
233
+ const manifestPattern = withoutTrailingSlash.endsWith("/package.json") ? withoutTrailingSlash : `${withoutTrailingSlash}/package.json`;
234
+ return negated ? `!${manifestPattern}` : manifestPattern;
235
+ }
236
+ /** Rejects parent segments, including those hidden in glob alternatives. */
237
+ function containsParentTraversal(pattern) {
238
+ return /(^|[/{,(|])\.\.(?=$|[/},)|])/.test(pattern);
239
+ }
240
+ function readRealPath(filePath) {
241
+ try {
242
+ return fs.realpathSync(filePath);
243
+ } catch {
244
+ return;
245
+ }
246
+ }
247
+ async function readRealPathAsync(filePath) {
248
+ try {
249
+ return await fs.promises.realpath(filePath);
250
+ } catch {
251
+ return;
252
+ }
253
+ }
254
+ /** Preserves the historical physical containment check for glob fallbacks. */
255
+ function readValidatedManifestPath(realRoot, packagePath) {
256
+ const realPackagePath = readRealPath(packagePath);
257
+ return realPackagePath && isWithinRoot(realRoot, realPackagePath) && !realPackagePath.split(path.sep).includes("node_modules") ? realPackagePath : void 0;
258
+ }
259
+ /** Asynchronous counterpart to {@link readValidatedManifestPath}. */
260
+ async function readValidatedManifestPathAsync(realRoot, packagePath) {
261
+ const realPackagePath = await readRealPathAsync(packagePath);
262
+ return realPackagePath && isWithinRoot(realRoot, realPackagePath) && !realPackagePath.split(path.sep).includes("node_modules") ? realPackagePath : void 0;
263
+ }
264
+ async function readJavaScriptPackageManifestAsync(packagePath) {
265
+ let file;
266
+ try {
267
+ if (!(await fs.promises.lstat(packagePath)).isFile()) return void 0;
268
+ file = await fs.promises.open(packagePath, workspaceManifestOpenFlags());
269
+ const parsed = JSON.parse(await file.readFile("utf8"));
270
+ return isRecord(parsed) ? parsed : void 0;
271
+ } catch {
272
+ return;
273
+ } finally {
274
+ await file?.close();
275
+ }
276
+ }
277
+ /** Reads a workspace manifest without following a manifest-file symlink. */
278
+ function readWorkspacePackageManifest(packagePath) {
279
+ let descriptor;
280
+ try {
281
+ if (!fs.lstatSync(packagePath).isFile()) return void 0;
282
+ descriptor = fs.openSync(packagePath, workspaceManifestOpenFlags());
283
+ const parsed = JSON.parse(fs.readFileSync(descriptor, "utf8"));
284
+ return isRecord(parsed) ? parsed : void 0;
285
+ } catch {
286
+ return;
287
+ } finally {
288
+ if (descriptor !== void 0) fs.closeSync(descriptor);
289
+ }
290
+ }
291
+ /** Prevents a shallow workspace candidate from redirecting its manifest. */
292
+ function workspaceManifestOpenFlags() {
293
+ return fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0);
294
+ }
295
+ /** Maps filesystem work concurrently without exhausting file descriptors. */
296
+ async function mapWithConcurrency(values, concurrency, mapper) {
297
+ const results = Array.from({ length: values.length });
298
+ let nextIndex = 0;
299
+ const worker = async () => {
300
+ while (nextIndex < values.length) {
301
+ const index = nextIndex;
302
+ nextIndex += 1;
303
+ results[index] = await mapper(values[index]);
304
+ }
305
+ };
306
+ await Promise.all(Array.from({ length: Math.min(concurrency, values.length) }, () => worker()));
307
+ return results;
308
+ }
309
+ function isWithinRoot(root, candidate) {
310
+ const relativePath = path.relative(path.resolve(root), candidate);
311
+ return relativePath !== "" && relativePath !== ".." && !relativePath.startsWith(`..${path.sep}`) && !path.isAbsolute(relativePath);
312
+ }
313
+ /** Checks physical containment while allowing the project root itself. */
314
+ function isWithinOrEqualRoot(root, candidate) {
315
+ return path.resolve(root) === path.resolve(candidate) || isWithinRoot(root, candidate);
316
+ }
317
+ function isRecord(value) {
318
+ return value !== null && typeof value === "object" && !Array.isArray(value);
319
+ }
320
+ function comparePaths(left, right) {
321
+ return left < right ? -1 : left > right ? 1 : 0;
322
+ }
323
+ //#endregion
324
+ export { createWorkspaceDiscoveryCache, readDeclaredWorkspacePackages, readDeclaredWorkspacePackagesAsync };
325
+
326
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","names":["parseYaml"],"sources":["../../../src/internal/project/workspaces.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport { parse as parseYaml } from 'yaml';\nimport type { JavaScriptPackageManifest } from './manifest.js';\n\nconst ASYNC_WORKSPACE_READ_CONCURRENCY = 64;\n\n/** A validated workspace package and its parsed manifest. */\nexport type DeclaredWorkspacePackage = {\n directory: string;\n manifest: JavaScriptPackageManifest;\n};\n\n/** Per-extraction cache that avoids traversing the same workspace repeatedly. */\nexport type WorkspaceDiscoveryCache = Map<\n string,\n { manifestWorkspaces: string; packages: DeclaredWorkspacePackage[] }\n>;\n\n/** Creates an isolated workspace cache for one detection or extraction call. */\nexport function createWorkspaceDiscoveryCache(): WorkspaceDiscoveryCache {\n return new Map();\n}\n\n/**\n * Reads declared workspace packages without following paths outside the root.\n *\n * A valid `pnpm-workspace.yaml` is authoritative over `package.json` because\n * pnpm uses that file to include and exclude packages. Malformed workspace\n * metadata is treated as no optional workspaces; it never hides a known root\n * application or causes extraction to traverse the filesystem recursively.\n */\nexport function readDeclaredWorkspacePackages(\n cwd: string,\n rootManifest: JavaScriptPackageManifest,\n cache: WorkspaceDiscoveryCache\n): DeclaredWorkspacePackage[] {\n const cacheKey = path.resolve(cwd);\n const manifestWorkspaces = JSON.stringify(rootManifest.workspaces ?? null);\n const cached = cache.get(cacheKey);\n if (cached?.manifestWorkspaces === manifestWorkspaces) {\n return cached.packages;\n }\n\n const pnpmPatterns = getPnpmWorkspacePatterns(cwd);\n const patterns =\n pnpmPatterns ?? getPackageJsonWorkspacePatterns(rootManifest);\n const manifestPatterns = [...new Set(patterns.map(toManifestPattern))].filter(\n (pattern): pattern is string => pattern !== null\n );\n if (!manifestPatterns.some((pattern) => !pattern.startsWith('!'))) {\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);\n }\n\n const realRoot = readRealPath(cwd);\n if (!realRoot) {\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);\n }\n\n const shallowPackagePaths = readShallowWorkspaceManifestPaths(\n cwd,\n realRoot,\n manifestPatterns\n );\n const packagePaths =\n shallowPackagePaths ??\n readWorkspaceManifestPathsWithGlob(cwd, manifestPatterns);\n if (!packagePaths) {\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);\n }\n packagePaths.sort(comparePaths);\n\n const rootPackagePath = path.resolve(cwd, 'package.json');\n const packages = packagePaths.flatMap((packagePath) => {\n const absolutePath = path.resolve(packagePath);\n if (\n absolutePath === rootPackagePath ||\n !isWithinRoot(cwd, absolutePath) ||\n absolutePath.split(path.sep).includes('node_modules')\n ) {\n return [];\n }\n\n const manifestPath = shallowPackagePaths\n ? absolutePath\n : readValidatedManifestPath(realRoot, absolutePath);\n if (!manifestPath) return [];\n const manifest = readWorkspacePackageManifest(manifestPath);\n return manifest\n ? [{ directory: path.dirname(absolutePath), manifest }]\n : [];\n });\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, packages);\n}\n\n/**\n * Reads declared workspace packages without blocking on every manifest.\n *\n * The returned packages and cache entry are identical to the synchronous\n * implementation. Project inspection can populate this cache concurrently\n * with a host framework's existing extraction, then reuse the established\n * synchronous ownership logic without traversing the workspace twice.\n */\nexport async function readDeclaredWorkspacePackagesAsync(\n cwd: string,\n rootManifest: JavaScriptPackageManifest,\n cache: WorkspaceDiscoveryCache\n): Promise<DeclaredWorkspacePackage[]> {\n const cacheKey = path.resolve(cwd);\n const manifestWorkspaces = JSON.stringify(rootManifest.workspaces ?? null);\n const cached = cache.get(cacheKey);\n if (cached?.manifestWorkspaces === manifestWorkspaces) {\n return cached.packages;\n }\n\n const pnpmPatterns = await getPnpmWorkspacePatternsAsync(cwd);\n const patterns =\n pnpmPatterns ?? getPackageJsonWorkspacePatterns(rootManifest);\n const manifestPatterns = [...new Set(patterns.map(toManifestPattern))].filter(\n (pattern): pattern is string => pattern !== null\n );\n if (!manifestPatterns.some((pattern) => !pattern.startsWith('!'))) {\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);\n }\n\n const realRoot = await readRealPathAsync(cwd);\n if (!realRoot) {\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);\n }\n\n const shallowPackagePaths = await readShallowWorkspaceManifestPathsAsync(\n cwd,\n realRoot,\n manifestPatterns\n );\n let packagePaths: string[] | undefined;\n if (shallowPackagePaths) {\n packagePaths = shallowPackagePaths;\n } else {\n try {\n packagePaths = await fg([...manifestPatterns], workspaceGlobOptions(cwd));\n } catch {\n packagePaths = undefined;\n }\n }\n if (!packagePaths) {\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, []);\n }\n packagePaths.sort(comparePaths);\n\n const rootPackagePath = path.resolve(cwd, 'package.json');\n const packageResults = await mapWithConcurrency(\n packagePaths,\n ASYNC_WORKSPACE_READ_CONCURRENCY,\n async (packagePath) => {\n const absolutePath = path.resolve(packagePath);\n if (\n absolutePath === rootPackagePath ||\n !isWithinRoot(cwd, absolutePath) ||\n absolutePath.split(path.sep).includes('node_modules')\n ) {\n return undefined;\n }\n\n const manifestPath = shallowPackagePaths\n ? absolutePath\n : await readValidatedManifestPathAsync(realRoot, absolutePath);\n if (!manifestPath) return undefined;\n const manifest = await readJavaScriptPackageManifestAsync(manifestPath);\n return manifest\n ? { directory: path.dirname(absolutePath), manifest }\n : undefined;\n }\n );\n const packages = packageResults.filter(\n (workspacePackage): workspacePackage is DeclaredWorkspacePackage =>\n workspacePackage !== undefined\n );\n return cacheWorkspacePackages(cache, cacheKey, manifestWorkspaces, packages);\n}\n\n/**\n * Finds workspace manifests, optimizing only the common shallow-positive form.\n *\n * A pattern such as `packages/<child>/package.json` can be resolved with one\n * directory read instead of traversing every child directory. All negative,\n * nested, or otherwise dynamic patterns keep fast-glob's existing behavior.\n */\nfunction readShallowWorkspaceManifestPaths(\n cwd: string,\n realRoot: string,\n manifestPatterns: readonly string[]\n): string[] | undefined {\n const shallowBases = readShallowPositiveBases(manifestPatterns);\n if (!shallowBases) return undefined;\n\n try {\n const paths = shallowBases.flatMap((base) => {\n const baseDirectory = path.resolve(cwd, base);\n if (!isSafeShallowBase(realRoot, readRealPath(baseDirectory))) return [];\n try {\n return fs\n .readdirSync(baseDirectory, { withFileTypes: true })\n .filter(isVisibleDirectoryEntry)\n .map((entry) => path.join(baseDirectory, entry.name, 'package.json'));\n } catch {\n return [];\n }\n });\n return [...new Set(paths)];\n } catch {\n return undefined;\n }\n}\n\n/** Asynchronous counterpart to {@link readShallowWorkspaceManifestPaths}. */\nasync function readShallowWorkspaceManifestPathsAsync(\n cwd: string,\n realRoot: string,\n manifestPatterns: readonly string[]\n): Promise<string[] | undefined> {\n const shallowBases = readShallowPositiveBases(manifestPatterns);\n if (!shallowBases) return undefined;\n\n try {\n const entriesByBase = await Promise.all(\n shallowBases.map(async (base) => {\n const baseDirectory = path.resolve(cwd, base);\n const realBase = await readRealPathAsync(baseDirectory);\n if (!isSafeShallowBase(realRoot, realBase)) {\n return { baseDirectory, entries: [] };\n }\n try {\n return {\n baseDirectory,\n entries: await fs.promises.readdir(baseDirectory, {\n withFileTypes: true,\n }),\n };\n } catch {\n return { baseDirectory, entries: [] };\n }\n })\n );\n const paths = entriesByBase.flatMap(({ baseDirectory, entries }) =>\n entries\n .filter(isVisibleDirectoryEntry)\n .map((entry) => path.join(baseDirectory, entry.name, 'package.json'))\n );\n return [...new Set(paths)];\n } catch {\n return undefined;\n }\n}\n\n/** Uses fast-glob for workspace layouts outside the bounded shallow form. */\nfunction readWorkspaceManifestPathsWithGlob(\n cwd: string,\n manifestPatterns: readonly string[]\n): string[] | undefined {\n try {\n return fg.sync([...manifestPatterns], workspaceGlobOptions(cwd));\n } catch {\n return undefined;\n }\n}\n\n/** Shared options preserve the historical fast-glob matching semantics. */\nfunction workspaceGlobOptions(\n cwd: string\n): NonNullable<Parameters<typeof fg.sync>[1]> {\n return {\n absolute: true,\n cwd,\n followSymbolicLinks: false,\n ignore: ['**/node_modules/**'],\n onlyFiles: true,\n unique: true,\n };\n}\n\n/**\n * Reads literal bases from patterns shaped like `<base>/<child>/package.json`.\n * Hidden child directories are intentionally excluded to match fast-glob's\n * default `dot: false` behavior.\n */\nfunction readShallowPositiveBases(\n manifestPatterns: readonly string[]\n): string[] | undefined {\n const bases: string[] = [];\n for (const pattern of manifestPatterns) {\n if (pattern.startsWith('!')) return undefined;\n const segments = pattern.split('/');\n if (\n segments.length < 2 ||\n segments.at(-1) !== 'package.json' ||\n segments.at(-2) !== '*'\n ) {\n return undefined;\n }\n const base = segments.slice(0, -2).join('/') || '.';\n if (fg.isDynamicPattern(base)) return undefined;\n bases.push(base);\n }\n return [...new Set(bases)];\n}\n\n/** Matches only visible physical directories, excluding symlinked workspaces. */\nfunction isVisibleDirectoryEntry(entry: fs.Dirent): boolean {\n return !entry.name.startsWith('.') && entry.isDirectory();\n}\n\n/** Validates one physical shallow base before skipping per-manifest realpath. */\nfunction isSafeShallowBase(\n realRoot: string,\n realBase: string | undefined\n): boolean {\n if (!realBase || !isWithinOrEqualRoot(realRoot, realBase)) return false;\n const relative = path.relative(realRoot, realBase);\n return !relative.split(path.sep).includes('node_modules');\n}\n\nfunction cacheWorkspacePackages(\n cache: WorkspaceDiscoveryCache,\n cacheKey: string,\n manifestWorkspaces: string,\n packages: DeclaredWorkspacePackage[]\n): DeclaredWorkspacePackage[] {\n cache.set(cacheKey, { manifestWorkspaces, packages });\n return packages;\n}\n\nfunction getPackageJsonWorkspacePatterns(\n manifest: JavaScriptPackageManifest\n): string[] {\n if (Array.isArray(manifest.workspaces)) {\n return manifest.workspaces.filter(\n (pattern): pattern is string => typeof pattern === 'string'\n );\n }\n if (\n manifest.workspaces &&\n typeof manifest.workspaces === 'object' &&\n Array.isArray(manifest.workspaces.packages)\n ) {\n return manifest.workspaces.packages.filter(\n (pattern): pattern is string => typeof pattern === 'string'\n );\n }\n return [];\n}\n\nfunction getPnpmWorkspacePatterns(cwd: string): string[] | undefined {\n const workspacePath = path.join(cwd, 'pnpm-workspace.yaml');\n if (!fs.existsSync(workspacePath)) return undefined;\n\n try {\n const parsed = parseYaml(fs.readFileSync(workspacePath, 'utf8')) as unknown;\n if (parsed == null) return [];\n if (!isRecord(parsed)) return [];\n if (parsed.packages == null) return [];\n if (!Array.isArray(parsed.packages)) return [];\n return parsed.packages.filter(\n (pattern): pattern is string => typeof pattern === 'string'\n );\n } catch {\n return [];\n }\n}\n\nasync function getPnpmWorkspacePatternsAsync(\n cwd: string\n): Promise<string[] | undefined> {\n const workspacePath = path.join(cwd, 'pnpm-workspace.yaml');\n if (!fs.existsSync(workspacePath)) return undefined;\n\n try {\n const parsed = parseYaml(\n await fs.promises.readFile(workspacePath, 'utf8')\n ) as unknown;\n if (parsed == null) return [];\n if (!isRecord(parsed)) return [];\n if (parsed.packages == null) return [];\n if (!Array.isArray(parsed.packages)) return [];\n return parsed.packages.filter(\n (pattern): pattern is string => typeof pattern === 'string'\n );\n } catch {\n return [];\n }\n}\n\nfunction toManifestPattern(pattern: string): string | null {\n const trimmed = pattern.trim();\n const negated = trimmed.startsWith('!');\n const rawPattern = negated ? trimmed.slice(1) : trimmed;\n if (!rawPattern) return null;\n\n const normalized = path.posix.normalize(rawPattern.replaceAll('\\\\', '/'));\n if (\n path.posix.isAbsolute(normalized) ||\n path.win32.isAbsolute(normalized) ||\n /^[A-Za-z]:/.test(normalized) ||\n containsParentTraversal(normalized) ||\n normalized === '..' ||\n normalized.startsWith('../')\n ) {\n return null;\n }\n\n const withoutTrailingSlash = normalized.replace(/\\/+$/, '');\n const manifestPattern = withoutTrailingSlash.endsWith('/package.json')\n ? withoutTrailingSlash\n : `${withoutTrailingSlash}/package.json`;\n return negated ? `!${manifestPattern}` : manifestPattern;\n}\n\n/** Rejects parent segments, including those hidden in glob alternatives. */\nfunction containsParentTraversal(pattern: string): boolean {\n return /(^|[/{,(|])\\.\\.(?=$|[/},)|])/.test(pattern);\n}\n\nfunction readRealPath(filePath: string): string | undefined {\n try {\n return fs.realpathSync(filePath);\n } catch {\n return undefined;\n }\n}\n\nasync function readRealPathAsync(\n filePath: string\n): Promise<string | undefined> {\n try {\n return await fs.promises.realpath(filePath);\n } catch {\n return undefined;\n }\n}\n\n/** Preserves the historical physical containment check for glob fallbacks. */\nfunction readValidatedManifestPath(\n realRoot: string,\n packagePath: string\n): string | undefined {\n const realPackagePath = readRealPath(packagePath);\n return realPackagePath &&\n isWithinRoot(realRoot, realPackagePath) &&\n !realPackagePath.split(path.sep).includes('node_modules')\n ? realPackagePath\n : undefined;\n}\n\n/** Asynchronous counterpart to {@link readValidatedManifestPath}. */\nasync function readValidatedManifestPathAsync(\n realRoot: string,\n packagePath: string\n): Promise<string | undefined> {\n const realPackagePath = await readRealPathAsync(packagePath);\n return realPackagePath &&\n isWithinRoot(realRoot, realPackagePath) &&\n !realPackagePath.split(path.sep).includes('node_modules')\n ? realPackagePath\n : undefined;\n}\n\nasync function readJavaScriptPackageManifestAsync(\n packagePath: string\n): Promise<JavaScriptPackageManifest | undefined> {\n let file: fs.promises.FileHandle | undefined;\n try {\n const stats = await fs.promises.lstat(packagePath);\n if (!stats.isFile()) return undefined;\n file = await fs.promises.open(packagePath, workspaceManifestOpenFlags());\n const parsed = JSON.parse(await file.readFile('utf8')) as unknown;\n return isRecord(parsed) ? (parsed as JavaScriptPackageManifest) : undefined;\n } catch {\n return undefined;\n } finally {\n await file?.close();\n }\n}\n\n/** Reads a workspace manifest without following a manifest-file symlink. */\nfunction readWorkspacePackageManifest(\n packagePath: string\n): JavaScriptPackageManifest | undefined {\n let descriptor: number | undefined;\n try {\n if (!fs.lstatSync(packagePath).isFile()) return undefined;\n descriptor = fs.openSync(packagePath, workspaceManifestOpenFlags());\n const parsed = JSON.parse(fs.readFileSync(descriptor, 'utf8')) as unknown;\n return isRecord(parsed) ? (parsed as JavaScriptPackageManifest) : undefined;\n } catch {\n return undefined;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n}\n\n/** Prevents a shallow workspace candidate from redirecting its manifest. */\nfunction workspaceManifestOpenFlags(): number {\n return fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0);\n}\n\n/** Maps filesystem work concurrently without exhausting file descriptors. */\nasync function mapWithConcurrency<Input, Output>(\n values: readonly Input[],\n concurrency: number,\n mapper: (value: Input) => Promise<Output>\n): Promise<Output[]> {\n const results = Array.from({ length: values.length }) as Output[];\n let nextIndex = 0;\n const worker = async () => {\n while (nextIndex < values.length) {\n const index = nextIndex;\n nextIndex += 1;\n results[index] = await mapper(values[index]!);\n }\n };\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, () => worker())\n );\n return results;\n}\n\nfunction isWithinRoot(root: string, candidate: string): boolean {\n const relativePath = path.relative(path.resolve(root), candidate);\n return (\n relativePath !== '' &&\n relativePath !== '..' &&\n !relativePath.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relativePath)\n );\n}\n\n/** Checks physical containment while allowing the project root itself. */\nfunction isWithinOrEqualRoot(root: string, candidate: string): boolean {\n return (\n path.resolve(root) === path.resolve(candidate) ||\n isWithinRoot(root, candidate)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction comparePaths(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { JavaScriptPackageManifest } from './manifest.js';
2
+ export type PublicImportEntry = {
3
+ entry: string;
4
+ specifier: string;
5
+ };
6
+ export type PublicGTImport = PublicImportEntry & {
7
+ exportNames: ReadonlySet<string>;
8
+ };
9
+ /**
10
+ * Returns whether a local package publicly exposes a gt-vue-derived value.
11
+ *
12
+ * Merely using gt-vue inside a package does not make every consumer a Vue
13
+ * application. This check starts at public import entrypoints and follows the
14
+ * same local ESM provenance graph as source extraction, so only an API that a
15
+ * consumer can actually import propagates Vue ownership.
16
+ */
17
+ export declare function packagePubliclyExposesGT(packageDirectory: string, manifest: JavaScriptPackageManifest): boolean;
18
+ /** Resolves every public import entry and retains its GT-derived export names. */
19
+ export declare function readPublicGTImports(packageDirectory: string, manifest: JavaScriptPackageManifest): PublicGTImport[];
20
+ /** Resolves a package's public ESM import entries without executing code. */
21
+ export declare function readPublicImportEntries(packageDirectory: string, manifest: JavaScriptPackageManifest): PublicImportEntry[];