doc-freshness-checker 2.0.23 → 2.2.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 (98) hide show
  1. package/README.md +19 -0
  2. package/dist/config/defaults.js +9 -3
  3. package/dist/config/defaults.js.map +1 -1
  4. package/dist/index.d.ts +6 -1
  5. package/dist/index.js +5 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/manifests/manifestInventory.d.ts +28 -0
  8. package/dist/manifests/manifestInventory.js +225 -0
  9. package/dist/manifests/manifestInventory.js.map +1 -0
  10. package/dist/manifests/manifestInventory.test.d.ts +1 -0
  11. package/dist/manifests/manifestInventory.test.js +176 -0
  12. package/dist/manifests/manifestInventory.test.js.map +1 -0
  13. package/dist/manifests/validatorConstructors.test.d.ts +1 -0
  14. package/dist/manifests/validatorConstructors.test.js +17 -0
  15. package/dist/manifests/validatorConstructors.test.js.map +1 -0
  16. package/dist/parsers/documentParser.d.ts +2 -3
  17. package/dist/parsers/documentParser.js.map +1 -1
  18. package/dist/parsers/extractorInterface.test.d.ts +1 -0
  19. package/dist/parsers/extractorInterface.test.js +34 -0
  20. package/dist/parsers/extractorInterface.test.js.map +1 -0
  21. package/dist/parsers/extractors/codeSnippetExtractor.js.map +1 -1
  22. package/dist/plugins/plugin.d.ts +5 -1
  23. package/dist/plugins/plugin.js +5 -1
  24. package/dist/plugins/plugin.js.map +1 -1
  25. package/dist/reporters/consoleReporter.d.ts +5 -11
  26. package/dist/reporters/consoleReporter.js +74 -76
  27. package/dist/reporters/consoleReporter.js.map +1 -1
  28. package/dist/reporters/consoleReporter.test.js +22 -27
  29. package/dist/reporters/consoleReporter.test.js.map +1 -1
  30. package/dist/reporters/enhancedReporter.d.ts +51 -7
  31. package/dist/reporters/enhancedReporter.js +128 -74
  32. package/dist/reporters/enhancedReporter.js.map +1 -1
  33. package/dist/reporters/enhancedReporter.test.js +110 -122
  34. package/dist/reporters/enhancedReporter.test.js.map +1 -1
  35. package/dist/reporters/jsonReporter.d.ts +6 -6
  36. package/dist/reporters/jsonReporter.js +24 -14
  37. package/dist/reporters/jsonReporter.js.map +1 -1
  38. package/dist/reporters/jsonReporter.test.js +26 -11
  39. package/dist/reporters/jsonReporter.test.js.map +1 -1
  40. package/dist/reporters/markdownIssueCells.d.ts +7 -0
  41. package/dist/reporters/markdownIssueCells.js +9 -0
  42. package/dist/reporters/markdownIssueCells.js.map +1 -0
  43. package/dist/reporters/markdownReporter.d.ts +2 -7
  44. package/dist/reporters/markdownReporter.js +57 -56
  45. package/dist/reporters/markdownReporter.js.map +1 -1
  46. package/dist/reporters/markdownReporter.test.js +104 -76
  47. package/dist/reporters/markdownReporter.test.js.map +1 -1
  48. package/dist/reporters/publicReporterApi.test.d.ts +1 -0
  49. package/dist/reporters/publicReporterApi.test.js +28 -0
  50. package/dist/reporters/publicReporterApi.test.js.map +1 -0
  51. package/dist/reporters/reportContext.d.ts +12 -0
  52. package/dist/reporters/reportContext.js +8 -0
  53. package/dist/reporters/reportContext.js.map +1 -0
  54. package/dist/reporters/reportContext.test.d.ts +1 -0
  55. package/dist/reporters/reportContext.test.js +30 -0
  56. package/dist/reporters/reportContext.test.js.map +1 -0
  57. package/dist/reporters/reporters.characterization.test.d.ts +1 -0
  58. package/dist/reporters/reporters.characterization.test.js +208 -0
  59. package/dist/reporters/reporters.characterization.test.js.map +1 -0
  60. package/dist/runner.js +67 -63
  61. package/dist/runner.js.map +1 -1
  62. package/dist/runner.test.js +444 -42
  63. package/dist/runner.test.js.map +1 -1
  64. package/dist/semantic/vectorSearch.js +2 -1
  65. package/dist/semantic/vectorSearch.js.map +1 -1
  66. package/dist/semantic/vectorSearch.test.js +2 -2
  67. package/dist/semantic/vectorSearch.test.js.map +1 -1
  68. package/dist/source/sourceIndex.d.ts +39 -0
  69. package/dist/source/sourceIndex.js +444 -0
  70. package/dist/source/sourceIndex.js.map +1 -0
  71. package/dist/source/sourceIndex.largeGlob.test.d.ts +1 -0
  72. package/dist/source/sourceIndex.largeGlob.test.js +29 -0
  73. package/dist/source/sourceIndex.largeGlob.test.js.map +1 -0
  74. package/dist/source/sourceIndex.test.d.ts +1 -0
  75. package/dist/source/sourceIndex.test.js +263 -0
  76. package/dist/source/sourceIndex.test.js.map +1 -0
  77. package/dist/source/sourceValidators.d.ts +7 -0
  78. package/dist/source/sourceValidators.js +8 -0
  79. package/dist/source/sourceValidators.js.map +1 -0
  80. package/dist/source/sourceValidators.test.d.ts +1 -0
  81. package/dist/source/sourceValidators.test.js +17 -0
  82. package/dist/source/sourceValidators.test.js.map +1 -0
  83. package/dist/types.d.ts +34 -2
  84. package/dist/validators/codePatternValidator.d.ts +5 -11
  85. package/dist/validators/codePatternValidator.js +17 -145
  86. package/dist/validators/codePatternValidator.js.map +1 -1
  87. package/dist/validators/codeSnippetValidator.d.ts +5 -18
  88. package/dist/validators/codeSnippetValidator.js +19 -312
  89. package/dist/validators/codeSnippetValidator.js.map +1 -1
  90. package/dist/validators/dependencyValidator.d.ts +0 -5
  91. package/dist/validators/dependencyValidator.js +7 -64
  92. package/dist/validators/dependencyValidator.js.map +1 -1
  93. package/dist/validators/versionValidator.d.ts +1 -10
  94. package/dist/validators/versionValidator.js +7 -157
  95. package/dist/validators/versionValidator.js.map +1 -1
  96. package/dist/validators/versionValidator.test.js +1 -101
  97. package/dist/validators/versionValidator.test.js.map +1 -1
  98. package/package.json +4 -4
package/README.md CHANGED
@@ -294,6 +294,20 @@ export default defineConfig({
294
294
  });
295
295
  ```
296
296
 
297
+ The following accepted configuration options do not affect validation or reporting and are planned for removal in v3.0.0.
298
+ They remain part of the incremental configuration fingerprint, so changing one forces the next incremental run to perform
299
+ a full validation:
300
+
301
+ | Option | Current behavior / migration |
302
+ | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
303
+ | `rules.version.allowMinorDrift` | Version validation compares major versions only. |
304
+ | `outputDir` | Use `outputPath` with the JSON, Markdown, or Enhanced reporter. Console output remains on stdout. |
305
+ | `ignorePatterns` | `include` and `exclude` select documentation files. Rule-level `illustrativePatterns` can suppress illustrative `file-path`, `directory-structure`, and `code-snippet` references; there is no general semantic reference-ignore replacement. |
306
+ | `git`, `git.enabled`, `git.trackChanges`, `git.changeWindow` | Git availability is auto-detected during graph processing, and Enhanced reports use a fixed seven-day change window. |
307
+ | `vectorSearch.indexCodeComments`, `vectorSearch.indexDocstrings` | Enabled vector search follows its built-in indexing behavior. |
308
+
309
+ The exported `GitConfig` type is deprecated with the `git` property.
310
+
297
311
  <details>
298
312
  <summary>Full configuration example</summary>
299
313
 
@@ -373,6 +387,11 @@ console.log(results.summary);
373
387
 
374
388
  `run()` and `runWithConfig()` reject when a matched document cannot be read or an extractor or validator throws. `runWithConfig()` also rejects when its configuration file cannot be loaded. Matched paths confirmed to have disappeared between discovery and reading are ignored as a normal filesystem race.
375
389
 
390
+ > [!WARNING]
391
+ > `Plugin` is deprecated because it is not consumed by `run()` and is planned for removal in v3.0.0. Use
392
+ > `DocFreshnessConfig.customExtractors` and `DocFreshnessConfig.customValidators` for supported extensions. Reporter and
393
+ > lifecycle hooks have no replacement.
394
+
376
395
  Key exports:
377
396
 
378
397
  | Export | Purpose |
@@ -58,6 +58,7 @@ export const DEFAULT_CONFIG = {
58
58
  version: {
59
59
  enabled: true,
60
60
  severity: 'warning',
61
+ // Deprecated: ignored by validation; changing this value invalidates incremental reuse.
61
62
  allowMinorDrift: true,
62
63
  },
63
64
  'directory-structure': {
@@ -90,8 +91,10 @@ export const DEFAULT_CONFIG = {
90
91
  // Reporter configuration
91
92
  reporters: ['console'],
92
93
  // Output directory for reports
94
+ // Deprecated: ignored by reporting; changing this value invalidates incremental reuse.
93
95
  outputDir: '.doc-freshness-reports',
94
96
  // Ignore patterns (regex strings)
97
+ // Deprecated: ignored by reference filtering; changing this value invalidates incremental reuse.
95
98
  ignorePatterns: [],
96
99
  // Custom extractors (advanced)
97
100
  customExtractors: [],
@@ -104,10 +107,11 @@ export const DEFAULT_CONFIG = {
104
107
  cacheMaxAge: 24 * 60 * 60 * 1000, // 24 hours for non-git repos
105
108
  },
106
109
  // Git integration settings
110
+ // Deprecated: ignored by Git behavior; changing these values invalidates incremental reuse.
107
111
  git: {
108
- enabled: true, // Auto-detected
109
- trackChanges: true, // Enable incremental checking
110
- changeWindow: 7, // Days to look back for changes
112
+ enabled: true,
113
+ trackChanges: true,
114
+ changeWindow: 7,
111
115
  },
112
116
  // Freshness scoring settings
113
117
  freshnessScoring: {
@@ -129,7 +133,9 @@ export const DEFAULT_CONFIG = {
129
133
  vectorSearch: {
130
134
  enabled: false, // Disabled by default
131
135
  similarityThreshold: 0.3, // Lower = stricter matching
136
+ // Deprecated: ignored by vector indexing; changing this value invalidates incremental reuse.
132
137
  indexCodeComments: true,
138
+ // Deprecated: ignored by vector indexing; changing this value invalidates incremental reuse.
133
139
  indexDocstrings: true,
134
140
  },
135
141
  // Cache settings
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -33,7 +33,12 @@ export { GraphBuilder } from './graph/graphBuilder.js';
33
33
  export { GitChangeTracker } from './git/changeTracker.js';
34
34
  export { CacheManager } from './cache/cacheManager.js';
35
35
  export { FreshnessScorer } from './scoring/freshnessScorer.js';
36
+ /**
37
+ * @deprecated `Plugin` is not consumed by `run()`. Supported extension points are
38
+ * `DocFreshnessConfig.customExtractors` and `DocFreshnessConfig.customValidators`.
39
+ * Planned for removal in v3.0.0.
40
+ */
36
41
  export { Plugin } from './plugins/plugin.js';
37
42
  export { IncrementalChecker } from './utils/incremental.js';
38
43
  export { VectorSearch } from './semantic/vectorSearch.js';
39
- export type { DocFreshnessConfig, Document, DocumentFormat, Reference, ValidationResult, ValidationResults, ValidationSummary, DocumentIssues, VectorMismatch, Severity, RuleConfig, VersionRuleConfig, RulesConfig, UrlValidationConfig, GraphConfig, GitConfig, FreshnessScoringConfig, FreshnessScoringWeights, FreshnessScoringThresholds, VectorSearchConfig, CacheConfig, IncrementalConfig, ReporterType, Grade, DocScore, ProjectScores, CommitInfo, ChangeSummaryItem, IndexMetadata, CacheStats, SymbolLocation, SourceFileData, CodeFile, CodeSnippetRuleConfig, BaseExtractor as BaseExtractorType, BaseValidator, } from './types.js';
44
+ export type { DocFreshnessConfig, Document, DocumentFormat, Reference, ValidationResult, ValidationResults, ValidationSummary, DocumentIssues, VectorMismatch, Severity, RuleConfig, VersionRuleConfig, RulesConfig, UrlValidationConfig, GraphConfig, GitConfig, FreshnessScoringConfig, FreshnessScoringWeights, FreshnessScoringThresholds, VectorSearchConfig, CacheConfig, IncrementalConfig, ReporterType, Grade, DocScore, ProjectScores, CommitInfo, ChangeSummaryItem, IndexMetadata, CacheStats, SymbolLocation, SourceFileData, CodeFile, SupportedLanguage, SupportedSnippetLanguage, CodeSnippetRuleConfig, BaseExtractor as BaseExtractorType, Extractor, BaseValidator, } from './types.js';
package/dist/index.js CHANGED
@@ -33,6 +33,11 @@ export { GraphBuilder } from './graph/graphBuilder.js';
33
33
  export { GitChangeTracker } from './git/changeTracker.js';
34
34
  export { CacheManager } from './cache/cacheManager.js';
35
35
  export { FreshnessScorer } from './scoring/freshnessScorer.js';
36
+ /**
37
+ * @deprecated `Plugin` is not consumed by `run()`. Supported extension points are
38
+ * `DocFreshnessConfig.customExtractors` and `DocFreshnessConfig.customValidators`.
39
+ * Planned for removal in v3.0.0.
40
+ */
36
41
  export { Plugin } from './plugins/plugin.js';
37
42
  export { IncrementalChecker } from './utils/incremental.js';
38
43
  export { VectorSearch } from './semantic/vectorSearch.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { DocFreshnessConfig } from '../types.js';
2
+ export interface VersionCandidate {
3
+ version: string;
4
+ sourceIndex: number;
5
+ }
6
+ interface DependencyProjection {
7
+ all: ReadonlySet<string>;
8
+ python: ReadonlySet<string>;
9
+ }
10
+ interface VersionProjection {
11
+ all: ReadonlyMap<string, VersionCandidate>;
12
+ python: ReadonlyMap<string, VersionCandidate>;
13
+ }
14
+ export declare class ManifestInventory {
15
+ private contents;
16
+ private dependencyState;
17
+ private versionState;
18
+ private activeKey;
19
+ dependencyNames(config: DocFreshnessConfig): Promise<DependencyProjection>;
20
+ packageVersions(config: DocFreshnessConfig): Promise<VersionProjection>;
21
+ private activate;
22
+ private loadDependencyNames;
23
+ private loadPackageVersions;
24
+ private read;
25
+ }
26
+ export declare function inventoryFor(owner: object): ManifestInventory;
27
+ export declare function attachInventory(owner: object, inventory: ManifestInventory): void;
28
+ export {};
@@ -0,0 +1,225 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import semver from 'semver';
4
+ import { parseCargoDependencies, resolveCargoDependencies } from '../utils/cargoDependencies.js';
5
+ import { parseGoModRequirements } from '../utils/goMod.js';
6
+ import { resolveManifestPaths } from '../utils/manifestPaths.js';
7
+ import { canonicalizePythonPackageName, parsePyprojectDependencies, parseRequirementsDependencies } from '../utils/pythonDependencies.js';
8
+ const manifestFormats = {
9
+ 'package.json': {
10
+ dependency: (content) => {
11
+ const json = JSON.parse(content);
12
+ return ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].flatMap((key) => Object.keys(json[key] || {}));
13
+ },
14
+ version: (content) => {
15
+ const json = JSON.parse(content);
16
+ const versions = new Map();
17
+ for (const [name, version] of Object.entries(json.peerDependencies || {})) {
18
+ versions.set(name.toLowerCase(), normalizePeerVersion(version));
19
+ }
20
+ for (const [name, version] of Object.entries({
21
+ ...json.dependencies,
22
+ ...json.devDependencies,
23
+ ...json.optionalDependencies,
24
+ })) {
25
+ versions.set(name.toLowerCase(), normalizeVersion(version));
26
+ }
27
+ if (json.engines?.node) {
28
+ versions.set('node', normalizeVersion(json.engines.node));
29
+ versions.set('nodejs', normalizeVersion(json.engines.node));
30
+ }
31
+ if (json.engines?.npm) {
32
+ versions.set('npm', normalizeVersion(json.engines.npm));
33
+ }
34
+ return versions;
35
+ },
36
+ },
37
+ 'requirements.txt': {
38
+ dependency: (content) => Array.from(parseRequirementsDependencies(content).keys()),
39
+ version: parseRequirementsDependencies,
40
+ python: true,
41
+ },
42
+ 'pyproject.toml': {
43
+ dependency: (content) => Array.from(parsePyprojectDependencies(content).keys()),
44
+ version: parsePyprojectDependencies,
45
+ python: true,
46
+ },
47
+ 'go.mod': {
48
+ dependency: (content) => parseGoModRequirements(content).map(([modulePath]) => modulePath),
49
+ version: (content) => {
50
+ const versions = new Map();
51
+ const goVersion = content.match(/^go\s+(\d+\.\d+)/m)?.[1];
52
+ if (goVersion) {
53
+ versions.set('go', goVersion);
54
+ versions.set('golang', goVersion);
55
+ }
56
+ for (const [modulePath, version] of parseGoModRequirements(content)) {
57
+ versions.set(modulePath, normalizeVersion(version));
58
+ }
59
+ return versions;
60
+ },
61
+ },
62
+ 'Cargo.toml': {
63
+ dependency: (content) => parseCargoDependencies(content).map(({ name }) => name),
64
+ },
65
+ 'pom.xml': {
66
+ dependency: (content) => Array.from(content.matchAll(/<artifactId>([^<]+)<\/artifactId>/g), (match) => match[1]),
67
+ version: (content) => {
68
+ const versions = new Map();
69
+ const javaVersion = content.match(/<java\.version>([^<]+)<\/java\.version>/)?.[1];
70
+ if (javaVersion) {
71
+ versions.set('java', javaVersion);
72
+ }
73
+ for (const match of content.matchAll(/<dependency>[\s\S]*?<artifactId>([^<]+)<\/artifactId>[\s\S]*?<version>([^<]+)<\/version>[\s\S]*?<\/dependency>/g)) {
74
+ versions.set(match[1].toLowerCase(), normalizeVersion(match[2]));
75
+ }
76
+ return versions;
77
+ },
78
+ },
79
+ };
80
+ function normalizeVersion(version) {
81
+ return version ? version.replace(/^[\^~>=<]+/, '').replace(/\.x$/i, '.0') : 'any';
82
+ }
83
+ function normalizePeerVersion(version) {
84
+ const range = semver.validRange(version);
85
+ const minimum = range && semver.minVersion(range);
86
+ return minimum && semver.subset(range, `${minimum.major}.x`) ? minimum.version : 'any';
87
+ }
88
+ function setCandidate(candidates, name, version, sourceIndex) {
89
+ const current = candidates.get(name);
90
+ const equallyConcrete = current && (version === 'any') === (current.version === 'any');
91
+ if (!current || (version !== 'any' && current.version === 'any') || (equallyConcrete && sourceIndex >= current.sourceIndex)) {
92
+ candidates.set(name, { version, sourceIndex });
93
+ }
94
+ }
95
+ export class ManifestInventory {
96
+ contents = new Map();
97
+ dependencyState = null;
98
+ versionState = null;
99
+ activeKey = null;
100
+ dependencyNames(config) {
101
+ const manifestConfig = this.activate(config);
102
+ if (!this.dependencyState) {
103
+ const pending = this.loadDependencyNames(manifestConfig);
104
+ this.dependencyState = pending;
105
+ void pending.catch(() => {
106
+ if (this.dependencyState === pending) {
107
+ this.dependencyState = null;
108
+ }
109
+ });
110
+ }
111
+ return this.dependencyState;
112
+ }
113
+ packageVersions(config) {
114
+ const manifestConfig = this.activate(config);
115
+ if (!this.versionState) {
116
+ const pending = this.loadPackageVersions(manifestConfig);
117
+ this.versionState = pending;
118
+ void pending.catch(() => {
119
+ if (this.versionState === pending) {
120
+ this.versionState = null;
121
+ }
122
+ });
123
+ }
124
+ return this.versionState;
125
+ }
126
+ activate(config) {
127
+ const paths = resolveManifestPaths(config);
128
+ const key = JSON.stringify(paths);
129
+ if (this.activeKey !== key) {
130
+ this.activeKey = key;
131
+ this.contents = new Map();
132
+ this.dependencyState = null;
133
+ this.versionState = null;
134
+ }
135
+ return { paths, contents: this.contents };
136
+ }
137
+ async loadDependencyNames(config) {
138
+ const all = new Set();
139
+ const python = new Set();
140
+ for (const manifestPath of config.paths) {
141
+ const format = manifestFormats[path.basename(manifestPath)];
142
+ if (!format) {
143
+ continue;
144
+ }
145
+ try {
146
+ for (const dependency of format.dependency(await this.read(manifestPath, config.contents))) {
147
+ const name = dependency.toLowerCase();
148
+ all.add(name);
149
+ if (format.python) {
150
+ python.add(canonicalizePythonPackageName(name));
151
+ }
152
+ }
153
+ }
154
+ catch (cause) {
155
+ config.contents.delete(manifestPath);
156
+ throw manifestError(manifestPath, cause);
157
+ }
158
+ }
159
+ return { all, python };
160
+ }
161
+ async loadPackageVersions(config) {
162
+ const all = new Map();
163
+ const python = new Map();
164
+ const cargoManifests = [];
165
+ for (const [sourceIndex, manifestPath] of config.paths.entries()) {
166
+ const fileName = path.basename(manifestPath);
167
+ if (fileName === 'Cargo.toml') {
168
+ try {
169
+ cargoManifests.push({ entries: parseCargoDependencies(await this.read(manifestPath, config.contents)), sourceIndex });
170
+ }
171
+ catch (cause) {
172
+ config.contents.delete(manifestPath);
173
+ throw manifestError(manifestPath, cause);
174
+ }
175
+ continue;
176
+ }
177
+ const format = manifestFormats[fileName];
178
+ if (!format?.version) {
179
+ continue;
180
+ }
181
+ try {
182
+ const versions = format.version(await this.read(manifestPath, config.contents));
183
+ for (const [name, version] of versions) {
184
+ setCandidate(all, name, version, sourceIndex);
185
+ if (format?.python) {
186
+ python.set(canonicalizePythonPackageName(name), { version, sourceIndex });
187
+ }
188
+ }
189
+ }
190
+ catch (cause) {
191
+ config.contents.delete(manifestPath);
192
+ throw manifestError(manifestPath, cause);
193
+ }
194
+ }
195
+ const cargoDependencies = cargoManifests.flatMap(({ entries, sourceIndex }) => entries.map((entry) => ({ ...entry, sourceIndex })));
196
+ for (const [name, dependency] of resolveCargoDependencies(cargoDependencies)) {
197
+ setCandidate(all, name, dependency.unresolvedWorkspaceReference ? 'any' : normalizeVersion(dependency.version), dependency.sourceIndex);
198
+ }
199
+ return { all, python };
200
+ }
201
+ read(filePath, contents) {
202
+ let content = contents.get(filePath);
203
+ if (!content) {
204
+ content = fs.promises.readFile(filePath, 'utf-8');
205
+ contents.set(filePath, content);
206
+ }
207
+ return content;
208
+ }
209
+ }
210
+ function manifestError(manifestPath, cause) {
211
+ return new Error(`Failed to load manifest: ${manifestPath}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
212
+ }
213
+ const inventories = new WeakMap();
214
+ export function inventoryFor(owner) {
215
+ let inventory = inventories.get(owner);
216
+ if (!inventory) {
217
+ inventory = new ManifestInventory();
218
+ inventories.set(owner, inventory);
219
+ }
220
+ return inventory;
221
+ }
222
+ export function attachInventory(owner, inventory) {
223
+ inventories.set(owner, inventory);
224
+ }
225
+ //# sourceMappingURL=manifestInventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifestInventory.js","sourceRoot":"","sources":["../../src/manifests/manifestInventory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AA0B1I,MAAM,eAAe,GAAmC;IACtD,cAAc,EAAE;QACd,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4C,CAAC;YAC5E,OAAO,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxI,CAAC;QACD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAE3C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC1E,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,oBAAoB,CAAC,OAAiB,CAAC,CAAC,CAAC;YAC5E,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;gBAC3C,GAAG,IAAI,CAAC,YAAY;gBACpB,GAAG,IAAI,CAAC,eAAe;gBACvB,GAAG,IAAI,CAAC,oBAAoB;aAC7B,CAA4B,EAAE,CAAC;gBAC9B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBACvB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;gBACtB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IACD,kBAAkB,EAAE;QAClB,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,OAAO,EAAE,6BAA6B;QACtC,MAAM,EAAE,IAAI;KACb;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,IAAI;KACb;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;QAC1F,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC9B,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACpC,CAAC;YACD,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;KACjF;IACD,SAAS,EAAE;QACT,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChH,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClF,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACpC,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAClC,iHAAiH,CAClH,EAAE,CAAC;gBACF,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACpF,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACzF,CAAC;AAED,SAAS,YAAY,CAAC,UAAyC,EAAE,IAAY,EAAE,OAAe,EAAE,WAAmB;IACjH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,eAAe,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IACvF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5H,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAOD,MAAM,OAAO,iBAAiB;IACpB,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC9C,eAAe,GAAyC,IAAI,CAAC;IAC7D,YAAY,GAAsC,IAAI,CAAC;IACvD,SAAS,GAAkB,IAAI,CAAC;IAExC,eAAe,CAAC,MAA0B;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACzD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;YAC/B,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;gBACtB,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,EAAE,CAAC;oBACrC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC9B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,eAAe,CAAC,MAA0B;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACzD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;YAC5B,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;gBACtB,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;oBAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,QAAQ,CAAC,MAA0B;QACzC,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,MAAsB;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QAEjC,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC3F,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;oBACtC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACd,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClB,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACrC,MAAM,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,MAAsB;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;QACnD,MAAM,cAAc,GAAuF,EAAE,CAAC;QAE9G,KAAK,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,sBAAsB,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;gBACxH,CAAC;gBACD,OAAO,KAAK,EAAE,CAAC;oBACb,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBACrC,MAAM,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACvC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;oBAC9C,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;wBACnB,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC5E,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACrC,MAAM,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QACpI,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC7E,YAAY,CACV,GAAG,EACH,IAAI,EACJ,UAAU,CAAC,4BAA4B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,EACtF,UAAU,CAAC,WAAW,CACvB,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAEO,IAAI,CAAC,QAAgB,EAAE,QAAsC;QACnE,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,SAAS,aAAa,CAAC,YAAoB,EAAE,KAAc;IACzD,OAAO,IAAI,KAAK,CAAC,4BAA4B,YAAY,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACrI,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,OAAO,EAA6B,CAAC;AAE7D,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,SAA4B;IACzE,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,176 @@
1
+ import fs from 'fs';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { ManifestInventory } from './manifestInventory.js';
5
+ import { PEP621_PYPROJECT_FIXTURES } from '../test-utils/manifestFixtures.js';
6
+ async function withManifests(files, run) {
7
+ const rootDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'doc-freshness-manifests-'));
8
+ try {
9
+ for (const [relativePath, content] of Object.entries(files)) {
10
+ const filePath = path.join(rootDir, relativePath);
11
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
12
+ await fs.promises.writeFile(filePath, content, 'utf-8');
13
+ }
14
+ await run(rootDir);
15
+ }
16
+ finally {
17
+ await fs.promises.rm(rootDir, { recursive: true, force: true });
18
+ }
19
+ }
20
+ function candidate(version, sourceIndex = 0) {
21
+ return { version, sourceIndex };
22
+ }
23
+ describe('ManifestInventory', () => {
24
+ it('projects npm names and version precedence', async () => {
25
+ await withManifests({
26
+ 'package.json': JSON.stringify({
27
+ engines: { node: '>=20.0.0', npm: '^11.0.0' },
28
+ dependencies: { React: '18.2.0' },
29
+ devDependencies: { TypeScript: '5.4.5' },
30
+ peerDependencies: { react: '^17 || ^18', typescript: '>=4.7', peerOnly: '>=16', narrowPeer: '^4.0.0', node: '14.0.0' },
31
+ optionalDependencies: { optionalOnly: '2.3.0' },
32
+ }),
33
+ }, async (rootDir) => {
34
+ const inventory = new ManifestInventory();
35
+ const config = { rootDir, manifestFiles: ['package.json'] };
36
+ const [dependencies, versions] = await Promise.all([inventory.dependencyNames(config), inventory.packageVersions(config)]);
37
+ expect(dependencies).toEqual({
38
+ all: new Set(['react', 'typescript', 'peeronly', 'narrowpeer', 'node', 'optionalonly']),
39
+ python: new Set(),
40
+ });
41
+ expect(versions.all).toEqual(new Map([
42
+ ['react', candidate('18.2.0')],
43
+ ['typescript', candidate('5.4.5')],
44
+ ['peeronly', candidate('any')],
45
+ ['narrowpeer', candidate('4.0.0')],
46
+ ['node', candidate('20.0.0')],
47
+ ['optionalonly', candidate('2.3.0')],
48
+ ['nodejs', candidate('20.0.0')],
49
+ ['npm', candidate('11.0.0')],
50
+ ]));
51
+ });
52
+ });
53
+ it('uses the shared Python parsers and keeps canonical candidates separate', async () => {
54
+ await withManifests({
55
+ 'requirements.txt': 'Requests[security]==2.31\nfoo.bar~=7.1\nDjango>=4.2,<5\ncommented_pkg==4.1 # reason\ndirect_pkg @ https://example.com/archive.whl#sha256=abc\n-r other.txt\n',
56
+ 'pyproject.toml': '[project]\ndependencies = ["requests==2.32", "python_name==3.0"]\n',
57
+ }, async (rootDir) => {
58
+ const inventory = new ManifestInventory();
59
+ const config = { rootDir, manifestFiles: ['requirements.txt', 'pyproject.toml'] };
60
+ const [dependencies, versions] = await Promise.all([inventory.dependencyNames(config), inventory.packageVersions(config)]);
61
+ expect(dependencies.all).toEqual(new Set(['requests', 'foo.bar', 'django', 'commented_pkg', 'direct_pkg', 'python_name']));
62
+ expect(dependencies.python).toEqual(new Set(['requests', 'foo-bar', 'django', 'commented-pkg', 'direct-pkg', 'python-name']));
63
+ expect(versions.all.get('requests')).toEqual(candidate('2.32', 1));
64
+ expect(versions.all.get('foo.bar')).toEqual(candidate('7.1'));
65
+ expect(versions.all.get('django')).toEqual(candidate('any'));
66
+ expect(versions.all.get('commented_pkg')).toEqual(candidate('4.1'));
67
+ expect(versions.all.get('direct_pkg')).toEqual(candidate('any'));
68
+ expect(versions.python.get('python-name')).toEqual(candidate('3.0', 1));
69
+ });
70
+ });
71
+ it.each(PEP621_PYPROJECT_FIXTURES.slice(2))('projects PEP 621 $name', async ({ content, dependencies }) => {
72
+ await withManifests({ 'pyproject.toml': content }, async (rootDir) => {
73
+ const versions = await new ManifestInventory().packageVersions({ rootDir, manifestFiles: ['pyproject.toml'] });
74
+ expect(Object.fromEntries(Array.from(versions.all, ([name, value]) => [name, value.version]))).toEqual(dependencies);
75
+ });
76
+ });
77
+ it('uses the shared Go and Cargo parsers and aggregates Cargo candidates', async () => {
78
+ await withManifests({
79
+ 'go.mod': 'module example.test/app\ngo 1.22\nrequire example.test/single v9.0.0\nrequire (\n example.test/block v1.2.3\n)\n',
80
+ 'root/Cargo.toml': '[workspace.dependencies]\nshared = "2.0"\n[dependencies]\nserde = "1.0"\n',
81
+ 'member/Cargo.toml': '[dependencies]\nshared = { workspace = true }\nserde = { path = "../serde" }\n',
82
+ }, async (rootDir) => {
83
+ const inventory = new ManifestInventory();
84
+ const config = { rootDir, manifestFiles: ['go.mod', 'root/Cargo.toml', 'member/Cargo.toml'] };
85
+ const [dependencies, versions] = await Promise.all([inventory.dependencyNames(config), inventory.packageVersions(config)]);
86
+ expect(dependencies.all).toEqual(new Set(['example.test/single', 'example.test/block', 'shared', 'serde']));
87
+ expect(versions.all).toEqual(new Map([
88
+ ['go', candidate('1.22')],
89
+ ['golang', candidate('1.22')],
90
+ ['example.test/single', candidate('9.0.0')],
91
+ ['example.test/block', candidate('1.2.3')],
92
+ ['shared', candidate('2.0', 2)],
93
+ ['serde', candidate('1.0', 1)],
94
+ ]));
95
+ });
96
+ });
97
+ it('projects Maven artifact and Java versions', async () => {
98
+ await withManifests({
99
+ 'pom.xml': '<project><artifactId>app</artifactId><java.version>21</java.version><dependency><artifactId>junit</artifactId><version>5.9</version></dependency></project>',
100
+ 'no-java/pom.xml': '<project><dependency><artifactId>junit</artifactId><version>5.9</version></dependency></project>',
101
+ }, async (rootDir) => {
102
+ const inventory = new ManifestInventory();
103
+ const config = { rootDir, manifestFiles: ['pom.xml'] };
104
+ expect((await inventory.dependencyNames(config)).all).toEqual(new Set(['app', 'junit']));
105
+ expect((await inventory.packageVersions(config)).all).toEqual(new Map([
106
+ ['java', candidate('21')],
107
+ ['junit', candidate('5.9')],
108
+ ]));
109
+ expect((await new ManifestInventory().packageVersions({ rootDir, manifestFiles: ['no-java/pom.xml'] })).all.has('java')).toBe(false);
110
+ });
111
+ });
112
+ it('shares built-in reads across concurrent projections', async () => {
113
+ await withManifests({ 'package.json': JSON.stringify({ dependencies: { shared: '1.0.0' } }) }, async (rootDir) => {
114
+ const readFile = vi.spyOn(fs.promises, 'readFile');
115
+ try {
116
+ const inventory = new ManifestInventory();
117
+ const config = { rootDir, manifestFiles: ['package.json'] };
118
+ const [dependencies, versions] = await Promise.all([inventory.dependencyNames(config), inventory.packageVersions(config)]);
119
+ expect(dependencies.all.has('shared')).toBe(true);
120
+ expect(versions.all.get('shared')).toEqual(candidate('1.0.0'));
121
+ expect(readFile).toHaveBeenCalledOnce();
122
+ }
123
+ finally {
124
+ readFile.mockRestore();
125
+ }
126
+ });
127
+ });
128
+ it('retries failed reads and projections after a same-key manifest is repaired', async () => {
129
+ await withManifests({}, async (rootDir) => {
130
+ const inventory = new ManifestInventory();
131
+ const config = { rootDir, manifestFiles: ['package.json'] };
132
+ const filePath = path.join(rootDir, 'package.json');
133
+ await expect(inventory.dependencyNames(config)).rejects.toMatchObject({
134
+ message: expect.stringContaining(`Failed to load manifest: ${filePath}: ENOENT`),
135
+ cause: expect.objectContaining({ code: 'ENOENT' }),
136
+ });
137
+ await fs.promises.writeFile(filePath, '{', 'utf-8');
138
+ await expect(inventory.packageVersions(config)).rejects.toThrow(`Failed to load manifest: ${filePath}`);
139
+ await fs.promises.writeFile(filePath, JSON.stringify({ dependencies: { repaired: '3.0.0' } }), 'utf-8');
140
+ expect((await inventory.dependencyNames(config)).all).toEqual(new Set(['repaired']));
141
+ expect((await inventory.packageVersions(config)).all.get('repaired')).toEqual(candidate('3.0.0'));
142
+ });
143
+ });
144
+ it('reads neither unknown formats nor an explicitly empty manifest list', async () => {
145
+ const readFile = vi.spyOn(fs.promises, 'readFile');
146
+ try {
147
+ const inventory = new ManifestInventory();
148
+ await expect(inventory.dependencyNames({ rootDir: '/unused', manifestFiles: ['unknown.lock'] })).resolves.toEqual({
149
+ all: new Set(),
150
+ python: new Set(),
151
+ });
152
+ await expect(inventory.packageVersions({ rootDir: '/unused', manifestFiles: [] })).resolves.toEqual({
153
+ all: new Map(),
154
+ python: new Map(),
155
+ });
156
+ expect(readFile).not.toHaveBeenCalled();
157
+ }
158
+ finally {
159
+ readFile.mockRestore();
160
+ }
161
+ });
162
+ it('resets cached projections when the resolved manifest configuration changes', async () => {
163
+ await withManifests({
164
+ 'a/package.json': JSON.stringify({ dependencies: { first: '1.0.0' } }),
165
+ 'b/package.json': JSON.stringify({ dependencies: { second: '2.0.0' } }),
166
+ }, async (rootDir) => {
167
+ const inventory = new ManifestInventory();
168
+ const firstConfig = { rootDir, manifestFiles: ['a/package.json'] };
169
+ const first = await inventory.packageVersions(firstConfig);
170
+ expect(await inventory.packageVersions(firstConfig)).toBe(first);
171
+ expect((await inventory.packageVersions({ rootDir, manifestFiles: ['b/package.json'] })).all.has('second')).toBe(true);
172
+ expect((await inventory.packageVersions(firstConfig)).all.has('first')).toBe(true);
173
+ });
174
+ });
175
+ });
176
+ //# sourceMappingURL=manifestInventory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifestInventory.test.js","sourceRoot":"","sources":["../../src/manifests/manifestInventory.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { DependencyValidator } from '../validators/dependencyValidator.js';
2
+ import { VersionValidator } from '../validators/versionValidator.js';
3
+ import { ManifestInventory } from './manifestInventory.js';
4
+ describe('public manifest validator constructors', () => {
5
+ it('accept only zero arguments in the public type surface', () => {
6
+ expectTypeOf(DependencyValidator).toBeConstructibleWith();
7
+ expectTypeOf(VersionValidator).toBeConstructibleWith();
8
+ const internalInjectionIsRejected = () => {
9
+ // @ts-expect-error ManifestInventory injection is internal-only.
10
+ new DependencyValidator(new ManifestInventory());
11
+ // @ts-expect-error ManifestInventory injection is internal-only.
12
+ new VersionValidator(new ManifestInventory());
13
+ };
14
+ expectTypeOf(internalInjectionIsRejected).toBeFunction();
15
+ });
16
+ });
17
+ //# sourceMappingURL=validatorConstructors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validatorConstructors.test.js","sourceRoot":"","sources":["../../src/manifests/validatorConstructors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,YAAY,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAC1D,YAAY,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAEvD,MAAM,2BAA2B,GAAG,GAAS,EAAE;YAC7C,iEAAiE;YACjE,IAAI,mBAAmB,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;YACjD,iEAAiE;YACjE,IAAI,gBAAgB,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,YAAY,CAAC,2BAA2B,CAAC,CAAC,YAAY,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}