doc-freshness-checker 1.0.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 (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/dist/cache/cacheManager.d.ts +42 -0
  4. package/dist/cache/cacheManager.js +138 -0
  5. package/dist/cache/cacheManager.js.map +1 -0
  6. package/dist/cache/cacheManager.test.d.ts +1 -0
  7. package/dist/cache/cacheManager.test.js +142 -0
  8. package/dist/cache/cacheManager.test.js.map +1 -0
  9. package/dist/cli.d.ts +32 -0
  10. package/dist/cli.js +137 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/cli.test.d.ts +1 -0
  13. package/dist/cli.test.js +184 -0
  14. package/dist/cli.test.js.map +1 -0
  15. package/dist/config/defaults.d.ts +5 -0
  16. package/dist/config/defaults.js +135 -0
  17. package/dist/config/defaults.js.map +1 -0
  18. package/dist/config/defineConfig.d.ts +28 -0
  19. package/dist/config/defineConfig.js +30 -0
  20. package/dist/config/defineConfig.js.map +1 -0
  21. package/dist/config/defineConfig.test.d.ts +1 -0
  22. package/dist/config/defineConfig.test.js +10 -0
  23. package/dist/config/defineConfig.test.js.map +1 -0
  24. package/dist/config/loader.d.ts +7 -0
  25. package/dist/config/loader.js +250 -0
  26. package/dist/config/loader.js.map +1 -0
  27. package/dist/config/loader.test.d.ts +1 -0
  28. package/dist/config/loader.test.js +276 -0
  29. package/dist/config/loader.test.js.map +1 -0
  30. package/dist/git/changeTracker.d.ts +44 -0
  31. package/dist/git/changeTracker.js +149 -0
  32. package/dist/git/changeTracker.js.map +1 -0
  33. package/dist/git/changeTracker.test.d.ts +1 -0
  34. package/dist/git/changeTracker.test.js +184 -0
  35. package/dist/git/changeTracker.test.js.map +1 -0
  36. package/dist/graph/codeDocGraph.d.ts +43 -0
  37. package/dist/graph/codeDocGraph.js +103 -0
  38. package/dist/graph/codeDocGraph.js.map +1 -0
  39. package/dist/graph/codeDocGraph.test.d.ts +1 -0
  40. package/dist/graph/codeDocGraph.test.js +78 -0
  41. package/dist/graph/codeDocGraph.test.js.map +1 -0
  42. package/dist/graph/graphBuilder.d.ts +17 -0
  43. package/dist/graph/graphBuilder.js +76 -0
  44. package/dist/graph/graphBuilder.js.map +1 -0
  45. package/dist/graph/graphBuilder.test.d.ts +1 -0
  46. package/dist/graph/graphBuilder.test.js +87 -0
  47. package/dist/graph/graphBuilder.test.js.map +1 -0
  48. package/dist/index.d.ts +37 -0
  49. package/dist/index.js +37 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/parsers/documentParser.d.ts +22 -0
  52. package/dist/parsers/documentParser.js +76 -0
  53. package/dist/parsers/documentParser.js.map +1 -0
  54. package/dist/parsers/documentParser.test.d.ts +1 -0
  55. package/dist/parsers/documentParser.test.js +116 -0
  56. package/dist/parsers/documentParser.test.js.map +1 -0
  57. package/dist/parsers/extractors/baseExtractor.d.ts +19 -0
  58. package/dist/parsers/extractors/baseExtractor.js +33 -0
  59. package/dist/parsers/extractors/baseExtractor.js.map +1 -0
  60. package/dist/parsers/extractors/baseExtractor.test.d.ts +1 -0
  61. package/dist/parsers/extractors/baseExtractor.test.js +43 -0
  62. package/dist/parsers/extractors/baseExtractor.test.js.map +1 -0
  63. package/dist/parsers/extractors/codePatternExtractor.d.ts +13 -0
  64. package/dist/parsers/extractors/codePatternExtractor.js +108 -0
  65. package/dist/parsers/extractors/codePatternExtractor.js.map +1 -0
  66. package/dist/parsers/extractors/codePatternExtractor.test.d.ts +1 -0
  67. package/dist/parsers/extractors/codePatternExtractor.test.js +49 -0
  68. package/dist/parsers/extractors/codePatternExtractor.test.js.map +1 -0
  69. package/dist/parsers/extractors/dependencyExtractor.d.ts +12 -0
  70. package/dist/parsers/extractors/dependencyExtractor.js +92 -0
  71. package/dist/parsers/extractors/dependencyExtractor.js.map +1 -0
  72. package/dist/parsers/extractors/dependencyExtractor.test.d.ts +1 -0
  73. package/dist/parsers/extractors/dependencyExtractor.test.js +48 -0
  74. package/dist/parsers/extractors/dependencyExtractor.test.js.map +1 -0
  75. package/dist/parsers/extractors/directoryStructureExtractor.d.ts +34 -0
  76. package/dist/parsers/extractors/directoryStructureExtractor.js +168 -0
  77. package/dist/parsers/extractors/directoryStructureExtractor.js.map +1 -0
  78. package/dist/parsers/extractors/directoryStructureExtractor.test.d.ts +1 -0
  79. package/dist/parsers/extractors/directoryStructureExtractor.test.js +121 -0
  80. package/dist/parsers/extractors/directoryStructureExtractor.test.js.map +1 -0
  81. package/dist/parsers/extractors/externalUrlExtractor.d.ts +14 -0
  82. package/dist/parsers/extractors/externalUrlExtractor.js +53 -0
  83. package/dist/parsers/extractors/externalUrlExtractor.js.map +1 -0
  84. package/dist/parsers/extractors/externalUrlExtractor.test.d.ts +1 -0
  85. package/dist/parsers/extractors/externalUrlExtractor.test.js +85 -0
  86. package/dist/parsers/extractors/externalUrlExtractor.test.js.map +1 -0
  87. package/dist/parsers/extractors/filePathExtractor.d.ts +18 -0
  88. package/dist/parsers/extractors/filePathExtractor.js +72 -0
  89. package/dist/parsers/extractors/filePathExtractor.js.map +1 -0
  90. package/dist/parsers/extractors/filePathExtractor.test.d.ts +1 -0
  91. package/dist/parsers/extractors/filePathExtractor.test.js +73 -0
  92. package/dist/parsers/extractors/filePathExtractor.test.js.map +1 -0
  93. package/dist/parsers/extractors/versionExtractor.d.ts +11 -0
  94. package/dist/parsers/extractors/versionExtractor.js +74 -0
  95. package/dist/parsers/extractors/versionExtractor.js.map +1 -0
  96. package/dist/parsers/extractors/versionExtractor.test.d.ts +1 -0
  97. package/dist/parsers/extractors/versionExtractor.test.js +55 -0
  98. package/dist/parsers/extractors/versionExtractor.test.js.map +1 -0
  99. package/dist/plugins/plugin.d.ts +32 -0
  100. package/dist/plugins/plugin.js +40 -0
  101. package/dist/plugins/plugin.js.map +1 -0
  102. package/dist/plugins/plugin.test.d.ts +1 -0
  103. package/dist/plugins/plugin.test.js +23 -0
  104. package/dist/plugins/plugin.test.js.map +1 -0
  105. package/dist/reporters/consoleReporter.d.ts +15 -0
  106. package/dist/reporters/consoleReporter.js +73 -0
  107. package/dist/reporters/consoleReporter.js.map +1 -0
  108. package/dist/reporters/consoleReporter.test.d.ts +1 -0
  109. package/dist/reporters/consoleReporter.test.js +155 -0
  110. package/dist/reporters/consoleReporter.test.js.map +1 -0
  111. package/dist/reporters/enhancedReporter.d.ts +12 -0
  112. package/dist/reporters/enhancedReporter.js +81 -0
  113. package/dist/reporters/enhancedReporter.js.map +1 -0
  114. package/dist/reporters/enhancedReporter.test.d.ts +1 -0
  115. package/dist/reporters/enhancedReporter.test.js +152 -0
  116. package/dist/reporters/enhancedReporter.test.js.map +1 -0
  117. package/dist/reporters/jsonReporter.d.ts +11 -0
  118. package/dist/reporters/jsonReporter.js +20 -0
  119. package/dist/reporters/jsonReporter.js.map +1 -0
  120. package/dist/reporters/jsonReporter.test.d.ts +1 -0
  121. package/dist/reporters/jsonReporter.test.js +31 -0
  122. package/dist/reporters/jsonReporter.test.js.map +1 -0
  123. package/dist/reporters/markdownReporter.d.ts +11 -0
  124. package/dist/reporters/markdownReporter.js +55 -0
  125. package/dist/reporters/markdownReporter.js.map +1 -0
  126. package/dist/reporters/markdownReporter.test.d.ts +1 -0
  127. package/dist/reporters/markdownReporter.test.js +136 -0
  128. package/dist/reporters/markdownReporter.test.js.map +1 -0
  129. package/dist/runner.d.ts +9 -0
  130. package/dist/runner.js +265 -0
  131. package/dist/runner.js.map +1 -0
  132. package/dist/runner.test.d.ts +1 -0
  133. package/dist/runner.test.js +353 -0
  134. package/dist/runner.test.js.map +1 -0
  135. package/dist/scoring/freshnessScorer.d.ts +40 -0
  136. package/dist/scoring/freshnessScorer.js +170 -0
  137. package/dist/scoring/freshnessScorer.js.map +1 -0
  138. package/dist/scoring/freshnessScorer.test.d.ts +1 -0
  139. package/dist/scoring/freshnessScorer.test.js +397 -0
  140. package/dist/scoring/freshnessScorer.test.js.map +1 -0
  141. package/dist/semantic/vectorSearch.d.ts +84 -0
  142. package/dist/semantic/vectorSearch.js +484 -0
  143. package/dist/semantic/vectorSearch.js.map +1 -0
  144. package/dist/semantic/vectorSearch.test.d.ts +1 -0
  145. package/dist/semantic/vectorSearch.test.js +660 -0
  146. package/dist/semantic/vectorSearch.test.js.map +1 -0
  147. package/dist/setupTests.d.ts +4 -0
  148. package/dist/setupTests.js +11 -0
  149. package/dist/setupTests.js.map +1 -0
  150. package/dist/test-utils/console.d.ts +2 -0
  151. package/dist/test-utils/console.js +3 -0
  152. package/dist/test-utils/console.js.map +1 -0
  153. package/dist/test-utils/factories.d.ts +3 -0
  154. package/dist/test-utils/factories.js +25 -0
  155. package/dist/test-utils/factories.js.map +1 -0
  156. package/dist/test-utils/tempFiles.d.ts +1 -0
  157. package/dist/test-utils/tempFiles.js +12 -0
  158. package/dist/test-utils/tempFiles.js.map +1 -0
  159. package/dist/types.d.ts +304 -0
  160. package/dist/types.js +5 -0
  161. package/dist/types.js.map +1 -0
  162. package/dist/utils/boundedMap.d.ts +8 -0
  163. package/dist/utils/boundedMap.js +22 -0
  164. package/dist/utils/boundedMap.js.map +1 -0
  165. package/dist/utils/boundedMap.test.d.ts +1 -0
  166. package/dist/utils/boundedMap.test.js +57 -0
  167. package/dist/utils/boundedMap.test.js.map +1 -0
  168. package/dist/utils/illustrativePatterns.d.ts +28 -0
  169. package/dist/utils/illustrativePatterns.js +80 -0
  170. package/dist/utils/illustrativePatterns.js.map +1 -0
  171. package/dist/utils/illustrativePatterns.test.d.ts +1 -0
  172. package/dist/utils/illustrativePatterns.test.js +48 -0
  173. package/dist/utils/illustrativePatterns.test.js.map +1 -0
  174. package/dist/utils/incremental.d.ts +36 -0
  175. package/dist/utils/incremental.js +87 -0
  176. package/dist/utils/incremental.js.map +1 -0
  177. package/dist/utils/incremental.test.d.ts +1 -0
  178. package/dist/utils/incremental.test.js +84 -0
  179. package/dist/utils/incremental.test.js.map +1 -0
  180. package/dist/utils/parallel.d.ts +14 -0
  181. package/dist/utils/parallel.js +43 -0
  182. package/dist/utils/parallel.js.map +1 -0
  183. package/dist/utils/parallel.test.d.ts +1 -0
  184. package/dist/utils/parallel.test.js +48 -0
  185. package/dist/utils/parallel.test.js.map +1 -0
  186. package/dist/utils/pathSecurity.d.ts +12 -0
  187. package/dist/utils/pathSecurity.js +22 -0
  188. package/dist/utils/pathSecurity.js.map +1 -0
  189. package/dist/utils/pathSecurity.test.d.ts +1 -0
  190. package/dist/utils/pathSecurity.test.js +34 -0
  191. package/dist/utils/pathSecurity.test.js.map +1 -0
  192. package/dist/utils/similarity.d.ts +12 -0
  193. package/dist/utils/similarity.js +64 -0
  194. package/dist/utils/similarity.js.map +1 -0
  195. package/dist/utils/similarity.test.d.ts +1 -0
  196. package/dist/utils/similarity.test.js +49 -0
  197. package/dist/utils/similarity.test.js.map +1 -0
  198. package/dist/utils/validation.d.ts +13 -0
  199. package/dist/utils/validation.js +24 -0
  200. package/dist/utils/validation.js.map +1 -0
  201. package/dist/utils/validation.test.d.ts +1 -0
  202. package/dist/utils/validation.test.js +28 -0
  203. package/dist/utils/validation.test.js.map +1 -0
  204. package/dist/validators/codePatternValidator.d.ts +28 -0
  205. package/dist/validators/codePatternValidator.js +200 -0
  206. package/dist/validators/codePatternValidator.js.map +1 -0
  207. package/dist/validators/codePatternValidator.test.d.ts +1 -0
  208. package/dist/validators/codePatternValidator.test.js +86 -0
  209. package/dist/validators/codePatternValidator.test.js.map +1 -0
  210. package/dist/validators/dependencyValidator.d.ts +12 -0
  211. package/dist/validators/dependencyValidator.js +102 -0
  212. package/dist/validators/dependencyValidator.js.map +1 -0
  213. package/dist/validators/dependencyValidator.test.d.ts +1 -0
  214. package/dist/validators/dependencyValidator.test.js +179 -0
  215. package/dist/validators/dependencyValidator.test.js.map +1 -0
  216. package/dist/validators/directoryValidator.d.ts +30 -0
  217. package/dist/validators/directoryValidator.js +192 -0
  218. package/dist/validators/directoryValidator.js.map +1 -0
  219. package/dist/validators/directoryValidator.test.d.ts +1 -0
  220. package/dist/validators/directoryValidator.test.js +193 -0
  221. package/dist/validators/directoryValidator.test.js.map +1 -0
  222. package/dist/validators/fileValidator.d.ts +16 -0
  223. package/dist/validators/fileValidator.js +114 -0
  224. package/dist/validators/fileValidator.js.map +1 -0
  225. package/dist/validators/fileValidator.test.d.ts +1 -0
  226. package/dist/validators/fileValidator.test.js +108 -0
  227. package/dist/validators/fileValidator.test.js.map +1 -0
  228. package/dist/validators/urlValidator.d.ts +25 -0
  229. package/dist/validators/urlValidator.js +320 -0
  230. package/dist/validators/urlValidator.js.map +1 -0
  231. package/dist/validators/urlValidator.test.d.ts +1 -0
  232. package/dist/validators/urlValidator.test.js +252 -0
  233. package/dist/validators/urlValidator.test.js.map +1 -0
  234. package/dist/validators/validationEngine.d.ts +23 -0
  235. package/dist/validators/validationEngine.js +117 -0
  236. package/dist/validators/validationEngine.js.map +1 -0
  237. package/dist/validators/validationEngine.test.d.ts +1 -0
  238. package/dist/validators/validationEngine.test.js +82 -0
  239. package/dist/validators/validationEngine.test.js.map +1 -0
  240. package/dist/validators/versionValidator.d.ts +18 -0
  241. package/dist/validators/versionValidator.js +211 -0
  242. package/dist/validators/versionValidator.js.map +1 -0
  243. package/dist/validators/versionValidator.test.d.ts +1 -0
  244. package/dist/validators/versionValidator.test.js +308 -0
  245. package/dist/validators/versionValidator.test.js.map +1 -0
  246. package/package.json +98 -0
@@ -0,0 +1,308 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { VersionValidator, manifestParsers } from './versionValidator.js';
4
+ import { makeDoc, makeRef as makeBaseRef } from '../test-utils/factories.js';
5
+ function makeRef(technology, version) {
6
+ return makeBaseRef('version', `${technology} ${version}`, { technology, version });
7
+ }
8
+ const doc = makeDoc();
9
+ const tmpDir = path.join(process.cwd(), '.doc-freshness-cache', 'manifest-test');
10
+ describe('VersionValidator', () => {
11
+ it('validates matching major versions as valid', async () => {
12
+ const validator = new VersionValidator();
13
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
14
+ const pkg = JSON.parse(await fs.promises.readFile(`${process.cwd()}/package.json`, 'utf-8'));
15
+ const tsVersion = pkg.devDependencies?.typescript;
16
+ if (tsVersion) {
17
+ const major = tsVersion.replace(/^[\^~]/, '').split('.')[0];
18
+ const results = await validator.validateBatch([makeRef('TypeScript', `${major}.0`)], doc, config);
19
+ expect(results[0].valid).toBe(true);
20
+ }
21
+ });
22
+ it('detects major version mismatches', async () => {
23
+ const validator = new VersionValidator();
24
+ const config = {
25
+ rootDir: process.cwd(),
26
+ manifestFiles: ['package.json'],
27
+ rules: { version: { severity: 'warning' } },
28
+ };
29
+ const results = await validator.validateBatch([makeRef('TypeScript', '1.0')], doc, config);
30
+ expect(results[0].valid).toBe(false);
31
+ expect(results[0].severity).toBe('warning');
32
+ expect(results[0].suggestion).toContain('Update to');
33
+ });
34
+ it('passes when technology is not found in dependencies', async () => {
35
+ const validator = new VersionValidator();
36
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
37
+ const results = await validator.validateBatch([makeRef('UnknownTech', '1.0')], doc, config);
38
+ expect(results[0].valid).toBe(true);
39
+ expect(results[0].message).toContain('Could not find');
40
+ });
41
+ it('handles references without technology field', async () => {
42
+ const validator = new VersionValidator();
43
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
44
+ const ref = { type: 'version', value: '1.0', lineNumber: 1, raw: '1.0', sourceFile: 'doc.md' };
45
+ const results = await validator.validateBatch([ref], doc, config);
46
+ expect(results[0].valid).toBe(true);
47
+ });
48
+ it('uses technologyMap aliases (node, react, etc.)', async () => {
49
+ const validator = new VersionValidator();
50
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
51
+ const results = await validator.validateBatch([makeRef('react', '999.0')], doc, config);
52
+ // If react is in deps, version 999 mismatches; if not, "could not find" → valid
53
+ expect(results[0]).toBeDefined();
54
+ });
55
+ it('skips unknown manifest file types', async () => {
56
+ const validator = new VersionValidator();
57
+ const config = { rootDir: process.cwd(), manifestFiles: ['unknown-manifest.xyz'] };
58
+ const results = await validator.validateBatch([makeRef('SomeTech', '1.0')], doc, config);
59
+ expect(results[0].valid).toBe(true);
60
+ expect(results[0].message).toContain('Could not find');
61
+ });
62
+ it('handles manifest parse errors gracefully', async () => {
63
+ const validator = new VersionValidator();
64
+ const config = { rootDir: process.cwd(), manifestFiles: ['nonexistent-file.json'] };
65
+ const results = await validator.validateBatch([makeRef('SomeTech', '1.0')], doc, config);
66
+ expect(results[0].valid).toBe(true);
67
+ });
68
+ it('treats version "any" as not constraining', async () => {
69
+ const dir = path.join(tmpDir, 'any-ver');
70
+ await fs.promises.mkdir(dir, { recursive: true });
71
+ await fs.promises.writeFile(path.join(dir, 'requirements.txt'), 'flask\n');
72
+ const validator = new VersionValidator();
73
+ const config = {
74
+ rootDir: process.cwd(),
75
+ manifestFiles: [path.relative(process.cwd(), path.join(dir, 'requirements.txt'))],
76
+ };
77
+ const results = await validator.validateBatch([makeRef('flask', '2.0')], doc, config);
78
+ expect(results[0].valid).toBe(true);
79
+ });
80
+ it('caches loaded versions across calls', async () => {
81
+ const validator = new VersionValidator();
82
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
83
+ await validator.validateBatch([makeRef('TypeScript', '1.0')], doc, config);
84
+ const results = await validator.validateBatch([makeRef('TypeScript', '1.0')], doc, config);
85
+ expect(results[0]).toBeDefined();
86
+ });
87
+ it('compares matching versions correctly (same major)', async () => {
88
+ const dir = path.join(tmpDir, 'same-ver');
89
+ await fs.promises.mkdir(dir, { recursive: true });
90
+ await fs.promises.writeFile(path.join(dir, 'requirements.txt'), 'flask==2.3.0\n');
91
+ const validator = new VersionValidator();
92
+ const config = {
93
+ rootDir: process.cwd(),
94
+ manifestFiles: [path.relative(process.cwd(), path.join(dir, 'requirements.txt'))],
95
+ };
96
+ const results = await validator.validateBatch([makeRef('flask', '2.1')], doc, config);
97
+ expect(results[0].valid).toBe(true);
98
+ });
99
+ it('detects major version mismatch for non-package.json manifests', async () => {
100
+ const dir = path.join(tmpDir, 'mismatch-ver');
101
+ await fs.promises.mkdir(dir, { recursive: true });
102
+ await fs.promises.writeFile(path.join(dir, 'requirements.txt'), 'flask==3.0.0\n');
103
+ const validator = new VersionValidator();
104
+ const config = {
105
+ rootDir: process.cwd(),
106
+ manifestFiles: [path.relative(process.cwd(), path.join(dir, 'requirements.txt'))],
107
+ rules: { version: { severity: 'error' } },
108
+ };
109
+ const results = await validator.validateBatch([makeRef('flask', '2.0')], doc, config);
110
+ expect(results[0].valid).toBe(false);
111
+ expect(results[0].severity).toBe('error');
112
+ });
113
+ it('handles unparseable version strings gracefully', async () => {
114
+ const validator = new VersionValidator();
115
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
116
+ const results = await validator.validateBatch([makeRef('typescript', 'latest')], doc, config);
117
+ expect(results[0].valid).toBe(true);
118
+ });
119
+ it('handles reference with technology but no version', async () => {
120
+ const validator = new VersionValidator();
121
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
122
+ const ref = {
123
+ type: 'version',
124
+ value: 'typescript',
125
+ technology: 'typescript',
126
+ lineNumber: 1,
127
+ raw: 'typescript',
128
+ sourceFile: 'doc.md',
129
+ };
130
+ const results = await validator.validateBatch([ref], doc, config);
131
+ expect(results[0].valid).toBe(true);
132
+ });
133
+ it('handles nodejs alias mapping', async () => {
134
+ const validator = new VersionValidator();
135
+ const config = { rootDir: process.cwd(), manifestFiles: ['package.json'] };
136
+ const results = await validator.validateBatch([makeRef('nodejs', '999.0')], doc, config);
137
+ expect(results[0]).toBeDefined();
138
+ });
139
+ it('treats empty version in package.json as "any"', async () => {
140
+ const dir = path.join(tmpDir, 'empty-ver');
141
+ await fs.promises.mkdir(dir, { recursive: true });
142
+ await fs.promises.writeFile(path.join(dir, 'package.json'), JSON.stringify({
143
+ dependencies: { 'test-pkg': '' },
144
+ }));
145
+ const validator = new VersionValidator();
146
+ const config = {
147
+ rootDir: process.cwd(),
148
+ manifestFiles: [path.relative(process.cwd(), path.join(dir, 'package.json'))],
149
+ };
150
+ const results = await validator.validateBatch([makeRef('test-pkg', '1.0')], doc, config);
151
+ expect(results[0].valid).toBe(true);
152
+ });
153
+ it('uses default manifestFiles when not specified', async () => {
154
+ const validator = new VersionValidator();
155
+ const config = { rootDir: process.cwd() };
156
+ const results = await validator.validateBatch([makeRef('typescript', '1.0')], doc, config);
157
+ expect(results[0]).toBeDefined();
158
+ });
159
+ it('parses package.json with peerDependencies', async () => {
160
+ const dir = path.join(tmpDir, 'peer-deps');
161
+ await fs.promises.mkdir(dir, { recursive: true });
162
+ await fs.promises.writeFile(path.join(dir, 'package.json'), JSON.stringify({
163
+ peerDependencies: { react: '^18.0.0' },
164
+ }));
165
+ const validator = new VersionValidator();
166
+ const config = {
167
+ rootDir: process.cwd(),
168
+ manifestFiles: [path.relative(process.cwd(), path.join(dir, 'package.json'))],
169
+ };
170
+ const results = await validator.validateBatch([makeRef('react', '18.0')], doc, config);
171
+ expect(results[0].valid).toBe(true);
172
+ });
173
+ it('uses technology name directly when not in technologyMap', async () => {
174
+ const dir = path.join(tmpDir, 'direct-tech');
175
+ await fs.promises.mkdir(dir, { recursive: true });
176
+ await fs.promises.writeFile(path.join(dir, 'package.json'), JSON.stringify({
177
+ dependencies: { 'custom-lib': '5.0.0' },
178
+ }));
179
+ const validator = new VersionValidator();
180
+ const config = {
181
+ rootDir: process.cwd(),
182
+ manifestFiles: [path.relative(process.cwd(), path.join(dir, 'package.json'))],
183
+ };
184
+ const results = await validator.validateBatch([makeRef('custom-lib', '5.0')], doc, config);
185
+ expect(results[0].valid).toBe(true);
186
+ });
187
+ it('reloads package versions when manifest config changes on the same instance', async () => {
188
+ const dirA = path.join(tmpDir, 'reload-a');
189
+ const dirB = path.join(tmpDir, 'reload-b');
190
+ await fs.promises.mkdir(dirA, { recursive: true });
191
+ await fs.promises.mkdir(dirB, { recursive: true });
192
+ const manifestA = path.join(dirA, 'package.json');
193
+ const manifestB = path.join(dirB, 'package.json');
194
+ await fs.promises.writeFile(manifestA, JSON.stringify({ dependencies: { react: '17.0.0' } }));
195
+ await fs.promises.writeFile(manifestB, JSON.stringify({ dependencies: { react: '18.0.0' } }));
196
+ const validator = new VersionValidator();
197
+ const configA = {
198
+ rootDir: process.cwd(),
199
+ manifestFiles: [path.relative(process.cwd(), manifestA)],
200
+ };
201
+ const configB = {
202
+ rootDir: process.cwd(),
203
+ manifestFiles: [path.relative(process.cwd(), manifestB)],
204
+ };
205
+ const first = await validator.validateBatch([makeRef('react', '18.0')], doc, configA);
206
+ expect(first[0].valid).toBe(false);
207
+ const second = await validator.validateBatch([makeRef('react', '18.0')], doc, configB);
208
+ expect(second[0].valid).toBe(true);
209
+ });
210
+ });
211
+ describe('manifestParsers', () => {
212
+ beforeAll(async () => {
213
+ await fs.promises.mkdir(tmpDir, { recursive: true });
214
+ });
215
+ afterAll(async () => {
216
+ await fs.promises.rm(tmpDir, { recursive: true, force: true }).catch(() => { });
217
+ });
218
+ it('parses package.json with engines and all dep types', async () => {
219
+ const filePath = path.join(tmpDir, 'package.json');
220
+ await fs.promises.writeFile(filePath, JSON.stringify({
221
+ engines: { node: '>=18.0.0', npm: '>=9.0.0' },
222
+ dependencies: { express: '^4.18.0' },
223
+ devDependencies: { jest: '^29.0.0' },
224
+ }));
225
+ const versions = await manifestParsers['package.json'](filePath);
226
+ expect(versions.get('node')).toBe('18.0.0');
227
+ expect(versions.get('nodejs')).toBe('18.0.0');
228
+ expect(versions.get('npm')).toBe('9.0.0');
229
+ expect(versions.get('express')).toBe('4.18.0');
230
+ expect(versions.get('jest')).toBe('29.0.0');
231
+ });
232
+ it('parses requirements.txt with versions and comments', async () => {
233
+ const filePath = path.join(tmpDir, 'requirements.txt');
234
+ await fs.promises.writeFile(filePath, 'flask>=2.0.1\nrequests==2.31.0\n# comment\ndjango\n');
235
+ const versions = await manifestParsers['requirements.txt'](filePath);
236
+ expect(versions.get('flask')).toBe('2.0.1');
237
+ expect(versions.get('requests')).toBe('2.31.0');
238
+ expect(versions.get('django')).toBe('any');
239
+ });
240
+ it('parses pyproject.toml', async () => {
241
+ const filePath = path.join(tmpDir, 'pyproject.toml');
242
+ await fs.promises.writeFile(filePath, '[project.dependencies]\n"fastapi>=0.100.0"\n"pydantic>=2.0"\n');
243
+ const versions = await manifestParsers['pyproject.toml'](filePath);
244
+ expect(versions.get('fastapi')).toBeDefined();
245
+ expect(versions.get('pydantic')).toBeDefined();
246
+ });
247
+ it('parses go.mod', async () => {
248
+ const filePath = path.join(tmpDir, 'go.mod');
249
+ await fs.promises.writeFile(filePath, 'module example.com/mymod\n\ngo 1.21\n\nrequire (\n\tgithub.com/gin-gonic/gin v1.9.1\n)');
250
+ const versions = await manifestParsers['go.mod'](filePath);
251
+ expect(versions.get('go')).toBe('1.21');
252
+ expect(versions.get('golang')).toBe('1.21');
253
+ expect(versions.get('github.com/gin-gonic/gin')).toBe('1.9.1');
254
+ });
255
+ it('parses Cargo.toml', async () => {
256
+ const filePath = path.join(tmpDir, 'Cargo.toml');
257
+ await fs.promises.writeFile(filePath, '[dependencies]\nserde = "1.0"\ntokio = "1.28"');
258
+ const versions = await manifestParsers['Cargo.toml'](filePath);
259
+ expect(versions.get('serde')).toBe('1.0');
260
+ expect(versions.get('tokio')).toBe('1.28');
261
+ });
262
+ it('parses go.mod without require block', async () => {
263
+ const filePath = path.join(tmpDir, 'go-no-require.mod');
264
+ await fs.promises.writeFile(filePath, 'module example.com/mymod\n\ngo 1.22\n');
265
+ const versions = await manifestParsers['go.mod'](filePath);
266
+ expect(versions.get('go')).toBe('1.22');
267
+ expect(versions.size).toBe(2);
268
+ });
269
+ it('parses Cargo.toml without dependencies section', async () => {
270
+ const filePath = path.join(tmpDir, 'Cargo-empty.toml');
271
+ await fs.promises.writeFile(filePath, '[package]\nname = "myapp"\nversion = "0.1.0"');
272
+ const versions = await manifestParsers['Cargo.toml'](filePath);
273
+ expect(versions.size).toBe(0);
274
+ });
275
+ it('parses pyproject.toml without dependencies section', async () => {
276
+ const filePath = path.join(tmpDir, 'pyproject-empty.toml');
277
+ await fs.promises.writeFile(filePath, '[tool.poetry]\nname = "myapp"');
278
+ const versions = await manifestParsers['pyproject.toml'](filePath);
279
+ expect(versions.size).toBe(0);
280
+ });
281
+ it('parses requirements.txt with comments and blank lines', async () => {
282
+ const filePath = path.join(tmpDir, 'requirements-comments.txt');
283
+ await fs.promises.writeFile(filePath, '# Comment\n\nflask>=2.0\n \n# Another comment\n');
284
+ const versions = await manifestParsers['requirements.txt'](filePath);
285
+ expect(versions.get('flask')).toBeDefined();
286
+ expect(versions.size).toBe(1);
287
+ });
288
+ it('parses pom.xml without java version', async () => {
289
+ const filePath = path.join(tmpDir, 'pom-no-java.xml');
290
+ await fs.promises.writeFile(filePath, '<project><dependencies><dependency><artifactId>junit</artifactId><version>5.9</version></dependency></dependencies></project>');
291
+ const versions = await manifestParsers['pom.xml'](filePath);
292
+ expect(versions.get('junit')).toBe('5.9');
293
+ expect(versions.has('java')).toBe(false);
294
+ });
295
+ it('parses pom.xml with java version and dependencies', async () => {
296
+ const filePath = path.join(tmpDir, 'pom.xml');
297
+ await fs.promises.writeFile(filePath, `<project>
298
+ <properties><java.version>17</java.version></properties>
299
+ <dependencies>
300
+ <dependency><artifactId>spring-boot</artifactId><version>3.1.0</version></dependency>
301
+ </dependencies>
302
+ </project>`);
303
+ const versions = await manifestParsers['pom.xml'](filePath);
304
+ expect(versions.get('java')).toBe('17');
305
+ expect(versions.get('spring-boot')).toBe('3.1.0');
306
+ });
307
+ });
308
+ //# sourceMappingURL=versionValidator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionValidator.test.js","sourceRoot":"","sources":["../../src/validators/versionValidator.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE7E,SAAS,OAAO,CAAC,UAAkB,EAAE,OAAe;IAClD,OAAO,WAAW,CAAC,SAAS,EAAE,GAAG,UAAU,IAAI,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC;AAEjF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7F,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAClG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,cAAc,CAAC;YAC/B,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;SAC5C,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5F,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,GAAG,GAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAC1G,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACxF,gFAAgF;QAChF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACvG,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACxG,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;SAClF,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAClF,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;SAClF,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAClF,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACjF,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;SAC1C,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9F,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,GAAG,GAAc;YACrB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,YAAY;YACxB,UAAU,EAAE,CAAC;YACb,GAAG,EAAE,YAAY;YACjB,UAAU,EAAE,QAAQ;SACrB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC;YACb,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;SACjC,CAAC,CACH,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;SAC9E,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC;YACb,gBAAgB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;SACvC,CAAC,CACH,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;SAC9E,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACvF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC;YACb,YAAY,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE;SACxC,CAAC,CACH,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAuB;YACjC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;SAC9E,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAE9F,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,OAAO,GAAuB;YAClC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;SACzD,CAAC;QACF,MAAM,OAAO,GAAuB;YAClC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;SACzD,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACtF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC;YACb,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE;YAC7C,YAAY,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;YACpC,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SACrC,CAAC,CACH,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,qDAAqD,CAAC,CAAC;QAC7F,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,+DAA+D,CAAC,CAAC;QACvG,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,wFAAwF,CAAC,CAAC;QAChI,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,+CAA+C,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,8CAA8C,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,kDAAkD,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACtD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,QAAQ,EACR,+HAA+H,CAChI,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,QAAQ,EACR;;;;;WAKK,CACN,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,98 @@
1
+ {
2
+ "name": "doc-freshness-checker",
3
+ "version": "1.0.0",
4
+ "description": "Universal documentation freshness checker - validates documentation accuracy against actual codebase",
5
+ "homepage": "https://github.com/cosmocoder/doc-freshness-checker#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/cosmocoder/doc-freshness-checker/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/cosmocoder/doc-freshness-checker.git"
12
+ },
13
+ "license": "MIT",
14
+ "author": "cosmocoder",
15
+ "type": "module",
16
+ "main": "dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js",
22
+ "default": "./dist/index.js"
23
+ }
24
+ },
25
+ "bin": {
26
+ "doc-freshness": "dist/cli.js"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md"
31
+ ],
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "build:watch": "tsc --watch",
35
+ "clean": "rm -rf dist",
36
+ "prepublishOnly": "npm run clean && npm run build",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "test:coverage": "vitest run --coverage",
40
+ "test:types": "tsc --noEmit",
41
+ "lint": "eslint . --ext .js,.ts",
42
+ "lint:fix": "npm run lint -- --fix",
43
+ "prettier": "prettier --write src/",
44
+ "prettier:ci": "prettier --check src/",
45
+ "docs:check": "node dist/cli.js",
46
+ "docs:check:json": "node dist/cli.js --reporter json --output reports/doc-freshness.json",
47
+ "prepare": "husky"
48
+ },
49
+ "keywords": [
50
+ "documentation",
51
+ "freshness",
52
+ "validation",
53
+ "docs",
54
+ "checker",
55
+ "stale",
56
+ "lint",
57
+ "markdown",
58
+ "ci",
59
+ "devops"
60
+ ],
61
+ "engines": {
62
+ "node": ">=22.19.0"
63
+ },
64
+ "engine-strict": true,
65
+ "dependencies": {
66
+ "commander": "12.0.0",
67
+ "fastembed": "2.1.0",
68
+ "glob": "10.3.10",
69
+ "semver": "7.6.0"
70
+ },
71
+ "devDependencies": {
72
+ "@commitlint/cli": "20.4.3",
73
+ "@commitlint/config-conventional": "20.4.3",
74
+ "@eslint/js": "9.39.2",
75
+ "@types/node": "25.2.0",
76
+ "@types/semver": "7.7.1",
77
+ "@vitest/coverage-v8": "4.0.18",
78
+ "eslint": "9.39.2",
79
+ "globals": "17.3.0",
80
+ "husky": "9.1.7",
81
+ "jiti": "2.6.1",
82
+ "lint-staged": "16.3.2",
83
+ "prettier": "3.8.1",
84
+ "typescript": "5.9.3",
85
+ "typescript-eslint": "8.54.0",
86
+ "vitest": "4.0.18",
87
+ "vitest-fetch-mock": "0.4.5"
88
+ },
89
+ "lint-staged": {
90
+ "src/**/*.md": [
91
+ "npm run prettier"
92
+ ],
93
+ "src/**/*.{js,ts}": [
94
+ "npm run lint:fix",
95
+ "npm run prettier"
96
+ ]
97
+ }
98
+ }