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,108 @@
1
+ import { BaseExtractor } from './baseExtractor.js';
2
+ import { isIllustrativeSymbol } from '../../utils/illustrativePatterns.js';
3
+ /**
4
+ * Extracts code pattern references
5
+ * Configurable for any programming language
6
+ */
7
+ export class CodePatternExtractor extends BaseExtractor {
8
+ languageAliases;
9
+ languagePatterns;
10
+ constructor(config = {}) {
11
+ super('code-pattern');
12
+ // Language-specific code block identifiers
13
+ this.languageAliases = config.languageAliases || {
14
+ javascript: ['javascript', 'js'],
15
+ typescript: ['typescript', 'ts'],
16
+ python: ['python', 'py'],
17
+ go: ['go', 'golang'],
18
+ rust: ['rust', 'rs'],
19
+ java: ['java'],
20
+ csharp: ['csharp', 'cs', 'c#'],
21
+ ruby: ['ruby', 'rb'],
22
+ php: ['php'],
23
+ };
24
+ // Language-specific patterns for extracting code symbols
25
+ this.languagePatterns = config.languagePatterns || {
26
+ javascript: [
27
+ { regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
28
+ { regex: /\bfunction\s+([a-zA-Z][a-zA-Z0-9]+)/g, kind: 'function' },
29
+ { regex: /\bconst\s+([A-Z][a-zA-Z0-9]+)\s*=/g, kind: 'const' },
30
+ {
31
+ regex: /\bexport\s+(?:default\s+)?(?:class|function|const)\s+([a-zA-Z][a-zA-Z0-9]+)/g,
32
+ kind: 'export',
33
+ },
34
+ ],
35
+ typescript: [
36
+ { regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
37
+ { regex: /\binterface\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'interface' },
38
+ { regex: /\btype\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'type' },
39
+ { regex: /\bfunction\s+([a-zA-Z][a-zA-Z0-9]+)/g, kind: 'function' },
40
+ { regex: /\bexport\s+\{\s*([A-Z][a-zA-Z0-9]+)/g, kind: 'export' },
41
+ ],
42
+ python: [
43
+ { regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
44
+ { regex: /\bdef\s+([a-z_][a-zA-Z0-9_]*)/g, kind: 'function' },
45
+ ],
46
+ go: [
47
+ { regex: /\btype\s+([A-Z][a-zA-Z0-9]+)\s+struct/g, kind: 'struct' },
48
+ { regex: /\btype\s+([A-Z][a-zA-Z0-9]+)\s+interface/g, kind: 'interface' },
49
+ { regex: /\bfunc\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'function' },
50
+ ],
51
+ rust: [
52
+ { regex: /\bstruct\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'struct' },
53
+ { regex: /\benum\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'enum' },
54
+ { regex: /\btrait\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'trait' },
55
+ { regex: /\bfn\s+([a-z_][a-zA-Z0-9_]*)/g, kind: 'function' },
56
+ ],
57
+ java: [
58
+ { regex: /\bclass\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'class' },
59
+ { regex: /\binterface\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'interface' },
60
+ { regex: /\benum\s+([A-Z][a-zA-Z0-9]+)/g, kind: 'enum' },
61
+ ],
62
+ };
63
+ }
64
+ extract(document) {
65
+ const references = [];
66
+ // Build pattern to match code blocks for all configured languages
67
+ const allAliases = Object.values(this.languageAliases).flat();
68
+ const langPattern = allAliases.join('|');
69
+ const codeBlockPattern = new RegExp(`\`\`\`(?:${langPattern})\\n([\\s\\S]*?)\`\`\``, 'gi');
70
+ let blockMatch;
71
+ while ((blockMatch = codeBlockPattern.exec(document.content)) !== null) {
72
+ const blockContent = blockMatch[1];
73
+ const blockLine = this.findLineNumber(document.content, blockMatch.index);
74
+ const detectedLang = this.detectLanguage(blockMatch[0]);
75
+ const patterns = this.languagePatterns[detectedLang] || this.languagePatterns.javascript;
76
+ for (const { regex, kind } of patterns) {
77
+ let match;
78
+ // Clone regex to avoid state issues
79
+ const re = new RegExp(regex.source, regex.flags);
80
+ while ((match = re.exec(blockContent)) !== null) {
81
+ const symbolName = match[1];
82
+ const illustrative = isIllustrativeSymbol(symbolName);
83
+ references.push({
84
+ type: this.type,
85
+ kind,
86
+ language: detectedLang,
87
+ value: symbolName,
88
+ lineNumber: blockLine,
89
+ raw: match[0],
90
+ sourceFile: document.path,
91
+ ...(illustrative && { isIllustrative: true }),
92
+ });
93
+ }
94
+ }
95
+ }
96
+ return references;
97
+ }
98
+ detectLanguage(codeBlockStart) {
99
+ const lower = codeBlockStart.toLowerCase();
100
+ for (const [lang, aliases] of Object.entries(this.languageAliases)) {
101
+ if (aliases.some((alias) => lower.includes(alias))) {
102
+ return lang;
103
+ }
104
+ }
105
+ return 'javascript'; // default
106
+ }
107
+ }
108
+ //# sourceMappingURL=codePatternExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codePatternExtractor.js","sourceRoot":"","sources":["../../../src/parsers/extractors/codePatternExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { CodePatternExtractor } from './codePatternExtractor.js';
2
+ function makeDoc(content) {
3
+ return {
4
+ path: 'docs/test.md',
5
+ absolutePath: '/project/docs/test.md',
6
+ content,
7
+ format: 'markdown',
8
+ lines: content.split('\n'),
9
+ references: [],
10
+ };
11
+ }
12
+ describe('CodePatternExtractor', () => {
13
+ const extractor = new CodePatternExtractor();
14
+ it('extracts class and function names from TypeScript code blocks', () => {
15
+ const doc = makeDoc(['```typescript', 'class ValidationEngine {', ' constructor() {}', '}', 'function runCheck() {}', '```'].join('\n'));
16
+ const refs = extractor.extract(doc);
17
+ expect(refs.map((r) => r.value)).toContain('ValidationEngine');
18
+ expect(refs.map((r) => r.value)).toContain('runCheck');
19
+ });
20
+ it('extracts interfaces and types from TypeScript', () => {
21
+ const doc = makeDoc(['```ts', 'interface ConfigOptions {}', 'type ResultType = string;', '```'].join('\n'));
22
+ const refs = extractor.extract(doc);
23
+ expect(refs.map((r) => r.value)).toContain('ConfigOptions');
24
+ expect(refs.map((r) => r.value)).toContain('ResultType');
25
+ });
26
+ it('extracts Python symbols', () => {
27
+ const doc = makeDoc(['```python', 'class UserService:', ' def get_user(self):', ' pass', '```'].join('\n'));
28
+ const refs = extractor.extract(doc);
29
+ expect(refs.map((r) => r.value)).toContain('UserService');
30
+ expect(refs.map((r) => r.value)).toContain('get_user');
31
+ });
32
+ it('marks illustrative symbols', () => {
33
+ const doc = makeDoc(['```javascript', 'class YourComponent {}', 'function FooBar() {}', '```'].join('\n'));
34
+ const refs = extractor.extract(doc);
35
+ const illustrative = refs.filter((r) => r.isIllustrative);
36
+ expect(illustrative.length).toBeGreaterThan(0);
37
+ });
38
+ it('ignores non-code blocks', () => {
39
+ const doc = makeDoc('class NotInBlock {}');
40
+ expect(extractor.extract(doc)).toHaveLength(0);
41
+ });
42
+ it('detects language from code block tag', () => {
43
+ const doc = makeDoc(['```go', 'type ServerConfig struct {}', 'func HandleRequest() {}', '```'].join('\n'));
44
+ const refs = extractor.extract(doc);
45
+ expect(refs.some((r) => r.language === 'go')).toBe(true);
46
+ expect(refs.map((r) => r.value)).toContain('ServerConfig');
47
+ });
48
+ });
49
+ //# sourceMappingURL=codePatternExtractor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codePatternExtractor.test.js","sourceRoot":"","sources":["../../../src/parsers/extractors/codePatternExtractor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BaseExtractor } from './baseExtractor.js';
2
+ import type { Document, DocFreshnessConfig, Reference } from '../../types.js';
3
+ /**
4
+ * Extracts dependency references
5
+ * Supports multiple package ecosystems
6
+ */
7
+ export declare class DependencyExtractor extends BaseExtractor {
8
+ private ecosystems;
9
+ constructor(config?: Partial<DocFreshnessConfig>);
10
+ extract(document: Document): Reference[];
11
+ private isFalsePositive;
12
+ }
@@ -0,0 +1,92 @@
1
+ import { BaseExtractor } from './baseExtractor.js';
2
+ /**
3
+ * Extracts dependency references
4
+ * Supports multiple package ecosystems
5
+ */
6
+ export class DependencyExtractor extends BaseExtractor {
7
+ ecosystems;
8
+ constructor(config = {}) {
9
+ super('dependency');
10
+ this.ecosystems = config.ecosystems || ['npm', 'pypi', 'crates', 'go'];
11
+ }
12
+ extract(document) {
13
+ const references = [];
14
+ const patterns = [
15
+ // npm scoped packages: @scope/package-name
16
+ { regex: /`(@[a-z0-9-]+\/[a-z0-9-]+)`/g, ecosystem: 'npm' },
17
+ // npm regular packages in backticks
18
+ { regex: /`([a-z][a-z0-9-]{2,})`/g, ecosystem: 'npm' },
19
+ // Go packages
20
+ { regex: /`(github\.com\/[a-zA-Z0-9\-_]+\/[a-zA-Z0-9\-_]+)`/g, ecosystem: 'go' },
21
+ ];
22
+ for (const { regex, ecosystem } of patterns) {
23
+ if (!this.ecosystems.includes(ecosystem))
24
+ continue;
25
+ let match;
26
+ const re = new RegExp(regex.source, regex.flags);
27
+ while ((match = re.exec(document.content)) !== null) {
28
+ const pkg = match[1];
29
+ // Filter out common false positives
30
+ if (this.isFalsePositive(pkg))
31
+ continue;
32
+ references.push({
33
+ type: this.type,
34
+ value: pkg,
35
+ ecosystem,
36
+ lineNumber: this.findLineNumber(document.content, match.index),
37
+ raw: match[0],
38
+ sourceFile: document.path,
39
+ });
40
+ }
41
+ }
42
+ return references;
43
+ }
44
+ isFalsePositive(pkg) {
45
+ // Skip very short names
46
+ if (pkg.length < 3)
47
+ return true;
48
+ // Skip common words that appear in backticks
49
+ const commonWords = [
50
+ 'true',
51
+ 'false',
52
+ 'null',
53
+ 'undefined',
54
+ 'string',
55
+ 'number',
56
+ 'boolean',
57
+ 'object',
58
+ 'array',
59
+ 'function',
60
+ 'class',
61
+ 'const',
62
+ 'let',
63
+ 'var',
64
+ 'return',
65
+ 'import',
66
+ 'export',
67
+ 'default',
68
+ 'async',
69
+ 'await',
70
+ 'error',
71
+ 'warning',
72
+ 'info',
73
+ 'debug',
74
+ 'console',
75
+ 'config',
76
+ 'options',
77
+ 'data',
78
+ 'value',
79
+ 'name',
80
+ 'type',
81
+ 'path',
82
+ 'file',
83
+ ];
84
+ if (commonWords.includes(pkg.toLowerCase()))
85
+ return true;
86
+ // Skip file extensions
87
+ if (/\.[a-z]{2,4}$/.test(pkg))
88
+ return true;
89
+ return false;
90
+ }
91
+ }
92
+ //# sourceMappingURL=dependencyExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyExtractor.js","sourceRoot":"","sources":["../../../src/parsers/extractors/dependencyExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnD;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAC5C,UAAU,CAAW;IAE7B,YAAY,SAAsC,EAAE;QAClD,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,QAAkB;QACxB,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,MAAM,QAAQ,GAAoB;YAChC,2CAA2C;YAC3C,EAAE,KAAK,EAAE,8BAA8B,EAAE,SAAS,EAAE,KAAK,EAAE;YAC3D,oCAAoC;YACpC,EAAE,KAAK,EAAE,yBAAyB,EAAE,SAAS,EAAE,KAAK,EAAE;YACtD,cAAc;YACd,EAAE,KAAK,EAAE,oDAAoD,EAAE,SAAS,EAAE,IAAI,EAAE;SACjF,CAAC;QAEF,KAAK,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,SAAS;YAEnD,IAAI,KAA6B,CAAC;YAClC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAErB,oCAAoC;gBACpC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAExC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,GAAG;oBACV,SAAS;oBACT,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;oBAC9D,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;oBACb,UAAU,EAAE,QAAQ,CAAC,IAAI;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,eAAe,CAAC,GAAW;QACjC,wBAAwB;QACxB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhC,6CAA6C;QAC7C,MAAM,WAAW,GAAG;YAClB,MAAM;YACN,OAAO;YACP,MAAM;YACN,WAAW;YACX,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,QAAQ;YACR,OAAO;YACP,UAAU;YACV,OAAO;YACP,OAAO;YACP,KAAK;YACL,KAAK;YACL,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,OAAO;YACP,OAAO;YACP,OAAO;YACP,SAAS;YACT,MAAM;YACN,OAAO;YACP,SAAS;YACT,QAAQ;YACR,SAAS;YACT,MAAM;YACN,OAAO;YACP,MAAM;YACN,MAAM;YACN,MAAM;YACN,MAAM;SACP,CAAC;QAEF,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzD,uBAAuB;QACvB,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import { DependencyExtractor } from './dependencyExtractor.js';
2
+ function makeDoc(content) {
3
+ return {
4
+ path: 'docs/test.md',
5
+ absolutePath: '/project/docs/test.md',
6
+ content,
7
+ format: 'markdown',
8
+ lines: content.split('\n'),
9
+ references: [],
10
+ };
11
+ }
12
+ describe('DependencyExtractor', () => {
13
+ const extractor = new DependencyExtractor();
14
+ it('extracts npm scoped packages in backticks', () => {
15
+ const doc = makeDoc('Install `@types/node` for types');
16
+ const refs = extractor.extract(doc);
17
+ expect(refs.some((r) => r.value === '@types/node')).toBe(true);
18
+ });
19
+ it('extracts regular npm packages in backticks', () => {
20
+ const doc = makeDoc('Use `express` and `commander` for CLI');
21
+ const refs = extractor.extract(doc);
22
+ const values = refs.map((r) => r.value);
23
+ expect(values).toContain('express');
24
+ expect(values).toContain('commander');
25
+ });
26
+ it('extracts Go packages', () => {
27
+ const doc = makeDoc('Import `github.com/gin-gonic/gin`');
28
+ const refs = extractor.extract(doc);
29
+ expect(refs.some((r) => r.value === 'github.com/gin-gonic/gin' && r.ecosystem === 'go')).toBe(true);
30
+ });
31
+ it('filters out common words and short names', () => {
32
+ const doc = makeDoc('Use `true`, `false`, `null`, `ab`, `config`');
33
+ const refs = extractor.extract(doc);
34
+ expect(refs).toHaveLength(0);
35
+ });
36
+ it('filters out file extensions', () => {
37
+ const doc = makeDoc('Edit `styles.css` and `app.tsx`');
38
+ const refs = extractor.extract(doc);
39
+ expect(refs).toHaveLength(0);
40
+ });
41
+ it('respects configured ecosystems', () => {
42
+ const npmOnly = new DependencyExtractor({ ecosystems: ['npm'] });
43
+ const doc = makeDoc('Use `express` and `github.com/gin-gonic/gin`');
44
+ const refs = npmOnly.extract(doc);
45
+ expect(refs.every((r) => r.ecosystem === 'npm')).toBe(true);
46
+ });
47
+ });
48
+ //# sourceMappingURL=dependencyExtractor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyExtractor.test.js","sourceRoot":"","sources":["../../../src/parsers/extractors/dependencyExtractor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { BaseExtractor } from './baseExtractor.js';
2
+ import type { DocFreshnessConfig, Document, Reference } from '../../types.js';
3
+ /**
4
+ * Extracts directory structure references from code blocks
5
+ * Pattern: ASCII tree structures in fenced code blocks
6
+ *
7
+ * This extractor understands tree hierarchy and builds full paths
8
+ * from the tree structure.
9
+ */
10
+ export declare class DirectoryStructureExtractor extends BaseExtractor {
11
+ private customPatterns;
12
+ constructor(config?: Partial<DocFreshnessConfig>);
13
+ extract(document: Document): Reference[];
14
+ /**
15
+ * Parse a directory tree and reconstruct full paths
16
+ */
17
+ private parseTreeStructure;
18
+ /**
19
+ * Calculate the depth level of a tree line based on indentation and tree characters
20
+ */
21
+ private calculateDepth;
22
+ /**
23
+ * Extract the file/folder name from a tree line
24
+ */
25
+ private extractName;
26
+ /**
27
+ * Check if an entry should be skipped
28
+ */
29
+ private shouldSkipEntry;
30
+ /**
31
+ * Check if a path looks valid (not just a single generic name)
32
+ */
33
+ private isValidPath;
34
+ }
@@ -0,0 +1,168 @@
1
+ import { BaseExtractor } from './baseExtractor.js';
2
+ import { isIllustrativePath, compilePatterns } from '../../utils/illustrativePatterns.js';
3
+ /**
4
+ * Extracts directory structure references from code blocks
5
+ * Pattern: ASCII tree structures in fenced code blocks
6
+ *
7
+ * This extractor understands tree hierarchy and builds full paths
8
+ * from the tree structure.
9
+ */
10
+ export class DirectoryStructureExtractor extends BaseExtractor {
11
+ customPatterns;
12
+ constructor(config = {}) {
13
+ super('directory-structure');
14
+ // Build custom illustrative patterns from config
15
+ const configPatterns = config.rules?.['directory-structure']?.illustrativePatterns;
16
+ this.customPatterns = configPatterns ? compilePatterns(configPatterns) : [];
17
+ }
18
+ extract(document) {
19
+ const references = [];
20
+ // Match fenced code blocks that look like directory trees
21
+ const codeBlockPatterns = {
22
+ markdown: /```(?:\w*)\n([\s\S]*?)```/g,
23
+ restructuredtext: /\.\.\s+code-block::\s*\n\n((?:[ ]{3,}[^\n]*\n?)+)/g,
24
+ asciidoc: /----\n([\s\S]*?)----/g,
25
+ };
26
+ const codeBlockPattern = codeBlockPatterns[document.format] || codeBlockPatterns.markdown;
27
+ let blockMatch;
28
+ while ((blockMatch = codeBlockPattern.exec(document.content)) !== null) {
29
+ const blockContent = blockMatch[1];
30
+ // Check if this looks like a directory tree
31
+ const hasTreeChars = blockContent.includes('├') ||
32
+ blockContent.includes('│') ||
33
+ blockContent.includes('└') ||
34
+ blockContent.includes('|--') ||
35
+ blockContent.includes('`--');
36
+ if (hasTreeChars) {
37
+ const blockLine = this.findLineNumber(document.content, blockMatch.index);
38
+ const paths = this.parseTreeStructure(blockContent);
39
+ for (const fullPath of paths) {
40
+ const illustrative = isIllustrativePath(fullPath, this.customPatterns);
41
+ references.push({
42
+ type: this.type,
43
+ value: fullPath,
44
+ lineNumber: blockLine,
45
+ raw: fullPath,
46
+ sourceFile: document.path,
47
+ ...(illustrative && { isIllustrative: true }),
48
+ });
49
+ }
50
+ }
51
+ }
52
+ return references;
53
+ }
54
+ /**
55
+ * Parse a directory tree and reconstruct full paths
56
+ */
57
+ parseTreeStructure(blockContent) {
58
+ const paths = [];
59
+ const lines = blockContent.split('\n');
60
+ // Stack to track current path at each depth level
61
+ // Each entry: { depth: number, name: string }
62
+ const pathStack = [];
63
+ for (const line of lines) {
64
+ if (!line.trim())
65
+ continue;
66
+ // Calculate depth based on leading characters
67
+ const depth = this.calculateDepth(line);
68
+ // Extract the file/folder name
69
+ const name = this.extractName(line);
70
+ if (!name)
71
+ continue;
72
+ // Skip common non-path entries
73
+ if (this.shouldSkipEntry(name))
74
+ continue;
75
+ // Pop stack entries that are at same or deeper level
76
+ while (pathStack.length > 0 && pathStack[pathStack.length - 1].depth >= depth) {
77
+ pathStack.pop();
78
+ }
79
+ // Push current entry
80
+ pathStack.push({ depth, name });
81
+ // Build full path from stack
82
+ const fullPath = pathStack.map((entry) => entry.name).join('/');
83
+ // Only add paths that look like real files/directories
84
+ if (this.isValidPath(fullPath)) {
85
+ paths.push(fullPath);
86
+ }
87
+ }
88
+ return paths;
89
+ }
90
+ /**
91
+ * Calculate the depth level of a tree line based on indentation and tree characters
92
+ */
93
+ calculateDepth(line) {
94
+ // Count leading whitespace and tree characters
95
+ let depth = 0;
96
+ let i = 0;
97
+ while (i < line.length) {
98
+ const char = line[i];
99
+ if (char === ' ' || char === '\t') {
100
+ depth += char === '\t' ? 4 : 1;
101
+ i++;
102
+ }
103
+ else if (char === '│' || char === '|') {
104
+ depth += 4;
105
+ i++;
106
+ }
107
+ else if (char === '├' || char === '└' || char === '+' || char === '`') {
108
+ depth += 4;
109
+ // Skip the rest of the tree characters (─, --, etc.)
110
+ i++;
111
+ while (i < line.length && (line[i] === '─' || line[i] === '-' || line[i] === ' ')) {
112
+ i++;
113
+ }
114
+ break;
115
+ }
116
+ else {
117
+ break;
118
+ }
119
+ }
120
+ return Math.floor(depth / 4);
121
+ }
122
+ /**
123
+ * Extract the file/folder name from a tree line
124
+ */
125
+ extractName(line) {
126
+ // Remove tree characters and extract the name
127
+ // Handles: ├── name, │ ├── name, └── name, |-- name, `-- name
128
+ const cleaned = line
129
+ .replace(/^[\s│|]*[├└+`][\s─-]*/g, '') // Tree prefixes
130
+ .replace(/^[\s│|]+/g, '') // Just vertical bars and spaces
131
+ .trim();
132
+ // Extract just the name (handle trailing / for directories)
133
+ const match = cleaned.match(/^([a-zA-Z0-9_\-.@]+)\/?$/);
134
+ return match ? match[1] : null;
135
+ }
136
+ /**
137
+ * Check if an entry should be skipped
138
+ */
139
+ shouldSkipEntry(name) {
140
+ // Skip comments, ellipsis, separators, etc.
141
+ if (name.startsWith('#'))
142
+ return true;
143
+ if (name === '...')
144
+ return true;
145
+ if (name === '-')
146
+ return true;
147
+ if (name === '---')
148
+ return true;
149
+ if (/^-+$/.test(name))
150
+ return true; // Any number of dashes
151
+ if (name.length === 0)
152
+ return true;
153
+ // Skip entries that look like markdown/asciidoc separators
154
+ if (/^[=\-_~]+$/.test(name))
155
+ return true;
156
+ return false;
157
+ }
158
+ /**
159
+ * Check if a path looks valid (not just a single generic name)
160
+ */
161
+ isValidPath(fullPath) {
162
+ // Skip very short single-segment paths that are too generic
163
+ if (!fullPath.includes('/') && fullPath.length < 3)
164
+ return false;
165
+ return true;
166
+ }
167
+ }
168
+ //# sourceMappingURL=directoryStructureExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directoryStructureExtractor.js","sourceRoot":"","sources":["../../../src/parsers/extractors/directoryStructureExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAK1F;;;;;;GAMG;AACH,MAAM,OAAO,2BAA4B,SAAQ,aAAa;IACpD,cAAc,CAAW;IAEjC,YAAY,SAAsC,EAAE;QAClD,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAE7B,iDAAiD;QACjD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,qBAAqB,CAAC,EAAE,oBAAoB,CAAC;QACnF,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,QAAkB;QACxB,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,0DAA0D;QAC1D,MAAM,iBAAiB,GAAe;YACpC,QAAQ,EAAE,4BAA4B;YACtC,gBAAgB,EAAE,oDAAoD;YACtE,QAAQ,EAAE,uBAAuB;SAClC,CAAC;QAEF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC;QAE1F,IAAI,UAAkC,CAAC;QACvC,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACvE,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAEnC,4CAA4C;YAC5C,MAAM,YAAY,GAChB,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC1B,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC1B,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC1B,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC5B,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE/B,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;gBAEpD,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;oBAC7B,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;oBACvE,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,KAAK,EAAE,QAAQ;wBACf,UAAU,EAAE,SAAS;wBACrB,GAAG,EAAE,QAAQ;wBACb,UAAU,EAAE,QAAQ,CAAC,IAAI;wBACzB,GAAG,CAAC,YAAY,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;qBAC9C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,YAAoB;QAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEvC,kDAAkD;QAClD,8CAA8C;QAC9C,MAAM,SAAS,GAA2C,EAAE,CAAC;QAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAE3B,8CAA8C;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAExC,+BAA+B;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,+BAA+B;YAC/B,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEzC,qDAAqD;YACrD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC9E,SAAS,CAAC,GAAG,EAAE,CAAC;YAClB,CAAC;YAED,qBAAqB;YACrB,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAEhC,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEhE,uDAAuD;YACvD,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAY;QACjC,+CAA+C;QAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAErB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClC,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxC,KAAK,IAAI,CAAC,CAAC;gBACX,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxE,KAAK,IAAI,CAAC,CAAC;gBACX,qDAAqD;gBACrD,CAAC,EAAE,CAAC;gBACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBAClF,CAAC,EAAE,CAAC;gBACN,CAAC;gBACD,MAAM;YACR,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,IAAY;QAC9B,8CAA8C;QAC9C,gEAAgE;QAChE,MAAM,OAAO,GAAG,IAAI;aACjB,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,gBAAgB;aACtD,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,gCAAgC;aACzD,IAAI,EAAE,CAAC;QAEV,4DAA4D;QAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAExD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAY;QAClC,4CAA4C;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,uBAAuB;QAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,2DAA2D;QAC3D,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,QAAgB;QAClC,4DAA4D;QAC5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjE,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}