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.
- package/LICENSE +21 -0
- package/README.md +305 -0
- package/dist/cache/cacheManager.d.ts +42 -0
- package/dist/cache/cacheManager.js +138 -0
- package/dist/cache/cacheManager.js.map +1 -0
- package/dist/cache/cacheManager.test.d.ts +1 -0
- package/dist/cache/cacheManager.test.js +142 -0
- package/dist/cache/cacheManager.test.js.map +1 -0
- package/dist/cli.d.ts +32 -0
- package/dist/cli.js +137 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +184 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.js +135 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/defineConfig.d.ts +28 -0
- package/dist/config/defineConfig.js +30 -0
- package/dist/config/defineConfig.js.map +1 -0
- package/dist/config/defineConfig.test.d.ts +1 -0
- package/dist/config/defineConfig.test.js +10 -0
- package/dist/config/defineConfig.test.js.map +1 -0
- package/dist/config/loader.d.ts +7 -0
- package/dist/config/loader.js +250 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.test.d.ts +1 -0
- package/dist/config/loader.test.js +276 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/git/changeTracker.d.ts +44 -0
- package/dist/git/changeTracker.js +149 -0
- package/dist/git/changeTracker.js.map +1 -0
- package/dist/git/changeTracker.test.d.ts +1 -0
- package/dist/git/changeTracker.test.js +184 -0
- package/dist/git/changeTracker.test.js.map +1 -0
- package/dist/graph/codeDocGraph.d.ts +43 -0
- package/dist/graph/codeDocGraph.js +103 -0
- package/dist/graph/codeDocGraph.js.map +1 -0
- package/dist/graph/codeDocGraph.test.d.ts +1 -0
- package/dist/graph/codeDocGraph.test.js +78 -0
- package/dist/graph/codeDocGraph.test.js.map +1 -0
- package/dist/graph/graphBuilder.d.ts +17 -0
- package/dist/graph/graphBuilder.js +76 -0
- package/dist/graph/graphBuilder.js.map +1 -0
- package/dist/graph/graphBuilder.test.d.ts +1 -0
- package/dist/graph/graphBuilder.test.js +87 -0
- package/dist/graph/graphBuilder.test.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/documentParser.d.ts +22 -0
- package/dist/parsers/documentParser.js +76 -0
- package/dist/parsers/documentParser.js.map +1 -0
- package/dist/parsers/documentParser.test.d.ts +1 -0
- package/dist/parsers/documentParser.test.js +116 -0
- package/dist/parsers/documentParser.test.js.map +1 -0
- package/dist/parsers/extractors/baseExtractor.d.ts +19 -0
- package/dist/parsers/extractors/baseExtractor.js +33 -0
- package/dist/parsers/extractors/baseExtractor.js.map +1 -0
- package/dist/parsers/extractors/baseExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/baseExtractor.test.js +43 -0
- package/dist/parsers/extractors/baseExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/codePatternExtractor.d.ts +13 -0
- package/dist/parsers/extractors/codePatternExtractor.js +108 -0
- package/dist/parsers/extractors/codePatternExtractor.js.map +1 -0
- package/dist/parsers/extractors/codePatternExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/codePatternExtractor.test.js +49 -0
- package/dist/parsers/extractors/codePatternExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/dependencyExtractor.d.ts +12 -0
- package/dist/parsers/extractors/dependencyExtractor.js +92 -0
- package/dist/parsers/extractors/dependencyExtractor.js.map +1 -0
- package/dist/parsers/extractors/dependencyExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/dependencyExtractor.test.js +48 -0
- package/dist/parsers/extractors/dependencyExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/directoryStructureExtractor.d.ts +34 -0
- package/dist/parsers/extractors/directoryStructureExtractor.js +168 -0
- package/dist/parsers/extractors/directoryStructureExtractor.js.map +1 -0
- package/dist/parsers/extractors/directoryStructureExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/directoryStructureExtractor.test.js +121 -0
- package/dist/parsers/extractors/directoryStructureExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/externalUrlExtractor.d.ts +14 -0
- package/dist/parsers/extractors/externalUrlExtractor.js +53 -0
- package/dist/parsers/extractors/externalUrlExtractor.js.map +1 -0
- package/dist/parsers/extractors/externalUrlExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/externalUrlExtractor.test.js +85 -0
- package/dist/parsers/extractors/externalUrlExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/filePathExtractor.d.ts +18 -0
- package/dist/parsers/extractors/filePathExtractor.js +72 -0
- package/dist/parsers/extractors/filePathExtractor.js.map +1 -0
- package/dist/parsers/extractors/filePathExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/filePathExtractor.test.js +73 -0
- package/dist/parsers/extractors/filePathExtractor.test.js.map +1 -0
- package/dist/parsers/extractors/versionExtractor.d.ts +11 -0
- package/dist/parsers/extractors/versionExtractor.js +74 -0
- package/dist/parsers/extractors/versionExtractor.js.map +1 -0
- package/dist/parsers/extractors/versionExtractor.test.d.ts +1 -0
- package/dist/parsers/extractors/versionExtractor.test.js +55 -0
- package/dist/parsers/extractors/versionExtractor.test.js.map +1 -0
- package/dist/plugins/plugin.d.ts +32 -0
- package/dist/plugins/plugin.js +40 -0
- package/dist/plugins/plugin.js.map +1 -0
- package/dist/plugins/plugin.test.d.ts +1 -0
- package/dist/plugins/plugin.test.js +23 -0
- package/dist/plugins/plugin.test.js.map +1 -0
- package/dist/reporters/consoleReporter.d.ts +15 -0
- package/dist/reporters/consoleReporter.js +73 -0
- package/dist/reporters/consoleReporter.js.map +1 -0
- package/dist/reporters/consoleReporter.test.d.ts +1 -0
- package/dist/reporters/consoleReporter.test.js +155 -0
- package/dist/reporters/consoleReporter.test.js.map +1 -0
- package/dist/reporters/enhancedReporter.d.ts +12 -0
- package/dist/reporters/enhancedReporter.js +81 -0
- package/dist/reporters/enhancedReporter.js.map +1 -0
- package/dist/reporters/enhancedReporter.test.d.ts +1 -0
- package/dist/reporters/enhancedReporter.test.js +152 -0
- package/dist/reporters/enhancedReporter.test.js.map +1 -0
- package/dist/reporters/jsonReporter.d.ts +11 -0
- package/dist/reporters/jsonReporter.js +20 -0
- package/dist/reporters/jsonReporter.js.map +1 -0
- package/dist/reporters/jsonReporter.test.d.ts +1 -0
- package/dist/reporters/jsonReporter.test.js +31 -0
- package/dist/reporters/jsonReporter.test.js.map +1 -0
- package/dist/reporters/markdownReporter.d.ts +11 -0
- package/dist/reporters/markdownReporter.js +55 -0
- package/dist/reporters/markdownReporter.js.map +1 -0
- package/dist/reporters/markdownReporter.test.d.ts +1 -0
- package/dist/reporters/markdownReporter.test.js +136 -0
- package/dist/reporters/markdownReporter.test.js.map +1 -0
- package/dist/runner.d.ts +9 -0
- package/dist/runner.js +265 -0
- package/dist/runner.js.map +1 -0
- package/dist/runner.test.d.ts +1 -0
- package/dist/runner.test.js +353 -0
- package/dist/runner.test.js.map +1 -0
- package/dist/scoring/freshnessScorer.d.ts +40 -0
- package/dist/scoring/freshnessScorer.js +170 -0
- package/dist/scoring/freshnessScorer.js.map +1 -0
- package/dist/scoring/freshnessScorer.test.d.ts +1 -0
- package/dist/scoring/freshnessScorer.test.js +397 -0
- package/dist/scoring/freshnessScorer.test.js.map +1 -0
- package/dist/semantic/vectorSearch.d.ts +84 -0
- package/dist/semantic/vectorSearch.js +484 -0
- package/dist/semantic/vectorSearch.js.map +1 -0
- package/dist/semantic/vectorSearch.test.d.ts +1 -0
- package/dist/semantic/vectorSearch.test.js +660 -0
- package/dist/semantic/vectorSearch.test.js.map +1 -0
- package/dist/setupTests.d.ts +4 -0
- package/dist/setupTests.js +11 -0
- package/dist/setupTests.js.map +1 -0
- package/dist/test-utils/console.d.ts +2 -0
- package/dist/test-utils/console.js +3 -0
- package/dist/test-utils/console.js.map +1 -0
- package/dist/test-utils/factories.d.ts +3 -0
- package/dist/test-utils/factories.js +25 -0
- package/dist/test-utils/factories.js.map +1 -0
- package/dist/test-utils/tempFiles.d.ts +1 -0
- package/dist/test-utils/tempFiles.js +12 -0
- package/dist/test-utils/tempFiles.js.map +1 -0
- package/dist/types.d.ts +304 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/boundedMap.d.ts +8 -0
- package/dist/utils/boundedMap.js +22 -0
- package/dist/utils/boundedMap.js.map +1 -0
- package/dist/utils/boundedMap.test.d.ts +1 -0
- package/dist/utils/boundedMap.test.js +57 -0
- package/dist/utils/boundedMap.test.js.map +1 -0
- package/dist/utils/illustrativePatterns.d.ts +28 -0
- package/dist/utils/illustrativePatterns.js +80 -0
- package/dist/utils/illustrativePatterns.js.map +1 -0
- package/dist/utils/illustrativePatterns.test.d.ts +1 -0
- package/dist/utils/illustrativePatterns.test.js +48 -0
- package/dist/utils/illustrativePatterns.test.js.map +1 -0
- package/dist/utils/incremental.d.ts +36 -0
- package/dist/utils/incremental.js +87 -0
- package/dist/utils/incremental.js.map +1 -0
- package/dist/utils/incremental.test.d.ts +1 -0
- package/dist/utils/incremental.test.js +84 -0
- package/dist/utils/incremental.test.js.map +1 -0
- package/dist/utils/parallel.d.ts +14 -0
- package/dist/utils/parallel.js +43 -0
- package/dist/utils/parallel.js.map +1 -0
- package/dist/utils/parallel.test.d.ts +1 -0
- package/dist/utils/parallel.test.js +48 -0
- package/dist/utils/parallel.test.js.map +1 -0
- package/dist/utils/pathSecurity.d.ts +12 -0
- package/dist/utils/pathSecurity.js +22 -0
- package/dist/utils/pathSecurity.js.map +1 -0
- package/dist/utils/pathSecurity.test.d.ts +1 -0
- package/dist/utils/pathSecurity.test.js +34 -0
- package/dist/utils/pathSecurity.test.js.map +1 -0
- package/dist/utils/similarity.d.ts +12 -0
- package/dist/utils/similarity.js +64 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/similarity.test.d.ts +1 -0
- package/dist/utils/similarity.test.js +49 -0
- package/dist/utils/similarity.test.js.map +1 -0
- package/dist/utils/validation.d.ts +13 -0
- package/dist/utils/validation.js +24 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/validation.test.d.ts +1 -0
- package/dist/utils/validation.test.js +28 -0
- package/dist/utils/validation.test.js.map +1 -0
- package/dist/validators/codePatternValidator.d.ts +28 -0
- package/dist/validators/codePatternValidator.js +200 -0
- package/dist/validators/codePatternValidator.js.map +1 -0
- package/dist/validators/codePatternValidator.test.d.ts +1 -0
- package/dist/validators/codePatternValidator.test.js +86 -0
- package/dist/validators/codePatternValidator.test.js.map +1 -0
- package/dist/validators/dependencyValidator.d.ts +12 -0
- package/dist/validators/dependencyValidator.js +102 -0
- package/dist/validators/dependencyValidator.js.map +1 -0
- package/dist/validators/dependencyValidator.test.d.ts +1 -0
- package/dist/validators/dependencyValidator.test.js +179 -0
- package/dist/validators/dependencyValidator.test.js.map +1 -0
- package/dist/validators/directoryValidator.d.ts +30 -0
- package/dist/validators/directoryValidator.js +192 -0
- package/dist/validators/directoryValidator.js.map +1 -0
- package/dist/validators/directoryValidator.test.d.ts +1 -0
- package/dist/validators/directoryValidator.test.js +193 -0
- package/dist/validators/directoryValidator.test.js.map +1 -0
- package/dist/validators/fileValidator.d.ts +16 -0
- package/dist/validators/fileValidator.js +114 -0
- package/dist/validators/fileValidator.js.map +1 -0
- package/dist/validators/fileValidator.test.d.ts +1 -0
- package/dist/validators/fileValidator.test.js +108 -0
- package/dist/validators/fileValidator.test.js.map +1 -0
- package/dist/validators/urlValidator.d.ts +25 -0
- package/dist/validators/urlValidator.js +320 -0
- package/dist/validators/urlValidator.js.map +1 -0
- package/dist/validators/urlValidator.test.d.ts +1 -0
- package/dist/validators/urlValidator.test.js +252 -0
- package/dist/validators/urlValidator.test.js.map +1 -0
- package/dist/validators/validationEngine.d.ts +23 -0
- package/dist/validators/validationEngine.js +117 -0
- package/dist/validators/validationEngine.js.map +1 -0
- package/dist/validators/validationEngine.test.d.ts +1 -0
- package/dist/validators/validationEngine.test.js +82 -0
- package/dist/validators/validationEngine.test.js.map +1 -0
- package/dist/validators/versionValidator.d.ts +18 -0
- package/dist/validators/versionValidator.js +211 -0
- package/dist/validators/versionValidator.js.map +1 -0
- package/dist/validators/versionValidator.test.d.ts +1 -0
- package/dist/validators/versionValidator.test.js +308 -0
- package/dist/validators/versionValidator.test.js.map +1 -0
- 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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|