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.
Files changed (201) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/LICENSE +21 -0
  3. package/LICENSE.md +21 -0
  4. package/README.md +445 -0
  5. package/dist/cli.d.ts +6 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +139 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/core/discovery.d.ts +23 -0
  10. package/dist/core/discovery.d.ts.map +1 -0
  11. package/dist/core/discovery.js +75 -0
  12. package/dist/core/discovery.js.map +1 -0
  13. package/dist/core/engine.d.ts +24 -0
  14. package/dist/core/engine.d.ts.map +1 -0
  15. package/dist/core/engine.js +86 -0
  16. package/dist/core/engine.js.map +1 -0
  17. package/dist/core/severity.d.ts +25 -0
  18. package/dist/core/severity.d.ts.map +1 -0
  19. package/dist/core/severity.js +225 -0
  20. package/dist/core/severity.js.map +1 -0
  21. package/dist/core/types.d.ts +77 -0
  22. package/dist/core/types.d.ts.map +1 -0
  23. package/dist/core/types.js +21 -0
  24. package/dist/core/types.js.map +1 -0
  25. package/dist/filetree/scanner.d.ts +26 -0
  26. package/dist/filetree/scanner.d.ts.map +1 -0
  27. package/dist/filetree/scanner.js +71 -0
  28. package/dist/filetree/scanner.js.map +1 -0
  29. package/dist/filetree/tree.d.ts +5 -0
  30. package/dist/filetree/tree.d.ts.map +1 -0
  31. package/dist/filetree/tree.js +5 -0
  32. package/dist/filetree/tree.js.map +1 -0
  33. package/dist/index.d.ts +15 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +18 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/output/formatter.d.ts +12 -0
  38. package/dist/output/formatter.d.ts.map +1 -0
  39. package/dist/output/formatter.js +5 -0
  40. package/dist/output/formatter.js.map +1 -0
  41. package/dist/output/json.d.ts +9 -0
  42. package/dist/output/json.d.ts.map +1 -0
  43. package/dist/output/json.js +14 -0
  44. package/dist/output/json.js.map +1 -0
  45. package/dist/output/sarif.d.ts +9 -0
  46. package/dist/output/sarif.d.ts.map +1 -0
  47. package/dist/output/sarif.js +84 -0
  48. package/dist/output/sarif.js.map +1 -0
  49. package/dist/output/text.d.ts +9 -0
  50. package/dist/output/text.d.ts.map +1 -0
  51. package/dist/output/text.js +87 -0
  52. package/dist/output/text.js.map +1 -0
  53. package/dist/parsers/bandit.d.ts +8 -0
  54. package/dist/parsers/bandit.d.ts.map +1 -0
  55. package/dist/parsers/bandit.js +66 -0
  56. package/dist/parsers/bandit.js.map +1 -0
  57. package/dist/parsers/biome.d.ts +8 -0
  58. package/dist/parsers/biome.d.ts.map +1 -0
  59. package/dist/parsers/biome.js +74 -0
  60. package/dist/parsers/biome.js.map +1 -0
  61. package/dist/parsers/clang.d.ts +9 -0
  62. package/dist/parsers/clang.d.ts.map +1 -0
  63. package/dist/parsers/clang.js +99 -0
  64. package/dist/parsers/clang.js.map +1 -0
  65. package/dist/parsers/deno.d.ts +8 -0
  66. package/dist/parsers/deno.d.ts.map +1 -0
  67. package/dist/parsers/deno.js +73 -0
  68. package/dist/parsers/deno.js.map +1 -0
  69. package/dist/parsers/dotnet.d.ts +9 -0
  70. package/dist/parsers/dotnet.d.ts.map +1 -0
  71. package/dist/parsers/dotnet.js +89 -0
  72. package/dist/parsers/dotnet.js.map +1 -0
  73. package/dist/parsers/elixir.d.ts +7 -0
  74. package/dist/parsers/elixir.d.ts.map +1 -0
  75. package/dist/parsers/elixir.js +59 -0
  76. package/dist/parsers/elixir.js.map +1 -0
  77. package/dist/parsers/eslint.d.ts +7 -0
  78. package/dist/parsers/eslint.d.ts.map +1 -0
  79. package/dist/parsers/eslint.js +43 -0
  80. package/dist/parsers/eslint.js.map +1 -0
  81. package/dist/parsers/flake8.d.ts +10 -0
  82. package/dist/parsers/flake8.d.ts.map +1 -0
  83. package/dist/parsers/flake8.js +89 -0
  84. package/dist/parsers/flake8.js.map +1 -0
  85. package/dist/parsers/gitignore.d.ts +11 -0
  86. package/dist/parsers/gitignore.d.ts.map +1 -0
  87. package/dist/parsers/gitignore.js +72 -0
  88. package/dist/parsers/gitignore.js.map +1 -0
  89. package/dist/parsers/gitleaks.d.ts +8 -0
  90. package/dist/parsers/gitleaks.d.ts.map +1 -0
  91. package/dist/parsers/gitleaks.js +127 -0
  92. package/dist/parsers/gitleaks.js.map +1 -0
  93. package/dist/parsers/golangci.d.ts +7 -0
  94. package/dist/parsers/golangci.d.ts.map +1 -0
  95. package/dist/parsers/golangci.js +73 -0
  96. package/dist/parsers/golangci.js.map +1 -0
  97. package/dist/parsers/hadolint.d.ts +8 -0
  98. package/dist/parsers/hadolint.d.ts.map +1 -0
  99. package/dist/parsers/hadolint.js +95 -0
  100. package/dist/parsers/hadolint.js.map +1 -0
  101. package/dist/parsers/index.d.ts +38 -0
  102. package/dist/parsers/index.d.ts.map +1 -0
  103. package/dist/parsers/index.js +154 -0
  104. package/dist/parsers/index.js.map +1 -0
  105. package/dist/parsers/java.d.ts +11 -0
  106. package/dist/parsers/java.d.ts.map +1 -0
  107. package/dist/parsers/java.js +75 -0
  108. package/dist/parsers/java.js.map +1 -0
  109. package/dist/parsers/jest.d.ts +7 -0
  110. package/dist/parsers/jest.d.ts.map +1 -0
  111. package/dist/parsers/jest.js +118 -0
  112. package/dist/parsers/jest.js.map +1 -0
  113. package/dist/parsers/kotlin.d.ts +7 -0
  114. package/dist/parsers/kotlin.d.ts.map +1 -0
  115. package/dist/parsers/kotlin.js +90 -0
  116. package/dist/parsers/kotlin.js.map +1 -0
  117. package/dist/parsers/markdown.d.ts +7 -0
  118. package/dist/parsers/markdown.d.ts.map +1 -0
  119. package/dist/parsers/markdown.js +40 -0
  120. package/dist/parsers/markdown.js.map +1 -0
  121. package/dist/parsers/php.d.ts +9 -0
  122. package/dist/parsers/php.d.ts.map +1 -0
  123. package/dist/parsers/php.js +92 -0
  124. package/dist/parsers/php.js.map +1 -0
  125. package/dist/parsers/prettier.d.ts +7 -0
  126. package/dist/parsers/prettier.d.ts.map +1 -0
  127. package/dist/parsers/prettier.js +43 -0
  128. package/dist/parsers/prettier.js.map +1 -0
  129. package/dist/parsers/pylint.d.ts +8 -0
  130. package/dist/parsers/pylint.d.ts.map +1 -0
  131. package/dist/parsers/pylint.js +92 -0
  132. package/dist/parsers/pylint.js.map +1 -0
  133. package/dist/parsers/pyproject.d.ts +7 -0
  134. package/dist/parsers/pyproject.d.ts.map +1 -0
  135. package/dist/parsers/pyproject.js +127 -0
  136. package/dist/parsers/pyproject.js.map +1 -0
  137. package/dist/parsers/pyright.d.ts +8 -0
  138. package/dist/parsers/pyright.d.ts.map +1 -0
  139. package/dist/parsers/pyright.js +63 -0
  140. package/dist/parsers/pyright.js.map +1 -0
  141. package/dist/parsers/rubocop.d.ts +7 -0
  142. package/dist/parsers/rubocop.d.ts.map +1 -0
  143. package/dist/parsers/rubocop.js +102 -0
  144. package/dist/parsers/rubocop.js.map +1 -0
  145. package/dist/parsers/rust.d.ts +9 -0
  146. package/dist/parsers/rust.d.ts.map +1 -0
  147. package/dist/parsers/rust.js +68 -0
  148. package/dist/parsers/rust.js.map +1 -0
  149. package/dist/parsers/scala.d.ts +9 -0
  150. package/dist/parsers/scala.d.ts.map +1 -0
  151. package/dist/parsers/scala.js +72 -0
  152. package/dist/parsers/scala.js.map +1 -0
  153. package/dist/parsers/semgrep.d.ts +10 -0
  154. package/dist/parsers/semgrep.d.ts.map +1 -0
  155. package/dist/parsers/semgrep.js +111 -0
  156. package/dist/parsers/semgrep.js.map +1 -0
  157. package/dist/parsers/shellcheck.d.ts +8 -0
  158. package/dist/parsers/shellcheck.d.ts.map +1 -0
  159. package/dist/parsers/shellcheck.js +49 -0
  160. package/dist/parsers/shellcheck.js.map +1 -0
  161. package/dist/parsers/stylelint.d.ts +9 -0
  162. package/dist/parsers/stylelint.d.ts.map +1 -0
  163. package/dist/parsers/stylelint.js +95 -0
  164. package/dist/parsers/stylelint.js.map +1 -0
  165. package/dist/parsers/swift.d.ts +7 -0
  166. package/dist/parsers/swift.d.ts.map +1 -0
  167. package/dist/parsers/swift.js +64 -0
  168. package/dist/parsers/swift.js.map +1 -0
  169. package/dist/parsers/tflint.d.ts +8 -0
  170. package/dist/parsers/tflint.d.ts.map +1 -0
  171. package/dist/parsers/tflint.js +59 -0
  172. package/dist/parsers/tflint.js.map +1 -0
  173. package/dist/parsers/typescript.d.ts +7 -0
  174. package/dist/parsers/typescript.d.ts.map +1 -0
  175. package/dist/parsers/typescript.js +138 -0
  176. package/dist/parsers/typescript.js.map +1 -0
  177. package/dist/parsers/yamllint.d.ts +8 -0
  178. package/dist/parsers/yamllint.d.ts.map +1 -0
  179. package/dist/parsers/yamllint.js +93 -0
  180. package/dist/parsers/yamllint.js.map +1 -0
  181. package/dist/plugin/registry.d.ts +20 -0
  182. package/dist/plugin/registry.d.ts.map +1 -0
  183. package/dist/plugin/registry.js +52 -0
  184. package/dist/plugin/registry.js.map +1 -0
  185. package/dist/plugin/types.d.ts +16 -0
  186. package/dist/plugin/types.d.ts.map +1 -0
  187. package/dist/plugin/types.js +5 -0
  188. package/dist/plugin/types.js.map +1 -0
  189. package/dist/validator/glob.d.ts +16 -0
  190. package/dist/validator/glob.d.ts.map +1 -0
  191. package/dist/validator/glob.js +44 -0
  192. package/dist/validator/glob.js.map +1 -0
  193. package/dist/validator/regex.d.ts +10 -0
  194. package/dist/validator/regex.d.ts.map +1 -0
  195. package/dist/validator/regex.js +45 -0
  196. package/dist/validator/regex.js.map +1 -0
  197. package/dist/validator/validator.d.ts +17 -0
  198. package/dist/validator/validator.d.ts.map +1 -0
  199. package/dist/validator/validator.js +85 -0
  200. package/dist/validator/validator.js.map +1 -0
  201. package/package.json +75 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Parser for TypeScript configuration (tsconfig.json)
3
+ */
4
+ import type { Parser } from '../plugin/types.js';
5
+ /** TSConfig parser */
6
+ export declare const tsconfigParser: Parser;
7
+ //# sourceMappingURL=typescript.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Plugin interface definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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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"}