depvitals 0.3.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 (77) hide show
  1. package/README.md +72 -3
  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 +39 -49
  11. package/dist/cli/runCli.js.map +1 -1
  12. package/dist/config/ignoreDependencies.d.ts +2 -0
  13. package/dist/config/ignoreDependencies.d.ts.map +1 -1
  14. package/dist/config/ignoreDependencies.js +5 -1
  15. package/dist/config/ignoreDependencies.js.map +1 -1
  16. package/dist/config/readProjectConfig.d.ts +5 -0
  17. package/dist/config/readProjectConfig.d.ts.map +1 -1
  18. package/dist/config/readProjectConfig.js +24 -10
  19. package/dist/config/readProjectConfig.js.map +1 -1
  20. package/dist/core/analyzeProject.d.ts +35 -0
  21. package/dist/core/analyzeProject.d.ts.map +1 -1
  22. package/dist/core/analyzeProject.js +161 -25
  23. package/dist/core/analyzeProject.js.map +1 -1
  24. package/dist/core/evidence.d.ts +67 -0
  25. package/dist/core/evidence.d.ts.map +1 -0
  26. package/dist/core/evidence.js +115 -0
  27. package/dist/core/evidence.js.map +1 -0
  28. package/dist/core/scanContext.d.ts +20 -0
  29. package/dist/core/scanContext.d.ts.map +1 -0
  30. package/dist/core/scanContext.js +43 -0
  31. package/dist/core/scanContext.js.map +1 -0
  32. package/dist/detectors/eslintManifestConfig.d.ts +18 -0
  33. package/dist/detectors/eslintManifestConfig.d.ts.map +1 -1
  34. package/dist/detectors/eslintManifestConfig.js +55 -76
  35. package/dist/detectors/eslintManifestConfig.js.map +1 -1
  36. package/dist/detectors/eslintRcJsonConfig.d.ts +8 -2
  37. package/dist/detectors/eslintRcJsonConfig.d.ts.map +1 -1
  38. package/dist/detectors/eslintRcJsonConfig.js +25 -11
  39. package/dist/detectors/eslintRcJsonConfig.js.map +1 -1
  40. package/dist/detectors/jestManifestConfig.d.ts +15 -3
  41. package/dist/detectors/jestManifestConfig.d.ts.map +1 -1
  42. package/dist/detectors/jestManifestConfig.js +57 -79
  43. package/dist/detectors/jestManifestConfig.js.map +1 -1
  44. package/dist/reporters/jsonReporter.d.ts +39 -0
  45. package/dist/reporters/jsonReporter.d.ts.map +1 -0
  46. package/dist/reporters/jsonReporter.js +91 -0
  47. package/dist/reporters/jsonReporter.js.map +1 -0
  48. package/dist/reporters/terminalReporter.d.ts +15 -4
  49. package/dist/reporters/terminalReporter.d.ts.map +1 -1
  50. package/dist/reporters/terminalReporter.js +64 -4
  51. package/dist/reporters/terminalReporter.js.map +1 -1
  52. package/dist/scanner/moduleSpecifiers.d.ts +10 -0
  53. package/dist/scanner/moduleSpecifiers.d.ts.map +1 -1
  54. package/dist/scanner/moduleSpecifiers.js +46 -8
  55. package/dist/scanner/moduleSpecifiers.js.map +1 -1
  56. package/dist/scanner/projectManifest.d.ts +9 -0
  57. package/dist/scanner/projectManifest.d.ts.map +1 -1
  58. package/dist/scanner/projectManifest.js +7 -1
  59. package/dist/scanner/projectManifest.js.map +1 -1
  60. package/dist/scanner/scriptUsage.d.ts +13 -0
  61. package/dist/scanner/scriptUsage.d.ts.map +1 -1
  62. package/dist/scanner/scriptUsage.js +102 -32
  63. package/dist/scanner/scriptUsage.js.map +1 -1
  64. package/dist/scanner/sourceFiles.d.ts +5 -0
  65. package/dist/scanner/sourceFiles.d.ts.map +1 -1
  66. package/dist/scanner/sourceFiles.js +7 -0
  67. package/dist/scanner/sourceFiles.js.map +1 -1
  68. package/package.json +4 -2
  69. package/schemas/README.md +47 -0
  70. package/schemas/examples/README.md +27 -0
  71. package/schemas/examples/explain-excluded.json +53 -0
  72. package/schemas/examples/explain-missing.json +65 -0
  73. package/schemas/examples/explain-node-preload.json +70 -0
  74. package/schemas/examples/explain-unknown.json +53 -0
  75. package/schemas/examples/scan-clean.json +40 -0
  76. package/schemas/examples/scan-findings.json +80 -0
  77. package/schemas/report-v1.schema.json +376 -0
@@ -20,6 +20,10 @@ const CONFIG_FILENAME = 'depvitals.config.json';
20
20
  * Stable entry checks do not claim adversarial protection against replacement between I/O calls.
21
21
  */
22
22
  export async function readRawProjectConfig(projectRoot) {
23
+ return (await readRawConfigWithEntries(projectRoot)).raw;
24
+ }
25
+ /** Preserve canonical-entry checks and errors while sharing this read's entry names. */
26
+ async function readRawConfigWithEntries(projectRoot) {
23
27
  const root = resolve(projectRoot);
24
28
  const path = join(root, CONFIG_FILENAME);
25
29
  await assertReadableRoot(root);
@@ -32,7 +36,7 @@ export async function readRawProjectConfig(projectRoot) {
32
36
  throw unreadable(path, error);
33
37
  }
34
38
  if (!entries.includes(CONFIG_FILENAME))
35
- return emptyConfig();
39
+ return { raw: emptyConfig(), rootEntries: Object.freeze(entries) };
36
40
  let info;
37
41
  try {
38
42
  info = await lstat(path);
@@ -67,10 +71,13 @@ export async function readRawProjectConfig(projectRoot) {
67
71
  }
68
72
  }
69
73
  const config = parsed;
70
- return Object.freeze({
71
- ignorePaths: readStrings(config['ignorePaths'], 'ignorePaths', path),
72
- ignoreDependencies: readStrings(config['ignoreDependencies'], 'ignoreDependencies', path),
73
- });
74
+ return {
75
+ raw: Object.freeze({
76
+ ignorePaths: readStrings(config['ignorePaths'], 'ignorePaths', path),
77
+ ignoreDependencies: readStrings(config['ignoreDependencies'], 'ignoreDependencies', path),
78
+ }),
79
+ rootEntries: Object.freeze(entries),
80
+ };
74
81
  }
75
82
  function readStrings(value, field, path) {
76
83
  if (value === undefined)
@@ -96,11 +103,18 @@ function unreadable(path, cause) {
96
103
  }
97
104
  /** Read once, validate all path/name rules, and return no partial configuration on failure. */
98
105
  export async function readProjectConfig(projectRoot) {
99
- const raw = await readRawProjectConfig(projectRoot);
106
+ return (await readProjectConfigSnapshot(projectRoot)).config;
107
+ }
108
+ /** Per-scan policy and entry names; not an atomic filesystem snapshot or a global cache. */
109
+ export async function readProjectConfigSnapshot(projectRoot) {
110
+ const { raw, rootEntries } = await readRawConfigWithEntries(projectRoot);
100
111
  const path = join(resolve(projectRoot), CONFIG_FILENAME);
101
- return Object.freeze({
102
- ignorePaths: normalizeIgnorePaths(raw.ignorePaths, path),
103
- ignoreDependencies: normalizeIgnoreDependencies(raw.ignoreDependencies, path),
104
- });
112
+ return {
113
+ config: Object.freeze({
114
+ ignorePaths: normalizeIgnorePaths(raw.ignorePaths, path),
115
+ ignoreDependencies: normalizeIgnoreDependencies(raw.ignoreDependencies, path),
116
+ }),
117
+ rootEntries,
118
+ };
105
119
  }
106
120
  //# sourceMappingURL=readProjectConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readProjectConfig.js","sourceRoot":"","sources":["../../src/config/readProjectConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readProjectConfig.js","sourceRoot":"","sources":["../../src/config/readProjectConfig.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,9 @@
46
46
  *
47
47
  * Peer/optional declarations suppress false missing results through `declaredDependencyNames`.
48
48
  */
49
+ import { type ProjectManifest } from '../scanner/projectManifest.js';
50
+ import type { ScanContext } from './scanContext.js';
51
+ import { type FindingCategory, type PackageFact } from './evidence.js';
49
52
  /**
50
53
  * The structured outcome of a dependency analysis.
51
54
  *
@@ -64,6 +67,17 @@ export type AnalysisResult = {
64
67
  /** External packages referenced by source but not declared anywhere, sorted alphabetically. */
65
68
  missingDependencies: readonly string[];
66
69
  };
70
+ /** Internal categories before or after dependency policy; no additional finding kind. */
71
+ export type AnalysisFindings = Pick<AnalysisResult, 'unusedDependencies' | 'unusedDevDependencies' | 'missingDependencies'>;
72
+ /** Complete internal scan facts. Presentation projects explicit fields instead of serializing this object. */
73
+ export type DetailedAnalysisResult = {
74
+ readonly projectRoot: string;
75
+ readonly manifest: ProjectManifest;
76
+ readonly config: ScanContext['config'];
77
+ readonly underlyingFindings: AnalysisFindings;
78
+ readonly findings: AnalysisFindings;
79
+ readonly packages: readonly PackageFact[];
80
+ };
67
81
  /**
68
82
  * Internal handoff for package names recognized by a validated static configuration reader.
69
83
  *
@@ -131,4 +145,25 @@ export declare class AnalysisError extends Error {
131
145
  * @throws {SourceFilesError} when the root is missing, is not a directory, or cannot be read.
132
146
  */
133
147
  export declare function analyzeProject(projectRoot: string, options?: AnalysisOptions): Promise<AnalysisResult>;
148
+ /** Keep the small CLI/legacy result projection while collecting the same complete scan facts. */
149
+ export declare function analyzeProjectWithContext(context: ScanContext): Promise<AnalysisResult>;
150
+ /** Detailed analysis accepts eligible typed facts only, never the legacy names-only hint seam. */
151
+ export declare function analyzeProjectDetailed(context: ScanContext): Promise<DetailedAnalysisResult>;
152
+ /** Pure legacy projection; no collection, reclassification or input reads. */
153
+ export declare function projectAnalysisResult(result: DetailedAnalysisResult): AnalysisResult;
154
+ /** Internal package-local outcome; effective scan policy remains available to later reporters. */
155
+ export type PackageExplanation = {
156
+ readonly projectRoot: string;
157
+ readonly config: DetailedAnalysisResult['config'];
158
+ readonly findings: AnalysisFindings;
159
+ readonly counts: Readonly<Record<FindingCategory, number>>;
160
+ readonly packages: readonly [PackageFact];
161
+ readonly query: {
162
+ readonly packageName: string;
163
+ readonly known: boolean;
164
+ };
165
+ readonly exitCode: 0 | 1;
166
+ };
167
+ /** Project only completed scan facts. This function performs no collection or resolution. */
168
+ export declare function projectPackageExplanation(result: DetailedAnalysisResult, packageName: string): PackageExplanation;
134
169
  //# sourceMappingURL=analyzeProject.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeProject.d.ts","sourceRoot":"","sources":["../../src/core/analyzeProject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAeH;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,uDAAuD;IACvD,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,+FAA+F;IAC/F,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACxD,iGAAiG;IACjG,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACrD,4FAA4F;IAC5F,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7D,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAEvE;;;;;;;GAOG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO;CAKtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA6DzB"}
1
+ {"version":3,"file":"analyzeProject.d.ts","sourceRoot":"","sources":["../../src/core/analyzeProject.ts"],"names":[],"mappings":"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"}
@@ -50,9 +50,11 @@ import { readFile } from 'node:fs/promises';
50
50
  import { dirname } from 'node:path';
51
51
  import { loadPackageScope, loadProjectManifest, } from '../scanner/projectManifest.js';
52
52
  import { discoverSourceFiles } from '../scanner/sourceFiles.js';
53
- import { extractModuleSpecifiers } from '../scanner/moduleSpecifiers.js';
53
+ import { collectModuleSpecifiers, } from '../scanner/moduleSpecifiers.js';
54
54
  import { classifyPackageSpecifier, isPackageSelfReference } from '../scanner/packageSpecifier.js';
55
- import { findPackageScriptUsage } from '../scanner/scriptUsage.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
  *
@@ -83,8 +85,86 @@ export class AnalysisError extends Error {
83
85
  */
84
86
  export async function analyzeProject(projectRoot, options = {}) {
85
87
  const manifest = await loadProjectManifest(projectRoot);
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
+ };
86
166
  const sourceFiles = await discoverSourceFiles(manifest.root, {
87
- ignorePaths: options.ignorePaths,
167
+ ignorePaths,
88
168
  });
89
169
  // External package roots referenced by source files, collapsed to their package root.
90
170
  const sourceUsedNames = new Set();
@@ -94,13 +174,22 @@ export async function analyzeProject(projectRoot, options = {}) {
94
174
  ]);
95
175
  for (const file of sourceFiles) {
96
176
  const scope = await packageScopeForDirectory(dirname(file), scopeByDirectory);
97
- const specifiers = await readAndExtract(file, scope.packageType);
98
- for (const specifier of specifiers) {
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;
99
181
  if (isPackageSelfReference(specifier, scope.selfReference))
100
182
  continue;
101
183
  const classified = classifyPackageSpecifier(specifier);
102
184
  if (classified.kind === 'external') {
103
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
+ });
104
193
  }
105
194
  }
106
195
  }
@@ -110,27 +199,74 @@ export async function analyzeProject(projectRoot, options = {}) {
110
199
  Object.keys(manifest.dependencies),
111
200
  Object.keys(manifest.devDependencies),
112
201
  ]);
113
- const scriptUsedNames = findPackageScriptUsage(manifest.scripts, declaredCandidates);
114
- // Configuration evidence never reaches `sourceUsedNames`, which is the only input able to produce
115
- // a missing finding; it can only make `usedNames` bigger and therefore suppress unused findings.
116
- const configUsedNames = normalizeConfigHints(options.configUsedNames);
117
- const usedNames = unionNames([[...sourceUsedNames], [...scriptUsedNames], [...configUsedNames]]);
118
- const unusedDependencies = declaredMinus(Object.keys(manifest.dependencies), usedNames);
119
- const unusedDevDependencies = declaredMinus(Object.keys(manifest.devDependencies), usedNames);
120
- // An external root is missing only when it is absent from every declared dependency section.
121
- // Peer/optional declarations therefore suppress false missing results.
122
- const missingDependencies = declaredMinus([...sourceUsedNames], manifest.declaredDependencyNames);
123
- // Exclusions are policy, not evidence: classify against the complete inventory first so script
124
- // collisions and all other packages keep their ordinary meaning. Retained sources must already
125
- // have been read and parsed successfully before any finding can be suppressed.
126
- const ignoredDependencies = new Set(options.ignoreDependencies ?? []);
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) {
127
214
  return {
128
- projectRoot: manifest.root,
129
- unusedDependencies: unusedDependencies.filter((name) => !ignoredDependencies.has(name)),
130
- unusedDevDependencies: unusedDevDependencies.filter((name) => !ignoredDependencies.has(name)),
131
- missingDependencies: missingDependencies.filter((name) => !ignoredDependencies.has(name)),
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,
233
+ };
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),
132
240
  };
133
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
+ }
134
270
  /**
135
271
  * Resolve the nearest package scope for one discovered source file.
136
272
  *
@@ -188,11 +324,11 @@ async function readAndExtract(file, packageType) {
188
324
  packageType === 'module');
189
325
  }
190
326
  try {
191
- const occurrences = extractModuleSpecifiers(source, {
327
+ const occurrences = collectModuleSpecifiers(source, {
192
328
  jsx: usesJsxSyntax(file, source),
193
329
  module: sourceModuleMode(file, packageType),
194
330
  });
195
- return occurrences.map((occurrence) => occurrence.specifier);
331
+ return occurrences;
196
332
  }
197
333
  catch (error) {
198
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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"}