depvitals 0.2.0 → 0.4.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 (89) hide show
  1. package/README.md +95 -30
  2. package/dist/cli/entry.js +8 -21
  3. package/dist/cli/entry.js.map +1 -1
  4. package/dist/cli/parseCliArgs.d.ts +5 -2
  5. package/dist/cli/parseCliArgs.d.ts.map +1 -1
  6. package/dist/cli/parseCliArgs.js +51 -36
  7. package/dist/cli/parseCliArgs.js.map +1 -1
  8. package/dist/cli/runCli.d.ts +4 -5
  9. package/dist/cli/runCli.d.ts.map +1 -1
  10. package/dist/cli/runCli.js +41 -46
  11. package/dist/cli/runCli.js.map +1 -1
  12. package/dist/config/ignoreDependencies.d.ts +9 -0
  13. package/dist/config/ignoreDependencies.d.ts.map +1 -0
  14. package/dist/config/ignoreDependencies.js +22 -0
  15. package/dist/config/ignoreDependencies.js.map +1 -0
  16. package/dist/config/ignorePaths.d.ts +13 -0
  17. package/dist/config/ignorePaths.d.ts.map +1 -0
  18. package/dist/config/ignorePaths.js +47 -0
  19. package/dist/config/ignorePaths.js.map +1 -0
  20. package/dist/config/projectConfigError.d.ts +7 -0
  21. package/dist/config/projectConfigError.d.ts.map +1 -0
  22. package/dist/config/projectConfigError.js +10 -0
  23. package/dist/config/projectConfigError.js.map +1 -0
  24. package/dist/config/readProjectConfig.d.ts +28 -0
  25. package/dist/config/readProjectConfig.d.ts.map +1 -0
  26. package/dist/config/readProjectConfig.js +120 -0
  27. package/dist/config/readProjectConfig.js.map +1 -0
  28. package/dist/core/analyzeProject.d.ts +40 -1
  29. package/dist/core/analyzeProject.d.ts.map +1 -1
  30. package/dist/core/analyzeProject.js +189 -45
  31. package/dist/core/analyzeProject.js.map +1 -1
  32. package/dist/core/evidence.d.ts +67 -0
  33. package/dist/core/evidence.d.ts.map +1 -0
  34. package/dist/core/evidence.js +115 -0
  35. package/dist/core/evidence.js.map +1 -0
  36. package/dist/core/scanContext.d.ts +20 -0
  37. package/dist/core/scanContext.d.ts.map +1 -0
  38. package/dist/core/scanContext.js +43 -0
  39. package/dist/core/scanContext.js.map +1 -0
  40. package/dist/detectors/eslintManifestConfig.d.ts +18 -0
  41. package/dist/detectors/eslintManifestConfig.d.ts.map +1 -1
  42. package/dist/detectors/eslintManifestConfig.js +62 -80
  43. package/dist/detectors/eslintManifestConfig.js.map +1 -1
  44. package/dist/detectors/eslintRcJsonConfig.d.ts +8 -2
  45. package/dist/detectors/eslintRcJsonConfig.d.ts.map +1 -1
  46. package/dist/detectors/eslintRcJsonConfig.js +27 -12
  47. package/dist/detectors/eslintRcJsonConfig.js.map +1 -1
  48. package/dist/detectors/jestManifestConfig.d.ts +15 -3
  49. package/dist/detectors/jestManifestConfig.d.ts.map +1 -1
  50. package/dist/detectors/jestManifestConfig.js +63 -83
  51. package/dist/detectors/jestManifestConfig.js.map +1 -1
  52. package/dist/reporters/jsonReporter.d.ts +39 -0
  53. package/dist/reporters/jsonReporter.d.ts.map +1 -0
  54. package/dist/reporters/jsonReporter.js +91 -0
  55. package/dist/reporters/jsonReporter.js.map +1 -0
  56. package/dist/reporters/terminalReporter.d.ts +15 -4
  57. package/dist/reporters/terminalReporter.d.ts.map +1 -1
  58. package/dist/reporters/terminalReporter.js +64 -4
  59. package/dist/reporters/terminalReporter.js.map +1 -1
  60. package/dist/scanner/moduleSpecifiers.d.ts +12 -2
  61. package/dist/scanner/moduleSpecifiers.d.ts.map +1 -1
  62. package/dist/scanner/moduleSpecifiers.js +1154 -183
  63. package/dist/scanner/moduleSpecifiers.js.map +1 -1
  64. package/dist/scanner/packageSpecifier.d.ts +26 -2
  65. package/dist/scanner/packageSpecifier.d.ts.map +1 -1
  66. package/dist/scanner/packageSpecifier.js +70 -2
  67. package/dist/scanner/packageSpecifier.js.map +1 -1
  68. package/dist/scanner/projectManifest.d.ts +28 -3
  69. package/dist/scanner/projectManifest.d.ts.map +1 -1
  70. package/dist/scanner/projectManifest.js +58 -13
  71. package/dist/scanner/projectManifest.js.map +1 -1
  72. package/dist/scanner/scriptUsage.d.ts +15 -1
  73. package/dist/scanner/scriptUsage.d.ts.map +1 -1
  74. package/dist/scanner/scriptUsage.js +284 -69
  75. package/dist/scanner/scriptUsage.js.map +1 -1
  76. package/dist/scanner/sourceFiles.d.ts +21 -2
  77. package/dist/scanner/sourceFiles.d.ts.map +1 -1
  78. package/dist/scanner/sourceFiles.js +19 -6
  79. package/dist/scanner/sourceFiles.js.map +1 -1
  80. package/package.json +4 -2
  81. package/schemas/README.md +47 -0
  82. package/schemas/examples/README.md +27 -0
  83. package/schemas/examples/explain-excluded.json +53 -0
  84. package/schemas/examples/explain-missing.json +65 -0
  85. package/schemas/examples/explain-node-preload.json +70 -0
  86. package/schemas/examples/explain-unknown.json +53 -0
  87. package/schemas/examples/scan-clean.json +40 -0
  88. package/schemas/examples/scan-findings.json +80 -0
  89. package/schemas/report-v1.schema.json +376 -0
@@ -48,11 +48,13 @@
48
48
  */
49
49
  import { readFile } from 'node:fs/promises';
50
50
  import { dirname } from 'node:path';
51
- import { loadPackageTypeHint, loadProjectManifest } from '../scanner/projectManifest.js';
51
+ import { loadPackageScope, loadProjectManifest, } from '../scanner/projectManifest.js';
52
52
  import { discoverSourceFiles } from '../scanner/sourceFiles.js';
53
- import { extractModuleSpecifiers } from '../scanner/moduleSpecifiers.js';
54
- import { classifyPackageSpecifier } from '../scanner/packageSpecifier.js';
55
- import { findPackageScriptUsage } from '../scanner/scriptUsage.js';
53
+ import { collectModuleSpecifiers, } from '../scanner/moduleSpecifiers.js';
54
+ import { classifyPackageSpecifier, isPackageSelfReference } from '../scanner/packageSpecifier.js';
55
+ import { collectPackageScriptUsage } from '../scanner/scriptUsage.js';
56
+ import { isExactPackageRoot } from '../config/ignoreDependencies.js';
57
+ import { declarationGroupsFor, evidencePath, FINDING_CATEGORIES, sortedUniqueEvidence, } from './evidence.js';
56
58
  /**
57
59
  * Operational error for the dependency-analysis engine.
58
60
  *
@@ -76,26 +78,118 @@ export class AnalysisError extends Error {
76
78
  * project is never written to.
77
79
  *
78
80
  * @param projectRoot - Directory to analyze.
79
- * @param options - Optional {@link ConfigUsageHints}; an omitted or empty set changes nothing.
81
+ * @param options - Optional static tool hints and validated source exclusions; omitted inputs change nothing.
80
82
  * @throws {AnalysisError} when a discovered source file cannot be read or cannot be safely analyzed.
81
83
  * @throws {ProjectManifestError} when the manifest is missing, unreadable, invalid or malformed.
82
84
  * @throws {SourceFilesError} when the root is missing, is not a directory, or cannot be read.
83
85
  */
84
86
  export async function analyzeProject(projectRoot, options = {}) {
85
87
  const manifest = await loadProjectManifest(projectRoot);
86
- const sourceFiles = await discoverSourceFiles(manifest.root);
88
+ const usage = await collectUsage(manifest, options.ignorePaths);
89
+ // Legacy names-only hints keep their finding semantics without creating fictional provenance.
90
+ const used = unionNames([
91
+ [...usage.usedNames],
92
+ [...normalizeConfigHints(options.configUsedNames)],
93
+ ]);
94
+ const underlying = classifyFindings(manifest, usage.sourceUsedNames, used);
95
+ return legacyResult(manifest.root, applyDependencyPolicy(underlying, new Set(options.ignoreDependencies ?? [])));
96
+ }
97
+ /** Keep the small CLI/legacy result projection while collecting the same complete scan facts. */
98
+ export async function analyzeProjectWithContext(context) {
99
+ return projectAnalysisResult(await analyzeProjectDetailed(context));
100
+ }
101
+ /** Detailed analysis accepts eligible typed facts only, never the legacy names-only hint seam. */
102
+ export async function analyzeProjectDetailed(context) {
103
+ const { manifest, config } = context;
104
+ const usage = await collectUsage(manifest, config.ignorePaths, context.configEvidence);
105
+ const underlyingFindings = classifyFindings(manifest, usage.sourceUsedNames, usage.usedNames);
106
+ const ignored = new Set(config.ignoreDependencies);
107
+ const findings = applyDependencyPolicy(underlyingFindings, ignored);
108
+ return {
109
+ projectRoot: manifest.root,
110
+ manifest,
111
+ config,
112
+ underlyingFindings,
113
+ findings,
114
+ packages: packageFacts(manifest, usage.evidence, ignored, underlyingFindings, findings),
115
+ };
116
+ }
117
+ /** Pure legacy projection; no collection, reclassification or input reads. */
118
+ export function projectAnalysisResult(result) {
119
+ return legacyResult(result.projectRoot, result.findings);
120
+ }
121
+ /** Project only completed scan facts. This function performs no collection or resolution. */
122
+ export function projectPackageExplanation(result, packageName) {
123
+ if (!isExactPackageRoot(packageName)) {
124
+ throw new TypeError('Invalid value for --explain: expected an exact package root (name or @scope/name), at most 214 characters.');
125
+ }
126
+ const selected = result.packages.find((pkg) => pkg.name === packageName);
127
+ const known = selected !== undefined;
128
+ const pkg = selected ?? {
129
+ name: packageName,
130
+ status: 'unknown',
131
+ declaredIn: [],
132
+ excluded: false,
133
+ underlyingFindings: [],
134
+ findings: [],
135
+ evidence: [],
136
+ };
137
+ const findings = {
138
+ unusedDependencies: result.findings.unusedDependencies.filter((name) => name === packageName),
139
+ unusedDevDependencies: result.findings.unusedDevDependencies.filter((name) => name === packageName),
140
+ missingDependencies: result.findings.missingDependencies.filter((name) => name === packageName),
141
+ };
142
+ const counts = {
143
+ unusedDependencies: findings.unusedDependencies.length,
144
+ unusedDevDependencies: findings.unusedDevDependencies.length,
145
+ missingDependencies: findings.missingDependencies.length,
146
+ };
147
+ return {
148
+ projectRoot: result.projectRoot,
149
+ config: result.config,
150
+ findings,
151
+ counts,
152
+ packages: [pkg],
153
+ query: { packageName, known },
154
+ exitCode: !known || Object.values(counts).some((count) => count > 0) ? 1 : 0,
155
+ };
156
+ }
157
+ async function collectUsage(manifest, ignorePaths, configFacts = []) {
158
+ const evidence = new Map();
159
+ const add = (name, fact) => {
160
+ const facts = evidence.get(name);
161
+ if (facts === undefined)
162
+ evidence.set(name, [fact]);
163
+ else
164
+ facts.push(fact);
165
+ };
166
+ const sourceFiles = await discoverSourceFiles(manifest.root, {
167
+ ignorePaths,
168
+ });
87
169
  // External package roots referenced by source files, collapsed to their package root.
88
170
  const sourceUsedNames = new Set();
89
- const packageTypeByDirectory = new Map([
90
- [manifest.root, manifest.packageType],
171
+ // Seed the selected root so scope lookup never consults a parent outside the scan.
172
+ const scopeByDirectory = new Map([
173
+ [manifest.root, { packageType: manifest.packageType, selfReference: manifest.selfReference }],
91
174
  ]);
92
175
  for (const file of sourceFiles) {
93
- const packageType = await packageTypeForFile(file, manifest.root, packageTypeByDirectory);
94
- const specifiers = await readAndExtract(file, packageType);
95
- for (const specifier of specifiers) {
176
+ const scope = await packageScopeForDirectory(dirname(file), scopeByDirectory);
177
+ const occurrences = await readAndExtract(file, scope.packageType);
178
+ const relativeFile = evidencePath(manifest.root, file);
179
+ for (const occurrence of occurrences) {
180
+ const specifier = occurrence.specifier;
181
+ if (isPackageSelfReference(specifier, scope.selfReference))
182
+ continue;
96
183
  const classified = classifyPackageSpecifier(specifier);
97
184
  if (classified.kind === 'external') {
98
185
  sourceUsedNames.add(classified.packageName);
186
+ add(classified.packageName, {
187
+ kind: 'source',
188
+ file: relativeFile,
189
+ reference: occurrence.kind,
190
+ specifier,
191
+ position: occurrence.position,
192
+ });
99
193
  }
100
194
  }
101
195
  }
@@ -105,42 +199,89 @@ export async function analyzeProject(projectRoot, options = {}) {
105
199
  Object.keys(manifest.dependencies),
106
200
  Object.keys(manifest.devDependencies),
107
201
  ]);
108
- const scriptUsedNames = findPackageScriptUsage(manifest.scripts, declaredCandidates);
109
- // Configuration evidence never reaches `sourceUsedNames`, which is the only input able to produce
110
- // a missing finding; it can only make `usedNames` bigger and therefore suppress unused findings.
111
- const configUsedNames = normalizeConfigHints(options.configUsedNames);
112
- const usedNames = unionNames([[...sourceUsedNames], [...scriptUsedNames], [...configUsedNames]]);
113
- const unusedDependencies = declaredMinus(Object.keys(manifest.dependencies), usedNames);
114
- const unusedDevDependencies = declaredMinus(Object.keys(manifest.devDependencies), usedNames);
115
- // An external root is missing only when it is absent from every declared dependency section.
116
- // Peer/optional declarations therefore suppress false missing results.
117
- const missingDependencies = declaredMinus([...sourceUsedNames], manifest.declaredDependencyNames);
202
+ for (const fact of collectPackageScriptUsage(manifest.scripts, declaredCandidates)) {
203
+ add(fact.packageName, fact.evidence);
204
+ }
205
+ for (const fact of configFacts) {
206
+ // Config facts cannot enlarge the external inventory with undeclared packages.
207
+ if (manifest.declaredDependencyNames.has(fact.packageName))
208
+ add(fact.packageName, fact.evidence);
209
+ }
210
+ return { sourceUsedNames, usedNames: new Set(evidence.keys()), evidence };
211
+ }
212
+ /** Existing formulas, evaluated against full inventory before dependency exclusions. */
213
+ function classifyFindings(manifest, sourceUsedNames, usedNames) {
118
214
  return {
119
- projectRoot: manifest.root,
120
- unusedDependencies,
121
- unusedDevDependencies,
122
- missingDependencies,
215
+ unusedDependencies: declaredMinus(Object.keys(manifest.dependencies), usedNames),
216
+ unusedDevDependencies: declaredMinus(Object.keys(manifest.devDependencies), usedNames),
217
+ missingDependencies: declaredMinus([...sourceUsedNames], manifest.declaredDependencyNames),
218
+ };
219
+ }
220
+ function applyDependencyPolicy(underlying, ignored) {
221
+ return {
222
+ unusedDependencies: underlying.unusedDependencies.filter((name) => !ignored.has(name)),
223
+ unusedDevDependencies: underlying.unusedDevDependencies.filter((name) => !ignored.has(name)),
224
+ missingDependencies: underlying.missingDependencies.filter((name) => !ignored.has(name)),
225
+ };
226
+ }
227
+ function legacyResult(projectRoot, findings) {
228
+ return {
229
+ projectRoot,
230
+ unusedDependencies: findings.unusedDependencies,
231
+ unusedDevDependencies: findings.unusedDevDependencies,
232
+ missingDependencies: findings.missingDependencies,
123
233
  };
124
234
  }
235
+ function categoryMembership(findings) {
236
+ return {
237
+ unusedDependencies: new Set(findings.unusedDependencies),
238
+ unusedDevDependencies: new Set(findings.unusedDevDependencies),
239
+ missingDependencies: new Set(findings.missingDependencies),
240
+ };
241
+ }
242
+ function packageFacts(manifest, evidenceByPackage, ignored, underlying, visible) {
243
+ const underlyingMembership = categoryMembership(underlying);
244
+ const visibleMembership = categoryMembership(visible);
245
+ const names = unionNames([
246
+ [...manifest.declaredDependencyNames],
247
+ [...evidenceByPackage.keys()],
248
+ [...ignored],
249
+ ]);
250
+ return [...names].map((name) => {
251
+ const declaredIn = declarationGroupsFor(name, manifest);
252
+ const excluded = ignored.has(name);
253
+ const underlyingFindings = FINDING_CATEGORIES.filter((category) => underlyingMembership[category].has(name));
254
+ const findings = FINDING_CATEGORIES.filter((category) => visibleMembership[category].has(name));
255
+ const evidence = sortedUniqueEvidence(evidenceByPackage.get(name) ?? []);
256
+ const status = excluded
257
+ ? 'excluded'
258
+ : underlyingFindings.includes('missingDependencies')
259
+ ? 'missing'
260
+ : underlyingFindings.length > 0
261
+ ? 'unused'
262
+ : evidence.length > 0
263
+ ? 'used'
264
+ : declaredIn.length > 0
265
+ ? 'declared'
266
+ : 'unknown';
267
+ return { name, status, declaredIn, excluded, underlyingFindings, findings, evidence };
268
+ });
269
+ }
125
270
  /**
126
271
  * Resolve the nearest package scope for one discovered source file.
127
272
  *
128
273
  * An existing nested `package.json` starts a new scope even when it omits `type`; directories
129
- * without one inherit their parent. Results are cached per directory for the rest of the scan.
274
+ * without one inherit their parent. Ownership and module mode share this walk and cache. The
275
+ * selected root is always seeded before lookup, so traversal stops there.
130
276
  */
131
- async function packageTypeForFile(file, projectRoot, cache) {
132
- return packageTypeForDirectory(dirname(file), projectRoot, cache);
133
- }
134
- async function packageTypeForDirectory(directory, projectRoot, cache) {
135
- if (cache.has(directory)) {
136
- return cache.get(directory);
137
- }
138
- const hint = await loadPackageTypeHint(directory);
139
- const packageType = hint === undefined
140
- ? await packageTypeForDirectory(dirname(directory), projectRoot, cache)
141
- : hint.packageType;
142
- cache.set(directory, packageType);
143
- return packageType;
277
+ async function packageScopeForDirectory(directory, cache) {
278
+ const cached = cache.get(directory);
279
+ if (cached !== undefined)
280
+ return cached;
281
+ const ownScope = await loadPackageScope(directory);
282
+ const scope = ownScope ?? (await packageScopeForDirectory(dirname(directory), cache));
283
+ cache.set(directory, scope);
284
+ return scope;
144
285
  }
145
286
  /**
146
287
  * Read a discovered source file and extract its statically known specifiers.
@@ -162,10 +303,10 @@ async function readAndExtract(file, packageType) {
162
303
  * Determine the narrow Node source mode needed for top-level `await`.
163
304
  *
164
305
  * Explicit module extensions win over the package type. CommonJS extensions remain scripts even
165
- * under a module package, while `.js` and `.ts` follow the nearest package scope's exact
166
- * `type: "module"` declaration.
306
+ * under a module package. Ambiguous `.js` scopes use bounded syntax detection; JSX/TypeScript
307
+ * extensions retain the existing nearest-scope `type: "module"` policy.
167
308
  */
168
- function isModuleSource(file, packageType) {
309
+ function sourceModuleMode(file, packageType) {
169
310
  const lower = file.toLowerCase();
170
311
  if (lower.endsWith('.mjs') || lower.endsWith('.mts')) {
171
312
  return true;
@@ -173,6 +314,9 @@ async function readAndExtract(file, packageType) {
173
314
  if (lower.endsWith('.cjs') || lower.endsWith('.cts')) {
174
315
  return false;
175
316
  }
317
+ if (lower.endsWith('.js') && packageType !== 'module' && packageType !== 'commonjs') {
318
+ return 'detect';
319
+ }
176
320
  return ((lower.endsWith('.js') ||
177
321
  lower.endsWith('.jsx') ||
178
322
  lower.endsWith('.ts') ||
@@ -180,11 +324,11 @@ async function readAndExtract(file, packageType) {
180
324
  packageType === 'module');
181
325
  }
182
326
  try {
183
- const occurrences = extractModuleSpecifiers(source, {
327
+ const occurrences = collectModuleSpecifiers(source, {
184
328
  jsx: usesJsxSyntax(file, source),
185
- module: isModuleSource(file, packageType),
329
+ module: sourceModuleMode(file, packageType),
186
330
  });
187
- return occurrences.map((occurrence) => occurrence.specifier);
331
+ return occurrences;
188
332
  }
189
333
  catch (error) {
190
334
  if (error instanceof Error && error.name === 'ModuleSpecifierError') {
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeProject.js","sourceRoot":"","sources":["../../src/core/analyzeProject.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzeProject.js","sourceRoot":"","sources":["../../src/core/analyzeProject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /** Internal fact model. Collection and classification belong to their owning pipeline stages. */
2
+ import * as path from 'node:path';
3
+ import type { ModuleSpecifierKind } from '../scanner/moduleSpecifiers.js';
4
+ import type { DependencyMap } from '../scanner/projectManifest.js';
5
+ export declare const DECLARATION_GROUPS: readonly ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
6
+ export type DeclarationGroup = (typeof DECLARATION_GROUPS)[number];
7
+ export type DeclarationInventory = Readonly<Record<DeclarationGroup, DependencyMap>>;
8
+ export declare const FINDING_CATEGORIES: readonly ["unusedDependencies", "unusedDevDependencies", "missingDependencies"];
9
+ export type FindingCategory = (typeof FINDING_CATEGORIES)[number];
10
+ /** Precedence only; this module does not classify packages or infer usage. */
11
+ export declare const PACKAGE_STATUSES: readonly ["excluded", "missing", "unused", "used", "declared", "unknown"];
12
+ export type PackageStatus = (typeof PACKAGE_STATUSES)[number];
13
+ export declare const SOURCE_REFERENCES: readonly ["import", "export-from", "dynamic-import", "require"];
14
+ export type SourceReference = ModuleSpecifierKind;
15
+ export type SourceEvidence = {
16
+ kind: 'source';
17
+ file: string;
18
+ reference: SourceReference;
19
+ specifier: string;
20
+ /** Original UTF-16 opening-quote offset (zero-based), line and column (one-based). */
21
+ position: {
22
+ offset: number;
23
+ line: number;
24
+ column: number;
25
+ };
26
+ };
27
+ export declare const SCRIPT_VIAS: readonly ["direct", "mapping", "runner", "node-preload"];
28
+ export type ScriptEvidence = {
29
+ kind: 'script';
30
+ file: 'package.json';
31
+ pointer: string;
32
+ command: string;
33
+ via: (typeof SCRIPT_VIAS)[number];
34
+ /** Script-wide accepted external candidate ordinal, before declaration filtering. */
35
+ occurrence: number;
36
+ };
37
+ export declare const CONFIG_DETECTORS: readonly ["eslint", "jest"];
38
+ export type ConfigEvidence = {
39
+ kind: 'config';
40
+ file: string;
41
+ pointer: string;
42
+ value: string;
43
+ detector: (typeof CONFIG_DETECTORS)[number];
44
+ };
45
+ export type Evidence = SourceEvidence | ScriptEvidence | ConfigEvidence;
46
+ export type PackageFact = {
47
+ name: string;
48
+ status: PackageStatus;
49
+ declaredIn: readonly DeclarationGroup[];
50
+ excluded: boolean;
51
+ underlyingFindings: readonly FindingCategory[];
52
+ findings: readonly FindingCategory[];
53
+ evidence: readonly Evidence[];
54
+ };
55
+ /** ECMAScript UTF-16 lexicographic order, independent of the host locale. */
56
+ export declare function compareStrings(a: string, b: string): number;
57
+ /** Own membership only: prototype properties are not declarations. Names remain case-sensitive. */
58
+ export declare function declarationGroupsFor(name: string, inventory: DeclarationInventory): DeclarationGroup[];
59
+ /** Lexical display only. The caller owns filesystem validation and symlink policy. */
60
+ export declare function evidencePath(root: string, file: string, paths?: Pick<typeof path, 'relative' | 'isAbsolute' | 'sep'>): string;
61
+ /** RFC 6901 data pointer, not a URI fragment. An empty token is significant. */
62
+ export declare function jsonPointer(...tokens: readonly string[]): string;
63
+ export declare function compareEvidence(a: Evidence, b: Evidence): number;
64
+ /** Explicit tuples make exact identity independent of object property insertion order. */
65
+ export declare function evidenceIdentity(evidence: Evidence): string;
66
+ export declare function sortedUniqueEvidence(records: readonly Evidence[]): Evidence[];
67
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/core/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /** Internal fact model. Collection and classification belong to their owning pipeline stages. */
2
+ import * as path from 'node:path';
3
+ export const DECLARATION_GROUPS = [
4
+ 'dependencies',
5
+ 'devDependencies',
6
+ 'peerDependencies',
7
+ 'optionalDependencies',
8
+ ];
9
+ export const FINDING_CATEGORIES = [
10
+ 'unusedDependencies',
11
+ 'unusedDevDependencies',
12
+ 'missingDependencies',
13
+ ];
14
+ /** Precedence only; this module does not classify packages or infer usage. */
15
+ export const PACKAGE_STATUSES = [
16
+ 'excluded',
17
+ 'missing',
18
+ 'unused',
19
+ 'used',
20
+ 'declared',
21
+ 'unknown',
22
+ ];
23
+ export const SOURCE_REFERENCES = ['import', 'export-from', 'dynamic-import', 'require'];
24
+ export const SCRIPT_VIAS = ['direct', 'mapping', 'runner', 'node-preload'];
25
+ export const CONFIG_DETECTORS = ['eslint', 'jest'];
26
+ /** ECMAScript UTF-16 lexicographic order, independent of the host locale. */
27
+ export function compareStrings(a, b) {
28
+ return a < b ? -1 : a > b ? 1 : 0;
29
+ }
30
+ /** Own membership only: prototype properties are not declarations. Names remain case-sensitive. */
31
+ export function declarationGroupsFor(name, inventory) {
32
+ return DECLARATION_GROUPS.filter((group) => Object.hasOwn(inventory[group], name));
33
+ }
34
+ /** Lexical display only. The caller owns filesystem validation and symlink policy. */
35
+ export function evidencePath(root, file, paths = path) {
36
+ if (!paths.isAbsolute(root) || !paths.isAbsolute(file)) {
37
+ throw new Error('Evidence paths require an absolute project root and file');
38
+ }
39
+ const relative = paths.relative(root, file);
40
+ const components = relative.split(paths.sep);
41
+ if (paths.isAbsolute(relative) ||
42
+ components.some((part) => part === '' || part === '.' || part === '..')) {
43
+ throw new Error('Evidence file must be inside the project root');
44
+ }
45
+ return components.join('/');
46
+ }
47
+ /** RFC 6901 data pointer, not a URI fragment. An empty token is significant. */
48
+ export function jsonPointer(...tokens) {
49
+ return tokens.map((token) => '/' + token.replaceAll('~', '~0').replaceAll('/', '~1')).join('');
50
+ }
51
+ const EVIDENCE_KINDS = ['source', 'script', 'config'];
52
+ export function compareEvidence(a, b) {
53
+ const common = EVIDENCE_KINDS.indexOf(a.kind) - EVIDENCE_KINDS.indexOf(b.kind) ||
54
+ compareStrings(a.file, b.file);
55
+ if (common !== 0)
56
+ return common;
57
+ if (a.kind === 'source' && b.kind === 'source') {
58
+ return (a.position.offset - b.position.offset ||
59
+ SOURCE_REFERENCES.indexOf(a.reference) - SOURCE_REFERENCES.indexOf(b.reference) ||
60
+ compareStrings(a.specifier, b.specifier) ||
61
+ a.position.line - b.position.line ||
62
+ a.position.column - b.position.column);
63
+ }
64
+ if (a.kind === 'script' && b.kind === 'script') {
65
+ return (compareStrings(a.pointer, b.pointer) ||
66
+ a.occurrence - b.occurrence ||
67
+ SCRIPT_VIAS.indexOf(a.via) - SCRIPT_VIAS.indexOf(b.via) ||
68
+ compareStrings(a.command, b.command));
69
+ }
70
+ if (a.kind === 'config' && b.kind === 'config') {
71
+ return (compareStrings(a.pointer, b.pointer) ||
72
+ CONFIG_DETECTORS.indexOf(a.detector) - CONFIG_DETECTORS.indexOf(b.detector) ||
73
+ compareStrings(a.value, b.value));
74
+ }
75
+ return 0;
76
+ }
77
+ /** Explicit tuples make exact identity independent of object property insertion order. */
78
+ export function evidenceIdentity(evidence) {
79
+ switch (evidence.kind) {
80
+ case 'source':
81
+ return JSON.stringify([
82
+ evidence.kind,
83
+ evidence.file,
84
+ evidence.reference,
85
+ evidence.specifier,
86
+ evidence.position.offset,
87
+ evidence.position.line,
88
+ evidence.position.column,
89
+ ]);
90
+ case 'script':
91
+ return JSON.stringify([
92
+ evidence.kind,
93
+ evidence.file,
94
+ evidence.pointer,
95
+ evidence.command,
96
+ evidence.via,
97
+ evidence.occurrence,
98
+ ]);
99
+ case 'config':
100
+ return JSON.stringify([
101
+ evidence.kind,
102
+ evidence.file,
103
+ evidence.pointer,
104
+ evidence.value,
105
+ evidence.detector,
106
+ ]);
107
+ }
108
+ }
109
+ export function sortedUniqueEvidence(records) {
110
+ const unique = new Map();
111
+ for (const record of records)
112
+ unique.set(evidenceIdentity(record), record);
113
+ return [...unique.values()].sort(compareEvidence);
114
+ }
115
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/core/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /** Internal per-invocation inputs. No global cache or atomic filesystem snapshot is implied. */
2
+ import { type ProjectConfig } from '../config/readProjectConfig.js';
3
+ import { type LegacyEslintPrecedence } from '../detectors/eslintManifestConfig.js';
4
+ import { type ProjectManifest } from '../scanner/projectManifest.js';
5
+ import { type ConfigEvidence } from './evidence.js';
6
+ export type ScanContext = {
7
+ readonly manifest: ProjectManifest;
8
+ readonly rawManifest: Readonly<Record<string, unknown>>;
9
+ readonly config: ProjectConfig;
10
+ readonly rootEntries: readonly string[];
11
+ readonly eslintPrecedence: LegacyEslintPrecedence;
12
+ readonly jestConfigBarrier: boolean;
13
+ readonly configEvidence: readonly {
14
+ readonly packageName: string;
15
+ readonly evidence: ConfigEvidence;
16
+ }[];
17
+ };
18
+ /** Validate root/manifest, then strict policy, then collect only the selected detector sources. */
19
+ export declare function createScanContext(projectRoot: string): Promise<ScanContext>;
20
+ //# sourceMappingURL=scanContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanContext.d.ts","sourceRoot":"","sources":["../../src/core/scanContext.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAAmC,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAErF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;IAClD,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,SAAS;QAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;KACnC,EAAE,CAAC;CACL,CAAC;AAEF,mGAAmG;AACnG,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCjF"}
@@ -0,0 +1,43 @@
1
+ /** Internal per-invocation inputs. No global cache or atomic filesystem snapshot is implied. */
2
+ import { readProjectConfigSnapshot } from '../config/readProjectConfig.js';
3
+ import { collectEslintConfigUsage, legacyEslintPrecedenceFromEntries, } from '../detectors/eslintManifestConfig.js';
4
+ import { collectEslintRcJsonUsageForManifest } from '../detectors/eslintRcJsonConfig.js';
5
+ import { collectJestConfigUsage, hasRootJestConfigEntries, } from '../detectors/jestManifestConfig.js';
6
+ import { loadProjectManifestData } from '../scanner/projectManifest.js';
7
+ import { compareEvidence, compareStrings } from './evidence.js';
8
+ /** Validate root/manifest, then strict policy, then collect only the selected detector sources. */
9
+ export async function createScanContext(projectRoot) {
10
+ const { manifest, raw } = await loadProjectManifestData(projectRoot);
11
+ const { config, rootEntries } = await readProjectConfigSnapshot(manifest.root);
12
+ const eslintPrecedence = legacyEslintPrecedenceFromEntries(rootEntries);
13
+ const jestConfigBarrier = hasRootJestConfigEntries(rootEntries);
14
+ const configEvidence = [];
15
+ if (!eslintPrecedence.hardBarrier) {
16
+ if (eslintPrecedence.legacyRcJsonEntryName !== undefined) {
17
+ const occurrences = await collectEslintRcJsonUsageForManifest(manifest, eslintPrecedence);
18
+ for (const occurrence of occurrences)
19
+ configEvidence.push(occurrence);
20
+ }
21
+ else if (!eslintPrecedence.legacyRcByName) {
22
+ const occurrences = collectEslintConfigUsage(raw['eslintConfig'], manifest.declaredDependencyNames);
23
+ for (const occurrence of occurrences)
24
+ configEvidence.push(occurrence);
25
+ }
26
+ }
27
+ if (!jestConfigBarrier) {
28
+ const occurrences = collectJestConfigUsage(raw['jest'], manifest.declaredDependencyNames);
29
+ for (const occurrence of occurrences)
30
+ configEvidence.push(occurrence);
31
+ }
32
+ configEvidence.sort((a, b) => compareStrings(a.packageName, b.packageName) || compareEvidence(a.evidence, b.evidence));
33
+ return {
34
+ manifest,
35
+ rawManifest: raw,
36
+ config,
37
+ rootEntries,
38
+ eslintPrecedence,
39
+ jestConfigBarrier,
40
+ configEvidence,
41
+ };
42
+ }
43
+ //# sourceMappingURL=scanContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanContext.js","sourceRoot":"","sources":["../../src/core/scanContext.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,EAAE,yBAAyB,EAAsB,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EACL,wBAAwB,EACxB,iCAAiC,GAElC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAwB,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,cAAc,EAAuB,MAAM,eAAe,CAAC;AAerF,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACrE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,yBAAyB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/E,MAAM,gBAAgB,GAAG,iCAAiC,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,cAAc,GAA0E,EAAE,CAAC;IACjG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,gBAAgB,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,WAAW,GAAG,MAAM,mCAAmC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC1F,KAAK,MAAM,UAAU,IAAI,WAAW;gBAAE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,wBAAwB,CAC1C,GAAG,CAAC,cAAc,CAAC,EACnB,QAAQ,CAAC,uBAAuB,CACjC,CAAC;YACF,KAAK,MAAM,UAAU,IAAI,WAAW;gBAAE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QAC1F,KAAK,MAAM,UAAU,IAAI,WAAW;YAAE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC;IACD,cAAc,CAAC,IAAI,CACjB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAC1F,CAAC;IACF,OAAO;QACL,QAAQ;QACR,WAAW,EAAE,GAAG;QAChB,MAAM;QACN,WAAW;QACX,gBAAgB;QAChB,iBAAiB;QACjB,cAAc;KACf,CAAC;AACJ,CAAC"}