lostconf 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +83 -0
- package/LICENSE +21 -0
- package/LICENSE.md +21 -0
- package/README.md +445 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +139 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/discovery.d.ts +23 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +75 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/engine.d.ts +24 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +86 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/severity.d.ts +25 -0
- package/dist/core/severity.d.ts.map +1 -0
- package/dist/core/severity.js +225 -0
- package/dist/core/severity.js.map +1 -0
- package/dist/core/types.d.ts +77 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +21 -0
- package/dist/core/types.js.map +1 -0
- package/dist/filetree/scanner.d.ts +26 -0
- package/dist/filetree/scanner.d.ts.map +1 -0
- package/dist/filetree/scanner.js +71 -0
- package/dist/filetree/scanner.js.map +1 -0
- package/dist/filetree/tree.d.ts +5 -0
- package/dist/filetree/tree.d.ts.map +1 -0
- package/dist/filetree/tree.js +5 -0
- package/dist/filetree/tree.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/output/formatter.d.ts +12 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +5 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/json.d.ts +9 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +14 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/sarif.d.ts +9 -0
- package/dist/output/sarif.d.ts.map +1 -0
- package/dist/output/sarif.js +84 -0
- package/dist/output/sarif.js.map +1 -0
- package/dist/output/text.d.ts +9 -0
- package/dist/output/text.d.ts.map +1 -0
- package/dist/output/text.js +87 -0
- package/dist/output/text.js.map +1 -0
- package/dist/parsers/bandit.d.ts +8 -0
- package/dist/parsers/bandit.d.ts.map +1 -0
- package/dist/parsers/bandit.js +66 -0
- package/dist/parsers/bandit.js.map +1 -0
- package/dist/parsers/biome.d.ts +8 -0
- package/dist/parsers/biome.d.ts.map +1 -0
- package/dist/parsers/biome.js +74 -0
- package/dist/parsers/biome.js.map +1 -0
- package/dist/parsers/clang.d.ts +9 -0
- package/dist/parsers/clang.d.ts.map +1 -0
- package/dist/parsers/clang.js +99 -0
- package/dist/parsers/clang.js.map +1 -0
- package/dist/parsers/deno.d.ts +8 -0
- package/dist/parsers/deno.d.ts.map +1 -0
- package/dist/parsers/deno.js +73 -0
- package/dist/parsers/deno.js.map +1 -0
- package/dist/parsers/dotnet.d.ts +9 -0
- package/dist/parsers/dotnet.d.ts.map +1 -0
- package/dist/parsers/dotnet.js +89 -0
- package/dist/parsers/dotnet.js.map +1 -0
- package/dist/parsers/elixir.d.ts +7 -0
- package/dist/parsers/elixir.d.ts.map +1 -0
- package/dist/parsers/elixir.js +59 -0
- package/dist/parsers/elixir.js.map +1 -0
- package/dist/parsers/eslint.d.ts +7 -0
- package/dist/parsers/eslint.d.ts.map +1 -0
- package/dist/parsers/eslint.js +43 -0
- package/dist/parsers/eslint.js.map +1 -0
- package/dist/parsers/flake8.d.ts +10 -0
- package/dist/parsers/flake8.d.ts.map +1 -0
- package/dist/parsers/flake8.js +89 -0
- package/dist/parsers/flake8.js.map +1 -0
- package/dist/parsers/gitignore.d.ts +11 -0
- package/dist/parsers/gitignore.d.ts.map +1 -0
- package/dist/parsers/gitignore.js +72 -0
- package/dist/parsers/gitignore.js.map +1 -0
- package/dist/parsers/gitleaks.d.ts +8 -0
- package/dist/parsers/gitleaks.d.ts.map +1 -0
- package/dist/parsers/gitleaks.js +127 -0
- package/dist/parsers/gitleaks.js.map +1 -0
- package/dist/parsers/golangci.d.ts +7 -0
- package/dist/parsers/golangci.d.ts.map +1 -0
- package/dist/parsers/golangci.js +73 -0
- package/dist/parsers/golangci.js.map +1 -0
- package/dist/parsers/hadolint.d.ts +8 -0
- package/dist/parsers/hadolint.d.ts.map +1 -0
- package/dist/parsers/hadolint.js +95 -0
- package/dist/parsers/hadolint.js.map +1 -0
- package/dist/parsers/index.d.ts +38 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +154 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/java.d.ts +11 -0
- package/dist/parsers/java.d.ts.map +1 -0
- package/dist/parsers/java.js +75 -0
- package/dist/parsers/java.js.map +1 -0
- package/dist/parsers/jest.d.ts +7 -0
- package/dist/parsers/jest.d.ts.map +1 -0
- package/dist/parsers/jest.js +118 -0
- package/dist/parsers/jest.js.map +1 -0
- package/dist/parsers/kotlin.d.ts +7 -0
- package/dist/parsers/kotlin.d.ts.map +1 -0
- package/dist/parsers/kotlin.js +90 -0
- package/dist/parsers/kotlin.js.map +1 -0
- package/dist/parsers/markdown.d.ts +7 -0
- package/dist/parsers/markdown.d.ts.map +1 -0
- package/dist/parsers/markdown.js +40 -0
- package/dist/parsers/markdown.js.map +1 -0
- package/dist/parsers/php.d.ts +9 -0
- package/dist/parsers/php.d.ts.map +1 -0
- package/dist/parsers/php.js +92 -0
- package/dist/parsers/php.js.map +1 -0
- package/dist/parsers/prettier.d.ts +7 -0
- package/dist/parsers/prettier.d.ts.map +1 -0
- package/dist/parsers/prettier.js +43 -0
- package/dist/parsers/prettier.js.map +1 -0
- package/dist/parsers/pylint.d.ts +8 -0
- package/dist/parsers/pylint.d.ts.map +1 -0
- package/dist/parsers/pylint.js +92 -0
- package/dist/parsers/pylint.js.map +1 -0
- package/dist/parsers/pyproject.d.ts +7 -0
- package/dist/parsers/pyproject.d.ts.map +1 -0
- package/dist/parsers/pyproject.js +127 -0
- package/dist/parsers/pyproject.js.map +1 -0
- package/dist/parsers/pyright.d.ts +8 -0
- package/dist/parsers/pyright.d.ts.map +1 -0
- package/dist/parsers/pyright.js +63 -0
- package/dist/parsers/pyright.js.map +1 -0
- package/dist/parsers/rubocop.d.ts +7 -0
- package/dist/parsers/rubocop.d.ts.map +1 -0
- package/dist/parsers/rubocop.js +102 -0
- package/dist/parsers/rubocop.js.map +1 -0
- package/dist/parsers/rust.d.ts +9 -0
- package/dist/parsers/rust.d.ts.map +1 -0
- package/dist/parsers/rust.js +68 -0
- package/dist/parsers/rust.js.map +1 -0
- package/dist/parsers/scala.d.ts +9 -0
- package/dist/parsers/scala.d.ts.map +1 -0
- package/dist/parsers/scala.js +72 -0
- package/dist/parsers/scala.js.map +1 -0
- package/dist/parsers/semgrep.d.ts +10 -0
- package/dist/parsers/semgrep.d.ts.map +1 -0
- package/dist/parsers/semgrep.js +111 -0
- package/dist/parsers/semgrep.js.map +1 -0
- package/dist/parsers/shellcheck.d.ts +8 -0
- package/dist/parsers/shellcheck.d.ts.map +1 -0
- package/dist/parsers/shellcheck.js +49 -0
- package/dist/parsers/shellcheck.js.map +1 -0
- package/dist/parsers/stylelint.d.ts +9 -0
- package/dist/parsers/stylelint.d.ts.map +1 -0
- package/dist/parsers/stylelint.js +95 -0
- package/dist/parsers/stylelint.js.map +1 -0
- package/dist/parsers/swift.d.ts +7 -0
- package/dist/parsers/swift.d.ts.map +1 -0
- package/dist/parsers/swift.js +64 -0
- package/dist/parsers/swift.js.map +1 -0
- package/dist/parsers/tflint.d.ts +8 -0
- package/dist/parsers/tflint.d.ts.map +1 -0
- package/dist/parsers/tflint.js +59 -0
- package/dist/parsers/tflint.js.map +1 -0
- package/dist/parsers/typescript.d.ts +7 -0
- package/dist/parsers/typescript.d.ts.map +1 -0
- package/dist/parsers/typescript.js +138 -0
- package/dist/parsers/typescript.js.map +1 -0
- package/dist/parsers/yamllint.d.ts +8 -0
- package/dist/parsers/yamllint.d.ts.map +1 -0
- package/dist/parsers/yamllint.js +93 -0
- package/dist/parsers/yamllint.js.map +1 -0
- package/dist/plugin/registry.d.ts +20 -0
- package/dist/plugin/registry.d.ts.map +1 -0
- package/dist/plugin/registry.js +52 -0
- package/dist/plugin/registry.js.map +1 -0
- package/dist/plugin/types.d.ts +16 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/types.js +5 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/validator/glob.d.ts +16 -0
- package/dist/validator/glob.d.ts.map +1 -0
- package/dist/validator/glob.js +44 -0
- package/dist/validator/glob.js.map +1 -0
- package/dist/validator/regex.d.ts +10 -0
- package/dist/validator/regex.d.ts.map +1 -0
- package/dist/validator/regex.js +45 -0
- package/dist/validator/regex.js.map +1 -0
- package/dist/validator/validator.d.ts +17 -0
- package/dist/validator/validator.d.ts.map +1 -0
- package/dist/validator/validator.js +85 -0
- package/dist/validator/validator.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/parsers/typescript.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAyJjD,sBAAsB;AACtB,eAAO,MAAM,cAAc,EAAE,MAU5B,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for TypeScript configuration (tsconfig.json)
|
|
3
|
+
*/
|
|
4
|
+
import { PatternType } from '../core/types.js';
|
|
5
|
+
import { isGlobPattern } from '../validator/glob.js';
|
|
6
|
+
/** Common exclude patterns that are typically proactive (don't need validation) */
|
|
7
|
+
const COMMON_EXCLUDES = new Set([
|
|
8
|
+
'node_modules',
|
|
9
|
+
'dist',
|
|
10
|
+
'build',
|
|
11
|
+
'out',
|
|
12
|
+
'coverage',
|
|
13
|
+
'.git',
|
|
14
|
+
'.next',
|
|
15
|
+
'.nuxt',
|
|
16
|
+
'.output',
|
|
17
|
+
'bower_components'
|
|
18
|
+
]);
|
|
19
|
+
/** Parse tsconfig.json and extract patterns */
|
|
20
|
+
function parseTsConfig(_filename, content) {
|
|
21
|
+
const patterns = [];
|
|
22
|
+
let config;
|
|
23
|
+
try {
|
|
24
|
+
config = JSON.parse(content);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return patterns;
|
|
28
|
+
}
|
|
29
|
+
if (!config || typeof config !== 'object') {
|
|
30
|
+
return patterns;
|
|
31
|
+
}
|
|
32
|
+
const lineMap = buildLineMap(content);
|
|
33
|
+
// Extract include patterns
|
|
34
|
+
if (Array.isArray(config.include)) {
|
|
35
|
+
for (const value of config.include) {
|
|
36
|
+
if (typeof value !== 'string')
|
|
37
|
+
continue;
|
|
38
|
+
const lineInfo = lineMap.get(value);
|
|
39
|
+
const type = isGlobPattern(value) ? PatternType.GLOB : PatternType.PATH;
|
|
40
|
+
patterns.push({
|
|
41
|
+
value,
|
|
42
|
+
type,
|
|
43
|
+
line: lineInfo?.line ?? 1,
|
|
44
|
+
column: lineInfo?.column
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Extract exclude patterns (skip common proactive excludes)
|
|
49
|
+
if (Array.isArray(config.exclude)) {
|
|
50
|
+
for (const value of config.exclude) {
|
|
51
|
+
if (typeof value !== 'string')
|
|
52
|
+
continue;
|
|
53
|
+
// Skip common proactive excludes
|
|
54
|
+
if (COMMON_EXCLUDES.has(value))
|
|
55
|
+
continue;
|
|
56
|
+
const lineInfo = lineMap.get(value);
|
|
57
|
+
const type = isGlobPattern(value) ? PatternType.GLOB : PatternType.PATH;
|
|
58
|
+
patterns.push({
|
|
59
|
+
value,
|
|
60
|
+
type,
|
|
61
|
+
line: lineInfo?.line ?? 1,
|
|
62
|
+
column: lineInfo?.column
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Extract files
|
|
67
|
+
if (Array.isArray(config.files)) {
|
|
68
|
+
for (const value of config.files) {
|
|
69
|
+
if (typeof value !== 'string')
|
|
70
|
+
continue;
|
|
71
|
+
const lineInfo = lineMap.get(value);
|
|
72
|
+
patterns.push({
|
|
73
|
+
value,
|
|
74
|
+
type: PatternType.PATH,
|
|
75
|
+
line: lineInfo?.line ?? 1,
|
|
76
|
+
column: lineInfo?.column
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Extract typeRoots
|
|
81
|
+
if (config.compilerOptions?.typeRoots) {
|
|
82
|
+
for (const value of config.compilerOptions.typeRoots) {
|
|
83
|
+
if (typeof value !== 'string')
|
|
84
|
+
continue;
|
|
85
|
+
const lineInfo = lineMap.get(value);
|
|
86
|
+
patterns.push({
|
|
87
|
+
value,
|
|
88
|
+
type: PatternType.PATH,
|
|
89
|
+
line: lineInfo?.line ?? 1,
|
|
90
|
+
column: lineInfo?.column
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Extract references
|
|
95
|
+
if (Array.isArray(config.references)) {
|
|
96
|
+
for (const ref of config.references) {
|
|
97
|
+
if (typeof ref?.path === 'string') {
|
|
98
|
+
const lineInfo = lineMap.get(ref.path);
|
|
99
|
+
patterns.push({
|
|
100
|
+
value: ref.path,
|
|
101
|
+
type: PatternType.PATH,
|
|
102
|
+
line: lineInfo?.line ?? 1,
|
|
103
|
+
column: lineInfo?.column
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return patterns;
|
|
109
|
+
}
|
|
110
|
+
function buildLineMap(content) {
|
|
111
|
+
const map = new Map();
|
|
112
|
+
const lines = content.split('\n');
|
|
113
|
+
for (let i = 0; i < lines.length; i++) {
|
|
114
|
+
const line = lines[i];
|
|
115
|
+
const lineNum = i + 1;
|
|
116
|
+
const stringMatches = line.matchAll(/"([^"]+)"/g);
|
|
117
|
+
for (const match of stringMatches) {
|
|
118
|
+
const value = match[1];
|
|
119
|
+
if (value && !map.has(value)) {
|
|
120
|
+
map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return map;
|
|
125
|
+
}
|
|
126
|
+
/** TSConfig parser */
|
|
127
|
+
export const tsconfigParser = {
|
|
128
|
+
name: 'tsconfig',
|
|
129
|
+
filePatterns: [
|
|
130
|
+
'tsconfig.json',
|
|
131
|
+
'tsconfig.*.json',
|
|
132
|
+
'jsconfig.json',
|
|
133
|
+
'**/tsconfig.json',
|
|
134
|
+
'**/jsconfig.json'
|
|
135
|
+
],
|
|
136
|
+
parse: parseTsConfig
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/parsers/typescript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for yamllint configuration files
|
|
3
|
+
* yamllint is a linter for YAML files
|
|
4
|
+
*/
|
|
5
|
+
import type { Parser } from '../plugin/types.js';
|
|
6
|
+
/** yamllint .yamllint file parser */
|
|
7
|
+
export declare const yamllintParser: Parser;
|
|
8
|
+
//# sourceMappingURL=yamllint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yamllint.d.ts","sourceRoot":"","sources":["../../src/parsers/yamllint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA8FjD,qCAAqC;AACrC,eAAO,MAAM,cAAc,EAAE,MAW5B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for yamllint configuration files
|
|
3
|
+
* yamllint is a linter for YAML files
|
|
4
|
+
*/
|
|
5
|
+
import { parse as parseYaml } from 'yaml';
|
|
6
|
+
import { PatternType } from '../core/types.js';
|
|
7
|
+
import { isGlobPattern } from '../validator/glob.js';
|
|
8
|
+
/** Parse .yamllint or .yamllint.yml file */
|
|
9
|
+
function parseYamllint(_filename, content) {
|
|
10
|
+
const patterns = [];
|
|
11
|
+
let config;
|
|
12
|
+
try {
|
|
13
|
+
config = parseYaml(content);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return patterns;
|
|
17
|
+
}
|
|
18
|
+
// Build line map for accurate line numbers
|
|
19
|
+
const lineMap = buildLineMap(content);
|
|
20
|
+
// Handle ignore field (can be string or array)
|
|
21
|
+
const ignoreValues = [];
|
|
22
|
+
if (typeof config.ignore === 'string') {
|
|
23
|
+
ignoreValues.push(config.ignore);
|
|
24
|
+
}
|
|
25
|
+
else if (Array.isArray(config.ignore)) {
|
|
26
|
+
ignoreValues.push(...config.ignore);
|
|
27
|
+
}
|
|
28
|
+
for (const pattern of ignoreValues) {
|
|
29
|
+
if (typeof pattern !== 'string')
|
|
30
|
+
continue;
|
|
31
|
+
const lineInfo = lineMap.get(pattern);
|
|
32
|
+
const line = lineInfo?.line ?? 1;
|
|
33
|
+
const column = lineInfo?.column;
|
|
34
|
+
const type = isGlobPattern(pattern) ? PatternType.GLOB : PatternType.PATH;
|
|
35
|
+
patterns.push({
|
|
36
|
+
value: pattern,
|
|
37
|
+
type,
|
|
38
|
+
line,
|
|
39
|
+
column
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Handle ignore-from-file field
|
|
43
|
+
if (config['ignore-from-file'] && typeof config['ignore-from-file'] === 'string') {
|
|
44
|
+
const lineInfo = lineMap.get(config['ignore-from-file']);
|
|
45
|
+
patterns.push({
|
|
46
|
+
value: config['ignore-from-file'],
|
|
47
|
+
type: PatternType.PATH,
|
|
48
|
+
line: lineInfo?.line ?? 1,
|
|
49
|
+
column: lineInfo?.column
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return patterns;
|
|
53
|
+
}
|
|
54
|
+
/** Build a map of string values to their line numbers */
|
|
55
|
+
function buildLineMap(content) {
|
|
56
|
+
const map = new Map();
|
|
57
|
+
const lines = content.split('\n');
|
|
58
|
+
for (let i = 0; i < lines.length; i++) {
|
|
59
|
+
const line = lines[i];
|
|
60
|
+
const lineNum = i + 1;
|
|
61
|
+
// Match quoted or unquoted values in YAML
|
|
62
|
+
const quotedMatches = line.matchAll(/["']([^"']+)["']/g);
|
|
63
|
+
for (const match of quotedMatches) {
|
|
64
|
+
const value = match[1];
|
|
65
|
+
if (value && !map.has(value)) {
|
|
66
|
+
map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Match unquoted values after colon
|
|
70
|
+
const unquotedMatch = line.match(/:\s*([^\s#]+)/);
|
|
71
|
+
if (unquotedMatch && unquotedMatch[1]) {
|
|
72
|
+
const value = unquotedMatch[1].trim();
|
|
73
|
+
if (value && !map.has(value)) {
|
|
74
|
+
map.set(value, { line: lineNum, column: (unquotedMatch.index ?? 0) + 1 });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return map;
|
|
79
|
+
}
|
|
80
|
+
/** yamllint .yamllint file parser */
|
|
81
|
+
export const yamllintParser = {
|
|
82
|
+
name: 'yamllint',
|
|
83
|
+
filePatterns: [
|
|
84
|
+
'.yamllint',
|
|
85
|
+
'.yamllint.yml',
|
|
86
|
+
'.yamllint.yaml',
|
|
87
|
+
'**/.yamllint',
|
|
88
|
+
'**/.yamllint.yml',
|
|
89
|
+
'**/.yamllint.yaml'
|
|
90
|
+
],
|
|
91
|
+
parse: parseYamllint
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=yamllint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yamllint.js","sourceRoot":"","sources":["../../src/parsers/yamllint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin registry for managing parsers
|
|
3
|
+
*/
|
|
4
|
+
import type { Parser } from './types.js';
|
|
5
|
+
export declare class PluginRegistry {
|
|
6
|
+
private parsers;
|
|
7
|
+
/** Register a parser */
|
|
8
|
+
register(parser: Parser): void;
|
|
9
|
+
/** Get all registered parsers */
|
|
10
|
+
getParsers(): Parser[];
|
|
11
|
+
/** Get a parser by name */
|
|
12
|
+
getParser(name: string): Parser | undefined;
|
|
13
|
+
/** Get parsers that can handle a given filename */
|
|
14
|
+
getParsersForFile(filename: string, allFiles: string[]): Parser[];
|
|
15
|
+
/** Check if a filename matches a pattern */
|
|
16
|
+
private matchesPattern;
|
|
17
|
+
}
|
|
18
|
+
/** Global registry instance */
|
|
19
|
+
export declare const registry: PluginRegistry;
|
|
20
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA6B;IAE5C,wBAAwB;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO9B,iCAAiC;IACjC,UAAU,IAAI,MAAM,EAAE;IAItB,2BAA2B;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,mDAAmD;IACnD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAejE,4CAA4C;IAC5C,OAAO,CAAC,cAAc;CAYvB;AAED,+BAA+B;AAC/B,eAAO,MAAM,QAAQ,gBAAuB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin registry for managing parsers
|
|
3
|
+
*/
|
|
4
|
+
export class PluginRegistry {
|
|
5
|
+
parsers = new Map();
|
|
6
|
+
/** Register a parser */
|
|
7
|
+
register(parser) {
|
|
8
|
+
if (this.parsers.has(parser.name)) {
|
|
9
|
+
throw new Error(`Parser "${parser.name}" is already registered`);
|
|
10
|
+
}
|
|
11
|
+
this.parsers.set(parser.name, parser);
|
|
12
|
+
}
|
|
13
|
+
/** Get all registered parsers */
|
|
14
|
+
getParsers() {
|
|
15
|
+
return Array.from(this.parsers.values());
|
|
16
|
+
}
|
|
17
|
+
/** Get a parser by name */
|
|
18
|
+
getParser(name) {
|
|
19
|
+
return this.parsers.get(name);
|
|
20
|
+
}
|
|
21
|
+
/** Get parsers that can handle a given filename */
|
|
22
|
+
getParsersForFile(filename, allFiles) {
|
|
23
|
+
const result = [];
|
|
24
|
+
for (const parser of this.parsers.values()) {
|
|
25
|
+
for (const pattern of parser.filePatterns) {
|
|
26
|
+
// Simple pattern matching for now
|
|
27
|
+
// Check if filename matches the pattern
|
|
28
|
+
if (this.matchesPattern(filename, pattern, allFiles)) {
|
|
29
|
+
result.push(parser);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
/** Check if a filename matches a pattern */
|
|
37
|
+
matchesPattern(filename, pattern, _allFiles) {
|
|
38
|
+
// Handle exact match
|
|
39
|
+
if (filename === pattern || filename.endsWith('/' + pattern)) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
// Handle **/pattern for any directory
|
|
43
|
+
if (pattern.startsWith('**/')) {
|
|
44
|
+
const suffix = pattern.slice(3);
|
|
45
|
+
return filename === suffix || filename.endsWith('/' + suffix);
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Global registry instance */
|
|
51
|
+
export const registry = new PluginRegistry();
|
|
52
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,wBAAwB;IACxB,QAAQ,CAAC,MAAc;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,iCAAiC;IACjC,UAAU;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,mDAAmD;IACnD,iBAAiB,CAAC,QAAgB,EAAE,QAAkB;QACpD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC1C,kCAAkC;gBAClC,wCAAwC;gBACxC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,4CAA4C;IACpC,cAAc,CAAC,QAAgB,EAAE,OAAe,EAAE,SAAmB;QAC3E,qBAAqB;QACrB,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,sCAAsC;QACtC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,+BAA+B;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin interface definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { Pattern } from '../core/types.js';
|
|
5
|
+
/** Parser plugin interface */
|
|
6
|
+
export interface Parser {
|
|
7
|
+
/** Unique name for this parser */
|
|
8
|
+
name: string;
|
|
9
|
+
/** Glob patterns to match config files */
|
|
10
|
+
filePatterns: string[];
|
|
11
|
+
/** Parse a config file and extract patterns */
|
|
12
|
+
parse(filename: string, content: string): Pattern[];
|
|
13
|
+
}
|
|
14
|
+
/** Parser constructor type */
|
|
15
|
+
export type ParserFactory = () => Parser;
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugin/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,8BAA8B;AAC9B,MAAM,WAAW,MAAM;IACrB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,+CAA+C;IAC/C,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;CACrD;AAED,8BAA8B;AAC9B,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugin/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glob matching utilities using micromatch
|
|
3
|
+
*/
|
|
4
|
+
export interface GlobMatchOptions {
|
|
5
|
+
/** Base directory for relative patterns */
|
|
6
|
+
basePath?: string;
|
|
7
|
+
/** Enable dot file matching */
|
|
8
|
+
dot?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Check if any files match a glob pattern */
|
|
11
|
+
export declare function globMatches(pattern: string, files: string[], options?: GlobMatchOptions): string[];
|
|
12
|
+
/** Check if a pattern is a valid glob */
|
|
13
|
+
export declare function isValidGlob(pattern: string): boolean;
|
|
14
|
+
/** Check if a pattern contains glob special characters */
|
|
15
|
+
export declare function isGlobPattern(pattern: string): boolean;
|
|
16
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/validator/glob.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,8CAA8C;AAC9C,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,gBAAqB,GAC7B,MAAM,EAAE,CAyBV;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQpD;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glob matching utilities using micromatch
|
|
3
|
+
*/
|
|
4
|
+
import micromatch from 'micromatch';
|
|
5
|
+
/** Check if any files match a glob pattern */
|
|
6
|
+
export function globMatches(pattern, files, options = {}) {
|
|
7
|
+
const { dot = true } = options;
|
|
8
|
+
// Normalize pattern
|
|
9
|
+
let normalizedPattern = pattern.replace(/\\/g, '/');
|
|
10
|
+
// Remove leading ./ if present
|
|
11
|
+
if (normalizedPattern.startsWith('./')) {
|
|
12
|
+
normalizedPattern = normalizedPattern.slice(2);
|
|
13
|
+
}
|
|
14
|
+
// Handle negated patterns (we check these as positive for matching)
|
|
15
|
+
if (normalizedPattern.startsWith('!')) {
|
|
16
|
+
normalizedPattern = normalizedPattern.slice(1);
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
return micromatch(files, normalizedPattern, {
|
|
20
|
+
dot,
|
|
21
|
+
matchBase: !normalizedPattern.includes('/')
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Invalid pattern
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Check if a pattern is a valid glob */
|
|
30
|
+
export function isValidGlob(pattern) {
|
|
31
|
+
try {
|
|
32
|
+
// Try to compile the pattern
|
|
33
|
+
micromatch.makeRe(pattern);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Check if a pattern contains glob special characters */
|
|
41
|
+
export function isGlobPattern(pattern) {
|
|
42
|
+
return /[*?[\]{}!]/.test(pattern);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/validator/glob.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AASpC,8CAA8C;AAC9C,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,KAAe,EACf,UAA4B,EAAE;IAE9B,MAAM,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE/B,oBAAoB;IACpB,IAAI,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpD,+BAA+B;IAC/B,IAAI,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,oEAAoE;IACpE,IAAI,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE;YAC1C,GAAG;YACH,SAAS,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,IAAI,CAAC;QACH,6BAA6B;QAC7B,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regex matching utilities
|
|
3
|
+
*/
|
|
4
|
+
/** Check if any files match a regex pattern */
|
|
5
|
+
export declare function regexMatches(pattern: string, files: string[]): string[];
|
|
6
|
+
/** Check if a pattern is a valid regex */
|
|
7
|
+
export declare function isValidRegex(pattern: string): boolean;
|
|
8
|
+
/** Check if a string looks like a regex (contains regex special chars but not glob chars) */
|
|
9
|
+
export declare function looksLikeRegex(pattern: string): boolean;
|
|
10
|
+
//# sourceMappingURL=regex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../src/validator/regex.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQvE;AAED,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBvD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regex matching utilities
|
|
3
|
+
*/
|
|
4
|
+
/** Check if any files match a regex pattern */
|
|
5
|
+
export function regexMatches(pattern, files) {
|
|
6
|
+
try {
|
|
7
|
+
const regex = new RegExp(pattern);
|
|
8
|
+
return files.filter((file) => regex.test(file));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
// Invalid regex
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Check if a pattern is a valid regex */
|
|
16
|
+
export function isValidRegex(pattern) {
|
|
17
|
+
try {
|
|
18
|
+
new RegExp(pattern);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Check if a string looks like a regex (contains regex special chars but not glob chars) */
|
|
26
|
+
export function looksLikeRegex(pattern) {
|
|
27
|
+
// Contains regex-specific patterns like \d, \w, \s, etc.
|
|
28
|
+
if (/\\[dwsDWS]/.test(pattern)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Contains anchors
|
|
32
|
+
if (/^\^|\$$/.test(pattern)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Contains quantifiers like +, {n,m}
|
|
36
|
+
if (/[+]|\{\d+,?\d*\}/.test(pattern)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
// Contains lookahead/lookbehind
|
|
40
|
+
if (/\(\?[=!<]/.test(pattern)) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=regex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.js","sourceRoot":"","sources":["../../src/validator/regex.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+CAA+C;AAC/C,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAe;IAC3D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,yDAAyD;IACzD,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,mBAAmB;IACnB,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,qCAAqC;IACrC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,gCAAgC;IAChC,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern validation engine
|
|
3
|
+
*/
|
|
4
|
+
import type { Pattern, Finding, StaleReason } from '../core/types.js';
|
|
5
|
+
import type { FileTree } from '../filetree/tree.js';
|
|
6
|
+
export interface ValidatorOptions {
|
|
7
|
+
/** Base path for relative patterns in the config file */
|
|
8
|
+
configBasePath?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Validate a pattern against the file tree */
|
|
11
|
+
export declare function validatePattern(pattern: Pattern, tree: FileTree, options?: ValidatorOptions): {
|
|
12
|
+
valid: boolean;
|
|
13
|
+
reason?: StaleReason;
|
|
14
|
+
};
|
|
15
|
+
/** Validate all patterns from a config file */
|
|
16
|
+
export declare function validatePatterns(configFile: string, patterns: Pattern[], parserName: string, tree: FileTree): Finding[];
|
|
17
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/validator/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,+CAA+C;AAC/C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,QAAQ,EACd,OAAO,GAAE,gBAAqB,GAC7B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CA4B1C;AA6CD,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,GACb,OAAO,EAAE,CAwBX"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern validation engine
|
|
3
|
+
*/
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { PatternType } from '../core/types.js';
|
|
6
|
+
import { pathExists } from '../filetree/tree.js';
|
|
7
|
+
import { globMatches, isValidGlob } from './glob.js';
|
|
8
|
+
import { regexMatches, isValidRegex } from './regex.js';
|
|
9
|
+
import { classifySeverity } from '../core/severity.js';
|
|
10
|
+
/** Validate a pattern against the file tree */
|
|
11
|
+
export function validatePattern(pattern, tree, options = {}) {
|
|
12
|
+
// Skip negated patterns - they don't need to match anything
|
|
13
|
+
if (pattern.negated) {
|
|
14
|
+
return { valid: true };
|
|
15
|
+
}
|
|
16
|
+
const { configBasePath } = options;
|
|
17
|
+
const files = Array.from(tree.files);
|
|
18
|
+
// Resolve pattern relative to config file location
|
|
19
|
+
let resolvedPattern = pattern.value;
|
|
20
|
+
if (configBasePath && !path.isAbsolute(pattern.value)) {
|
|
21
|
+
resolvedPattern = path.join(configBasePath, pattern.value);
|
|
22
|
+
}
|
|
23
|
+
switch (pattern.type) {
|
|
24
|
+
case PatternType.PATH:
|
|
25
|
+
return validatePathPattern(resolvedPattern, tree);
|
|
26
|
+
case PatternType.GLOB:
|
|
27
|
+
return validateGlobPattern(resolvedPattern, files);
|
|
28
|
+
case PatternType.REGEX:
|
|
29
|
+
return validateRegexPattern(resolvedPattern, files);
|
|
30
|
+
default:
|
|
31
|
+
return { valid: true };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Validate an exact path pattern */
|
|
35
|
+
function validatePathPattern(patternValue, tree) {
|
|
36
|
+
if (pathExists(tree, patternValue)) {
|
|
37
|
+
return { valid: true };
|
|
38
|
+
}
|
|
39
|
+
return { valid: false, reason: 'file_not_found' };
|
|
40
|
+
}
|
|
41
|
+
/** Validate a glob pattern */
|
|
42
|
+
function validateGlobPattern(patternValue, files) {
|
|
43
|
+
if (!isValidGlob(patternValue)) {
|
|
44
|
+
return { valid: false, reason: 'invalid_pattern' };
|
|
45
|
+
}
|
|
46
|
+
const matches = globMatches(patternValue, files);
|
|
47
|
+
if (matches.length > 0) {
|
|
48
|
+
return { valid: true };
|
|
49
|
+
}
|
|
50
|
+
return { valid: false, reason: 'no_matches' };
|
|
51
|
+
}
|
|
52
|
+
/** Validate a regex pattern */
|
|
53
|
+
function validateRegexPattern(patternValue, files) {
|
|
54
|
+
if (!isValidRegex(patternValue)) {
|
|
55
|
+
return { valid: false, reason: 'invalid_pattern' };
|
|
56
|
+
}
|
|
57
|
+
const matches = regexMatches(patternValue, files);
|
|
58
|
+
if (matches.length > 0) {
|
|
59
|
+
return { valid: true };
|
|
60
|
+
}
|
|
61
|
+
return { valid: false, reason: 'no_matches' };
|
|
62
|
+
}
|
|
63
|
+
/** Validate all patterns from a config file */
|
|
64
|
+
export function validatePatterns(configFile, patterns, parserName, tree) {
|
|
65
|
+
const findings = [];
|
|
66
|
+
const configBasePath = path.dirname(configFile);
|
|
67
|
+
for (const pattern of patterns) {
|
|
68
|
+
const result = validatePattern(pattern, tree, { configBasePath });
|
|
69
|
+
if (!result.valid && result.reason) {
|
|
70
|
+
const severity = classifySeverity(pattern.value, parserName, configFile);
|
|
71
|
+
findings.push({
|
|
72
|
+
file: configFile,
|
|
73
|
+
line: pattern.line,
|
|
74
|
+
column: pattern.column,
|
|
75
|
+
pattern: pattern.value,
|
|
76
|
+
type: pattern.type,
|
|
77
|
+
reason: result.reason,
|
|
78
|
+
parser: parserName,
|
|
79
|
+
severity
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return findings;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/validator/validator.ts"],"names":[],"mappings":"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"}
|