@ivorycanvas/qamap 0.3.1 → 0.3.3

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.
@@ -0,0 +1,17 @@
1
+ export interface ImportImpact {
2
+ surface: string;
3
+ changedFile: string;
4
+ hops: number;
5
+ chain: string[];
6
+ }
7
+ export interface ChangedFileExpansion {
8
+ files: string[];
9
+ via: Record<string, string[]>;
10
+ }
11
+ interface ReverseImportIndex {
12
+ importersOf: Map<string, Set<string>>;
13
+ }
14
+ export declare function buildReverseImportIndex(rootInput: string): Promise<ReverseImportIndex>;
15
+ export declare function findImportingSurfaces(index: ReverseImportIndex, changedFiles: string[], isSurface: (file: string) => boolean, maxHops?: number): ImportImpact[];
16
+ export declare function expandChangedFilesWithImporters(rootInput: string, changedFiles: string[], maxHops?: number): Promise<ChangedFileExpansion>;
17
+ export {};
@@ -0,0 +1,308 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ const maxGraphFiles = 12000;
4
+ const maxSourceBytes = 300_000;
5
+ const defaultMaxHops = 2;
6
+ const maxImpactSurfaces = 6;
7
+ const maxExpandedImporters = 40;
8
+ const sourceExtensions = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts", ".vue", ".svelte"]);
9
+ const resolvableExtensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts", ".vue", ".svelte"];
10
+ const ignoredDirectories = new Set([
11
+ ".git",
12
+ ".hg",
13
+ ".svn",
14
+ "node_modules",
15
+ "dist",
16
+ "build",
17
+ "out",
18
+ "coverage",
19
+ ".next",
20
+ ".nuxt",
21
+ ".turbo",
22
+ ".cache",
23
+ ".expo",
24
+ "vendor",
25
+ ]);
26
+ const importSpecifierMatcher = /(?:import|export)\s+(?:[\s\S]*?from\s+)?["']([^"'\n]+)["']|require\(\s*["']([^"'\n]+)["']\s*\)|import\(\s*["']([^"'\n]+)["']\s*\)/g;
27
+ // Per-process cache: safe because the CLI is one-shot per invocation. Callers that
28
+ // mutate source files and re-plan within one process will see a stale graph.
29
+ const indexCache = new Map();
30
+ const maxCachedIndexes = 8;
31
+ export async function buildReverseImportIndex(rootInput) {
32
+ const root = path.resolve(rootInput);
33
+ const cached = indexCache.get(root);
34
+ if (cached) {
35
+ return cached;
36
+ }
37
+ const pending = buildReverseImportIndexUncached(root);
38
+ if (indexCache.size >= maxCachedIndexes) {
39
+ indexCache.clear();
40
+ }
41
+ indexCache.set(root, pending);
42
+ return pending;
43
+ }
44
+ async function buildReverseImportIndexUncached(root) {
45
+ const { sourceFiles, packageJsonFiles } = await collectSourceFiles(root);
46
+ const fileSet = new Set(sourceFiles);
47
+ const tsconfigPaths = await readTsconfigPaths(root);
48
+ const workspacePackages = await readWorkspacePackages(root, packageJsonFiles);
49
+ const importersOf = new Map();
50
+ for (const file of sourceFiles) {
51
+ let text;
52
+ try {
53
+ const stats = await fs.stat(path.join(root, file));
54
+ if (stats.size > maxSourceBytes) {
55
+ continue;
56
+ }
57
+ text = await fs.readFile(path.join(root, file), "utf8");
58
+ }
59
+ catch {
60
+ continue;
61
+ }
62
+ for (const match of text.matchAll(importSpecifierMatcher)) {
63
+ const specifier = match[1] ?? match[2] ?? match[3];
64
+ const resolved = resolveImportSpecifier(specifier, file, fileSet, tsconfigPaths, workspacePackages);
65
+ if (!resolved || resolved === file) {
66
+ continue;
67
+ }
68
+ let importers = importersOf.get(resolved);
69
+ if (!importers) {
70
+ importers = new Set();
71
+ importersOf.set(resolved, importers);
72
+ }
73
+ importers.add(file);
74
+ }
75
+ }
76
+ return { importersOf };
77
+ }
78
+ export function findImportingSurfaces(index, changedFiles, isSurface, maxHops = defaultMaxHops) {
79
+ const impacts = [];
80
+ const seenSurfaces = new Set();
81
+ for (const changedFile of changedFiles) {
82
+ if (isSurface(changedFile)) {
83
+ continue;
84
+ }
85
+ for (const reached of walkImporters(index, changedFile, maxHops)) {
86
+ if (!isSurface(reached.file) || seenSurfaces.has(reached.file)) {
87
+ continue;
88
+ }
89
+ seenSurfaces.add(reached.file);
90
+ impacts.push({
91
+ surface: reached.file,
92
+ changedFile,
93
+ hops: reached.hops,
94
+ chain: reached.chain,
95
+ });
96
+ if (impacts.length >= maxImpactSurfaces) {
97
+ return impacts;
98
+ }
99
+ }
100
+ }
101
+ return impacts;
102
+ }
103
+ export async function expandChangedFilesWithImporters(rootInput, changedFiles, maxHops = defaultMaxHops) {
104
+ if (changedFiles.length === 0) {
105
+ return { files: [], via: {} };
106
+ }
107
+ const index = await buildReverseImportIndex(rootInput);
108
+ const via = {};
109
+ const expanded = [...changedFiles];
110
+ const known = new Set(changedFiles);
111
+ for (const changedFile of changedFiles) {
112
+ for (const reached of walkImporters(index, changedFile, maxHops)) {
113
+ if (known.has(reached.file)) {
114
+ continue;
115
+ }
116
+ known.add(reached.file);
117
+ expanded.push(reached.file);
118
+ via[reached.file] = reached.chain;
119
+ if (expanded.length - changedFiles.length >= maxExpandedImporters) {
120
+ return { files: expanded, via };
121
+ }
122
+ }
123
+ }
124
+ return { files: expanded, via };
125
+ }
126
+ function* walkImporters(index, startFile, maxHops) {
127
+ const visited = new Set([startFile]);
128
+ let frontier = [{ file: startFile, chain: [startFile] }];
129
+ for (let hop = 1; hop <= maxHops; hop += 1) {
130
+ const nextFrontier = [];
131
+ for (const entry of frontier) {
132
+ for (const importer of index.importersOf.get(entry.file) ?? []) {
133
+ if (visited.has(importer)) {
134
+ continue;
135
+ }
136
+ visited.add(importer);
137
+ const chain = [...entry.chain, importer];
138
+ yield { file: importer, hops: hop, chain };
139
+ nextFrontier.push({ file: importer, chain });
140
+ }
141
+ }
142
+ frontier = nextFrontier;
143
+ if (frontier.length === 0) {
144
+ return;
145
+ }
146
+ }
147
+ }
148
+ async function collectSourceFiles(root) {
149
+ const sourceFiles = [];
150
+ const packageJsonFiles = [];
151
+ const queue = [""];
152
+ while (queue.length > 0 && sourceFiles.length < maxGraphFiles) {
153
+ const relativeDir = queue.shift();
154
+ let entries;
155
+ try {
156
+ entries = await fs.readdir(path.join(root, relativeDir), { withFileTypes: true });
157
+ }
158
+ catch {
159
+ continue;
160
+ }
161
+ for (const entry of entries) {
162
+ if (sourceFiles.length >= maxGraphFiles) {
163
+ break;
164
+ }
165
+ const relativePath = relativeDir ? `${relativeDir}/${entry.name}` : entry.name;
166
+ if (entry.isDirectory()) {
167
+ if (!ignoredDirectories.has(entry.name) && !entry.name.startsWith(".")) {
168
+ queue.push(relativePath);
169
+ }
170
+ continue;
171
+ }
172
+ if (!entry.isFile()) {
173
+ continue;
174
+ }
175
+ if (entry.name === "package.json") {
176
+ packageJsonFiles.push(relativePath);
177
+ continue;
178
+ }
179
+ if (sourceExtensions.has(path.extname(entry.name))) {
180
+ sourceFiles.push(relativePath);
181
+ }
182
+ }
183
+ }
184
+ return { sourceFiles, packageJsonFiles };
185
+ }
186
+ async function readWorkspacePackages(root, packageJsonFiles) {
187
+ const byName = new Map();
188
+ for (const file of packageJsonFiles.slice(0, 200)) {
189
+ try {
190
+ const parsed = JSON.parse(await fs.readFile(path.join(root, file), "utf8"));
191
+ const directory = path.posix.dirname(toPosix(file));
192
+ if (parsed.name && directory !== ".") {
193
+ byName.set(parsed.name, directory);
194
+ }
195
+ }
196
+ catch {
197
+ continue;
198
+ }
199
+ }
200
+ return { byName };
201
+ }
202
+ async function readTsconfigPaths(root) {
203
+ const empty = { baseUrl: "", patterns: [] };
204
+ for (const candidate of ["tsconfig.json", "jsconfig.json"]) {
205
+ let raw;
206
+ try {
207
+ raw = await fs.readFile(path.join(root, candidate), "utf8");
208
+ }
209
+ catch {
210
+ continue;
211
+ }
212
+ try {
213
+ const withoutComments = raw.replace(/\/\/[^\n]*/g, "").replace(/\/\*[\s\S]*?\*\//g, "").replace(/,\s*([}\]])/g, "$1");
214
+ const parsed = JSON.parse(withoutComments);
215
+ const baseUrl = normalizeRelativePath(parsed.compilerOptions?.baseUrl ?? "");
216
+ const patterns = [];
217
+ for (const [pattern, targets] of Object.entries(parsed.compilerOptions?.paths ?? {})) {
218
+ const starIndex = pattern.indexOf("*");
219
+ patterns.push({
220
+ prefix: starIndex === -1 ? pattern : pattern.slice(0, starIndex),
221
+ suffix: starIndex === -1 ? "" : pattern.slice(starIndex + 1),
222
+ targets: targets.map((target) => normalizeRelativePath(path.posix.join(baseUrl, target))),
223
+ });
224
+ }
225
+ return { baseUrl, patterns };
226
+ }
227
+ catch {
228
+ return empty;
229
+ }
230
+ }
231
+ return empty;
232
+ }
233
+ function resolveImportSpecifier(specifier, importerFile, fileSet, tsconfigPaths, workspacePackages) {
234
+ if (!specifier || specifier.startsWith("http:") || specifier.startsWith("https:")) {
235
+ return undefined;
236
+ }
237
+ if (specifier.startsWith(".")) {
238
+ const base = path.posix.normalize(path.posix.join(path.posix.dirname(toPosix(importerFile)), specifier));
239
+ return probeFile(base, fileSet);
240
+ }
241
+ for (const pattern of tsconfigPaths.patterns) {
242
+ if (!specifier.startsWith(pattern.prefix)) {
243
+ continue;
244
+ }
245
+ if (pattern.suffix && !specifier.endsWith(pattern.suffix)) {
246
+ continue;
247
+ }
248
+ const middle = specifier.slice(pattern.prefix.length, pattern.suffix ? -pattern.suffix.length : undefined);
249
+ for (const target of pattern.targets) {
250
+ const candidate = normalizeRelativePath(target.replace("*", middle));
251
+ const resolved = probeFile(candidate, fileSet);
252
+ if (resolved) {
253
+ return resolved;
254
+ }
255
+ }
256
+ }
257
+ return resolveWorkspaceSpecifier(specifier, fileSet, workspacePackages);
258
+ }
259
+ function resolveWorkspaceSpecifier(specifier, fileSet, workspacePackages) {
260
+ const slashIndex = specifier.startsWith("@") ? specifier.indexOf("/", specifier.indexOf("/") + 1) : specifier.indexOf("/");
261
+ const packageName = slashIndex === -1 ? specifier : specifier.slice(0, slashIndex);
262
+ const packageDir = workspacePackages.byName.get(packageName);
263
+ if (!packageDir) {
264
+ return undefined;
265
+ }
266
+ const remainder = slashIndex === -1 ? "" : specifier.slice(slashIndex + 1);
267
+ const candidates = remainder
268
+ ? [`${packageDir}/${remainder}`, `${packageDir}/src/${remainder}`]
269
+ : [`${packageDir}/index`, `${packageDir}/src/index`];
270
+ for (const candidate of candidates) {
271
+ const resolved = probeFile(candidate, fileSet);
272
+ if (resolved) {
273
+ return resolved;
274
+ }
275
+ }
276
+ return undefined;
277
+ }
278
+ function probeFile(baseCandidate, fileSet) {
279
+ const candidate = normalizeRelativePath(baseCandidate);
280
+ if (!candidate) {
281
+ return undefined;
282
+ }
283
+ if (fileSet.has(candidate)) {
284
+ return candidate;
285
+ }
286
+ const withoutJsExtension = candidate.replace(/\.(?:js|mjs|cjs|jsx)$/, "");
287
+ for (const base of withoutJsExtension === candidate ? [candidate] : [candidate, withoutJsExtension]) {
288
+ for (const extension of resolvableExtensions) {
289
+ if (fileSet.has(`${base}${extension}`)) {
290
+ return `${base}${extension}`;
291
+ }
292
+ }
293
+ for (const extension of resolvableExtensions) {
294
+ if (fileSet.has(`${base}/index${extension}`)) {
295
+ return `${base}/index${extension}`;
296
+ }
297
+ }
298
+ }
299
+ return undefined;
300
+ }
301
+ function normalizeRelativePath(value) {
302
+ const normalized = path.posix.normalize(toPosix(value)).replace(/^\.\/?/, "");
303
+ return normalized === "." ? "" : normalized;
304
+ }
305
+ function toPosix(value) {
306
+ return value.replace(/\\/g, "/");
307
+ }
308
+ //# sourceMappingURL=import-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-graph.js","sourceRoot":"","sources":["../src/import-graph.ts"],"names":[],"mappings":"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"}
package/dist/manifest.js CHANGED
@@ -457,7 +457,7 @@ async function validateFlowDefinitions(manifest, manifestRoot, issues) {
457
457
  }
458
458
  checkIds.add(check.id);
459
459
  if (!check.title.trim()) {
460
- issues.push(issue("error", `${checkPath}.title`, "Check title is empty.", "Write the behavior the draft must prove, such as `Submit content URL successfully`."));
460
+ issues.push(issue("error", `${checkPath}.title`, "Check title is empty.", "Write the behavior the draft must prove, such as `Submit media link successfully`."));
461
461
  }
462
462
  }
463
463
  const anchorKeys = new Set();