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,68 @@
1
+ /**
2
+ * Parser for Rust configuration files (rustfmt.toml, .rustfmt.toml, clippy.toml)
3
+ */
4
+ import { parse as parseToml } from 'smol-toml';
5
+ import { PatternType } from '../core/types.js';
6
+ import { isGlobPattern } from '../validator/glob.js';
7
+ /** Known path/pattern fields in Rust config files */
8
+ const PATTERN_FIELDS = ['ignore', 'skip_children', 'exclude', 'include'];
9
+ /** Parse rustfmt.toml/clippy.toml and extract patterns */
10
+ function parseRustConfig(_filename, content) {
11
+ const patterns = [];
12
+ let config;
13
+ try {
14
+ config = parseToml(content);
15
+ }
16
+ catch {
17
+ return patterns;
18
+ }
19
+ const lineMap = buildLineMap(content);
20
+ for (const field of PATTERN_FIELDS) {
21
+ const value = config[field];
22
+ if (!value)
23
+ continue;
24
+ const values = Array.isArray(value) ? value : [value];
25
+ for (const v of values) {
26
+ if (typeof v !== 'string')
27
+ continue;
28
+ const lineInfo = lineMap.get(v);
29
+ const type = isGlobPattern(v) ? PatternType.GLOB : PatternType.PATH;
30
+ patterns.push({
31
+ value: v,
32
+ type,
33
+ line: lineInfo?.line ?? 1,
34
+ column: lineInfo?.column
35
+ });
36
+ }
37
+ }
38
+ return patterns;
39
+ }
40
+ function buildLineMap(content) {
41
+ const map = new Map();
42
+ const lines = content.split('\n');
43
+ for (let i = 0; i < lines.length; i++) {
44
+ const line = lines[i];
45
+ const lineNum = i + 1;
46
+ const stringMatches = line.matchAll(/"([^"]+)"|'([^']+)'/g);
47
+ for (const match of stringMatches) {
48
+ const value = match[1] || match[2];
49
+ if (value && !map.has(value)) {
50
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
51
+ }
52
+ }
53
+ }
54
+ return map;
55
+ }
56
+ /** Rustfmt parser */
57
+ export const rustfmtParser = {
58
+ name: 'rustfmt',
59
+ filePatterns: ['rustfmt.toml', '.rustfmt.toml', '**/rustfmt.toml', '**/.rustfmt.toml'],
60
+ parse: parseRustConfig
61
+ };
62
+ /** Clippy parser */
63
+ export const clippyParser = {
64
+ name: 'clippy',
65
+ filePatterns: ['clippy.toml', '.clippy.toml', '**/clippy.toml', '**/.clippy.toml'],
66
+ parse: parseRustConfig
67
+ };
68
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../src/parsers/rust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Parser for Scala configuration files (.scalafmt.conf, .scalafix.conf)
3
+ */
4
+ import type { Parser } from '../plugin/types.js';
5
+ /** Scalafmt parser */
6
+ export declare const scalafmtParser: Parser;
7
+ /** Scalafix parser */
8
+ export declare const scalafixParser: Parser;
9
+ //# sourceMappingURL=scala.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scala.d.ts","sourceRoot":"","sources":["../../src/parsers/scala.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAgEjD,sBAAsB;AACtB,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Parser for Scala configuration files (.scalafmt.conf, .scalafix.conf)
3
+ */
4
+ import { PatternType } from '../core/types.js';
5
+ import { isGlobPattern } from '../validator/glob.js';
6
+ import { looksLikeRegex } from '../validator/regex.js';
7
+ /** Parse .scalafmt.conf (HOCON format - simplified parsing) */
8
+ function parseScalafmtConfig(_filename, content) {
9
+ const patterns = [];
10
+ const lines = content.split('\n');
11
+ // Look for project.excludeFilters, project.includeFilters, etc.
12
+ let inFiltersSection = false;
13
+ let bracketDepth = 0;
14
+ for (let i = 0; i < lines.length; i++) {
15
+ const line = lines[i];
16
+ const lineNum = i + 1;
17
+ const trimmed = line.trim();
18
+ // Check for filter section start
19
+ if (/(?:excludeFilters|includeFilters|excludePaths)\s*[=:]/.test(trimmed)) {
20
+ inFiltersSection = true;
21
+ bracketDepth = 0;
22
+ }
23
+ // Track bracket depth
24
+ bracketDepth += (trimmed.match(/\[/g) || []).length;
25
+ bracketDepth -= (trimmed.match(/\]/g) || []).length;
26
+ if (inFiltersSection) {
27
+ // End of section
28
+ if (bracketDepth <= 0 && !trimmed.includes('[')) {
29
+ inFiltersSection = false;
30
+ continue;
31
+ }
32
+ // Extract quoted strings (patterns)
33
+ const stringMatches = line.matchAll(/"([^"]+)"/g);
34
+ for (const match of stringMatches) {
35
+ const value = match[1];
36
+ if (!value)
37
+ continue;
38
+ // Determine type
39
+ let type;
40
+ if (looksLikeRegex(value)) {
41
+ type = PatternType.REGEX;
42
+ }
43
+ else if (isGlobPattern(value)) {
44
+ type = PatternType.GLOB;
45
+ }
46
+ else {
47
+ type = PatternType.PATH;
48
+ }
49
+ patterns.push({
50
+ value,
51
+ type,
52
+ line: lineNum,
53
+ column: (match.index ?? 0) + 1
54
+ });
55
+ }
56
+ }
57
+ }
58
+ return patterns;
59
+ }
60
+ /** Scalafmt parser */
61
+ export const scalafmtParser = {
62
+ name: 'scalafmt',
63
+ filePatterns: ['.scalafmt.conf', '**/.scalafmt.conf'],
64
+ parse: parseScalafmtConfig
65
+ };
66
+ /** Scalafix parser */
67
+ export const scalafixParser = {
68
+ name: 'scalafix',
69
+ filePatterns: ['.scalafix.conf', '**/.scalafix.conf'],
70
+ parse: parseScalafmtConfig
71
+ };
72
+ //# sourceMappingURL=scala.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scala.js","sourceRoot":"","sources":["../../src/parsers/scala.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Parser for Semgrep configuration files
3
+ * Semgrep is a fast, open-source static analysis tool for finding bugs and enforcing code standards
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** Semgrep YAML config parser */
7
+ export declare const semgrepYmlParser: Parser;
8
+ /** Semgrep ignore file parser */
9
+ export declare const semgrepIgnoreParser: Parser;
10
+ //# sourceMappingURL=semgrep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semgrep.d.ts","sourceRoot":"","sources":["../../src/parsers/semgrep.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA2HjD,iCAAiC;AACjC,eAAO,MAAM,gBAAgB,EAAE,MAI9B,CAAC;AAEF,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,EAAE,MAIjC,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Parser for Semgrep configuration files
3
+ * Semgrep is a fast, open-source static analysis tool for finding bugs and enforcing code standards
4
+ */
5
+ import { parse as parseYaml } from 'yaml';
6
+ import { PatternType } from '../core/types.js';
7
+ import { isGlobPattern } from '../validator/glob.js';
8
+ /** Parse .semgrep.yml file */
9
+ function parseSemgrepYml(_filename, content) {
10
+ const patterns = [];
11
+ let config;
12
+ try {
13
+ config = parseYaml(content);
14
+ }
15
+ catch {
16
+ return patterns;
17
+ }
18
+ const lineMap = buildLineMap(content);
19
+ // Extract patterns from rules
20
+ if (config.rules && Array.isArray(config.rules)) {
21
+ for (const rule of config.rules) {
22
+ if (!rule.paths)
23
+ continue;
24
+ const pathSections = [rule.paths.exclude, rule.paths.include];
25
+ for (const section of pathSections) {
26
+ if (!section || !Array.isArray(section))
27
+ continue;
28
+ for (const pattern of section) {
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
+ }
43
+ }
44
+ }
45
+ return patterns;
46
+ }
47
+ /** Parse .semgrepignore file (gitignore format) */
48
+ function parseSemgrepIgnore(_filename, content) {
49
+ const patterns = [];
50
+ const lines = content.split('\n');
51
+ for (let i = 0; i < lines.length; i++) {
52
+ const line = lines[i];
53
+ const lineNum = i + 1;
54
+ const trimmed = line.trim();
55
+ if (!trimmed || trimmed.startsWith('#')) {
56
+ continue;
57
+ }
58
+ let patternValue = trimmed;
59
+ let negated = false;
60
+ if (patternValue.startsWith('!')) {
61
+ negated = true;
62
+ patternValue = patternValue.slice(1);
63
+ }
64
+ const type = isGlobPattern(patternValue) ? PatternType.GLOB : PatternType.PATH;
65
+ patterns.push({
66
+ value: patternValue,
67
+ type,
68
+ line: lineNum,
69
+ column: 1,
70
+ negated
71
+ });
72
+ }
73
+ return patterns;
74
+ }
75
+ /** Build a map of string values to their line numbers */
76
+ function buildLineMap(content) {
77
+ const map = new Map();
78
+ const lines = content.split('\n');
79
+ for (let i = 0; i < lines.length; i++) {
80
+ const line = lines[i];
81
+ const lineNum = i + 1;
82
+ const quotedMatches = line.matchAll(/["']([^"']+)["']/g);
83
+ for (const match of quotedMatches) {
84
+ const value = match[1];
85
+ if (value && !map.has(value)) {
86
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
87
+ }
88
+ }
89
+ const unquotedMatch = line.match(/:\s*-\s*([^\s#]+)/);
90
+ if (unquotedMatch && unquotedMatch[1]) {
91
+ const value = unquotedMatch[1].trim();
92
+ if (value && !map.has(value)) {
93
+ map.set(value, { line: lineNum, column: (unquotedMatch.index ?? 0) + 1 });
94
+ }
95
+ }
96
+ }
97
+ return map;
98
+ }
99
+ /** Semgrep YAML config parser */
100
+ export const semgrepYmlParser = {
101
+ name: 'semgrep',
102
+ filePatterns: ['.semgrep.yml', '.semgrep.yaml', '**/.semgrep.yml', '**/.semgrep.yaml'],
103
+ parse: parseSemgrepYml
104
+ };
105
+ /** Semgrep ignore file parser */
106
+ export const semgrepIgnoreParser = {
107
+ name: 'semgrepignore',
108
+ filePatterns: ['.semgrepignore', '**/.semgrepignore'],
109
+ parse: parseSemgrepIgnore
110
+ };
111
+ //# sourceMappingURL=semgrep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semgrep.js","sourceRoot":"","sources":["../../src/parsers/semgrep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Parser for ShellCheck configuration files
3
+ * ShellCheck is a static analysis tool for shell scripts
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** ShellCheck .shellcheckrc file parser */
7
+ export declare const shellcheckParser: Parser;
8
+ //# sourceMappingURL=shellcheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellcheck.d.ts","sourceRoot":"","sources":["../../src/parsers/shellcheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA+CjD,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAE,MAI9B,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Parser for ShellCheck configuration files
3
+ * ShellCheck is a static analysis tool for shell scripts
4
+ */
5
+ import { PatternType } from '../core/types.js';
6
+ import { isGlobPattern } from '../validator/glob.js';
7
+ /** Parse .shellcheckrc file */
8
+ function parseShellcheck(_filename, content) {
9
+ const patterns = [];
10
+ const lines = content.split('\n');
11
+ for (let i = 0; i < lines.length; i++) {
12
+ const line = lines[i];
13
+ const lineNum = i + 1;
14
+ const trimmed = line.trim();
15
+ // Skip empty lines and comments
16
+ if (!trimmed || trimmed.startsWith('#')) {
17
+ continue;
18
+ }
19
+ // Parse key=value format
20
+ if (trimmed.includes('=')) {
21
+ const [key, value] = trimmed.split('=').map((s) => s.trim());
22
+ // Check if this is a source-path directive
23
+ if (key === 'source-path' && value) {
24
+ // source-path can contain multiple paths separated by :
25
+ const paths = value
26
+ .split(':')
27
+ .map((s) => s.trim())
28
+ .filter(Boolean);
29
+ for (const path of paths) {
30
+ const type = isGlobPattern(path) ? PatternType.GLOB : PatternType.PATH;
31
+ patterns.push({
32
+ value: path,
33
+ type,
34
+ line: lineNum,
35
+ column: 1
36
+ });
37
+ }
38
+ }
39
+ }
40
+ }
41
+ return patterns;
42
+ }
43
+ /** ShellCheck .shellcheckrc file parser */
44
+ export const shellcheckParser = {
45
+ name: 'shellcheck',
46
+ filePatterns: ['.shellcheckrc', '**/.shellcheckrc'],
47
+ parse: parseShellcheck
48
+ };
49
+ //# sourceMappingURL=shellcheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellcheck.js","sourceRoot":"","sources":["../../src/parsers/shellcheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,+BAA+B;AAC/B,SAAS,eAAe,CAAC,SAAiB,EAAE,OAAe;IACzD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAE7D,2CAA2C;YAC3C,IAAI,GAAG,KAAK,aAAa,IAAI,KAAK,EAAE,CAAC;gBACnC,wDAAwD;gBACxD,MAAM,KAAK,GAAG,KAAK;qBAChB,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;oBAEvE,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK,EAAE,IAAI;wBACX,IAAI;wBACJ,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,CAAC;qBACV,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAW;IACtC,IAAI,EAAE,YAAY;IAClB,YAAY,EAAE,CAAC,eAAe,EAAE,kBAAkB,CAAC;IACnD,KAAK,EAAE,eAAe;CACvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Parser for Stylelint configuration (.stylelintignore, .stylelintrc)
3
+ */
4
+ import type { Parser } from '../plugin/types.js';
5
+ /** Stylelint ignore parser */
6
+ export declare const stylelintIgnoreParser: Parser;
7
+ /** Stylelint RC parser */
8
+ export declare const stylelintRcParser: Parser;
9
+ //# sourceMappingURL=stylelint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylelint.d.ts","sourceRoot":"","sources":["../../src/parsers/stylelint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAiGjD,8BAA8B;AAC9B,eAAO,MAAM,qBAAqB,EAAE,MAInC,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,MAI/B,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Parser for Stylelint configuration (.stylelintignore, .stylelintrc)
3
+ */
4
+ import { PatternType } from '../core/types.js';
5
+ import { isGlobPattern } from '../validator/glob.js';
6
+ /** Parse .stylelintignore file (same format as .gitignore) */
7
+ function parseStylelintIgnore(_filename, content) {
8
+ const patterns = [];
9
+ const lines = content.split('\n');
10
+ for (let i = 0; i < lines.length; i++) {
11
+ const line = lines[i];
12
+ const lineNum = i + 1;
13
+ const trimmed = line.trim();
14
+ if (!trimmed || trimmed.startsWith('#')) {
15
+ continue;
16
+ }
17
+ let patternValue = trimmed;
18
+ let negated = false;
19
+ if (patternValue.startsWith('!')) {
20
+ negated = true;
21
+ patternValue = patternValue.slice(1);
22
+ }
23
+ const type = isGlobPattern(patternValue) ? PatternType.GLOB : PatternType.PATH;
24
+ patterns.push({
25
+ value: patternValue,
26
+ type,
27
+ line: lineNum,
28
+ column: 1,
29
+ negated
30
+ });
31
+ }
32
+ return patterns;
33
+ }
34
+ /** Parse .stylelintrc.json and extract ignoreFiles patterns */
35
+ function parseStylelintRc(_filename, content) {
36
+ const patterns = [];
37
+ let config;
38
+ try {
39
+ config = JSON.parse(content);
40
+ }
41
+ catch {
42
+ return patterns;
43
+ }
44
+ if (!config || typeof config !== 'object') {
45
+ return patterns;
46
+ }
47
+ const lineMap = buildLineMap(content);
48
+ if (config.ignoreFiles) {
49
+ const ignoreFiles = Array.isArray(config.ignoreFiles)
50
+ ? config.ignoreFiles
51
+ : [config.ignoreFiles];
52
+ for (const value of ignoreFiles) {
53
+ if (typeof value !== 'string')
54
+ continue;
55
+ const lineInfo = lineMap.get(value);
56
+ const type = isGlobPattern(value) ? PatternType.GLOB : PatternType.PATH;
57
+ patterns.push({
58
+ value,
59
+ type,
60
+ line: lineInfo?.line ?? 1,
61
+ column: lineInfo?.column
62
+ });
63
+ }
64
+ }
65
+ return patterns;
66
+ }
67
+ function buildLineMap(content) {
68
+ const map = new Map();
69
+ const lines = content.split('\n');
70
+ for (let i = 0; i < lines.length; i++) {
71
+ const line = lines[i];
72
+ const lineNum = i + 1;
73
+ const stringMatches = line.matchAll(/"([^"]+)"/g);
74
+ for (const match of stringMatches) {
75
+ const value = match[1];
76
+ if (value && !map.has(value)) {
77
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
78
+ }
79
+ }
80
+ }
81
+ return map;
82
+ }
83
+ /** Stylelint ignore parser */
84
+ export const stylelintIgnoreParser = {
85
+ name: 'stylelintignore',
86
+ filePatterns: ['.stylelintignore', '**/.stylelintignore'],
87
+ parse: parseStylelintIgnore
88
+ };
89
+ /** Stylelint RC parser */
90
+ export const stylelintRcParser = {
91
+ name: 'stylelintrc',
92
+ filePatterns: ['.stylelintrc', '.stylelintrc.json', '**/.stylelintrc', '**/.stylelintrc.json'],
93
+ parse: parseStylelintRc
94
+ };
95
+ //# sourceMappingURL=stylelint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylelint.js","sourceRoot":"","sources":["../../src/parsers/stylelint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Parser for Swift linter configuration (.swiftlint.yml)
3
+ */
4
+ import type { Parser } from '../plugin/types.js';
5
+ /** SwiftLint parser */
6
+ export declare const swiftlintParser: Parser;
7
+ //# sourceMappingURL=swift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swift.d.ts","sourceRoot":"","sources":["../../src/parsers/swift.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA4EjD,uBAAuB;AACvB,eAAO,MAAM,eAAe,EAAE,MAI7B,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Parser for Swift linter configuration (.swiftlint.yml)
3
+ */
4
+ import { parse as parseYaml } from 'yaml';
5
+ import { PatternType } from '../core/types.js';
6
+ import { isGlobPattern } from '../validator/glob.js';
7
+ /** Parse .swiftlint.yml and extract patterns */
8
+ function parseSwiftLint(_filename, content) {
9
+ const patterns = [];
10
+ let config;
11
+ try {
12
+ config = parseYaml(content);
13
+ }
14
+ catch {
15
+ return patterns;
16
+ }
17
+ if (!config || typeof config !== 'object') {
18
+ return patterns;
19
+ }
20
+ const lineMap = buildLineMap(content);
21
+ // Extract from included/excluded sections
22
+ extractPatterns(config.included, patterns, lineMap);
23
+ extractPatterns(config.excluded, patterns, lineMap);
24
+ return patterns;
25
+ }
26
+ function extractPatterns(values, patterns, lineMap) {
27
+ if (!Array.isArray(values))
28
+ return;
29
+ for (const value of values) {
30
+ if (typeof value !== 'string')
31
+ continue;
32
+ const lineInfo = lineMap.get(value);
33
+ const type = isGlobPattern(value) ? PatternType.GLOB : PatternType.PATH;
34
+ patterns.push({
35
+ value,
36
+ type,
37
+ line: lineInfo?.line ?? 1,
38
+ column: lineInfo?.column
39
+ });
40
+ }
41
+ }
42
+ function buildLineMap(content) {
43
+ const map = new Map();
44
+ const lines = content.split('\n');
45
+ for (let i = 0; i < lines.length; i++) {
46
+ const line = lines[i];
47
+ const lineNum = i + 1;
48
+ const listMatch = line.match(/^\s*-\s+(?:"([^"]+)"|'([^']+)'|([^\s#]+))/);
49
+ if (listMatch) {
50
+ const value = listMatch[1] || listMatch[2] || listMatch[3];
51
+ if (value && !map.has(value)) {
52
+ map.set(value, { line: lineNum, column: line.indexOf(value) + 1 });
53
+ }
54
+ }
55
+ }
56
+ return map;
57
+ }
58
+ /** SwiftLint parser */
59
+ export const swiftlintParser = {
60
+ name: 'swiftlint',
61
+ filePatterns: ['.swiftlint.yml', '.swiftlint.yaml', '**/.swiftlint.yml', '**/.swiftlint.yaml'],
62
+ parse: parseSwiftLint
63
+ };
64
+ //# sourceMappingURL=swift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swift.js","sourceRoot":"","sources":["../../src/parsers/swift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Parser for TFLint configuration files
3
+ * TFLint is a Terraform linter
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** TFLint .tflint.hcl file parser */
7
+ export declare const tflintParser: Parser;
8
+ //# sourceMappingURL=tflint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tflint.d.ts","sourceRoot":"","sources":["../../src/parsers/tflint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA0DjD,qCAAqC;AACrC,eAAO,MAAM,YAAY,EAAE,MAI1B,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Parser for TFLint configuration files
3
+ * TFLint is a Terraform linter
4
+ */
5
+ import { PatternType } from '../core/types.js';
6
+ import { isGlobPattern } from '../validator/glob.js';
7
+ /** Parse .tflint.hcl file */
8
+ function parseTflint(_filename, content) {
9
+ const patterns = [];
10
+ const lines = content.split('\n');
11
+ for (let i = 0; i < lines.length; i++) {
12
+ const line = lines[i];
13
+ const lineNum = i + 1;
14
+ const trimmed = line.trim();
15
+ // Skip empty lines and comments
16
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('//')) {
17
+ continue;
18
+ }
19
+ // Look for disabled_by_default or paths in config blocks
20
+ // Example: disabled_by_default = "path/to/file"
21
+ // Example: source = "path/to/module"
22
+ const pathMatch = trimmed.match(/(?:disabled_by_default|source|module_dir)\s*=\s*"([^"]+)"/);
23
+ if (pathMatch) {
24
+ const path = pathMatch[1];
25
+ const type = isGlobPattern(path) ? PatternType.GLOB : PatternType.PATH;
26
+ patterns.push({
27
+ value: path,
28
+ type,
29
+ line: lineNum,
30
+ column: 1
31
+ });
32
+ }
33
+ // Look for exclude patterns in rule blocks
34
+ // Example: exclude = ["path/**"]
35
+ const excludeMatch = trimmed.match(/exclude\s*=\s*\[(.*?)\]/);
36
+ if (excludeMatch) {
37
+ const excludeContent = excludeMatch[1];
38
+ const pathMatches = excludeContent.matchAll(/"([^"]+)"/g);
39
+ for (const match of pathMatches) {
40
+ const path = match[1];
41
+ const type = isGlobPattern(path) ? PatternType.GLOB : PatternType.PATH;
42
+ patterns.push({
43
+ value: path,
44
+ type,
45
+ line: lineNum,
46
+ column: (match.index ?? 0) + 1
47
+ });
48
+ }
49
+ }
50
+ }
51
+ return patterns;
52
+ }
53
+ /** TFLint .tflint.hcl file parser */
54
+ export const tflintParser = {
55
+ name: 'tflint',
56
+ filePatterns: ['.tflint.hcl', '**/.tflint.hcl'],
57
+ parse: parseTflint
58
+ };
59
+ //# sourceMappingURL=tflint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tflint.js","sourceRoot":"","sources":["../../src/parsers/tflint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,6BAA6B;AAC7B,SAAS,WAAW,CAAC,SAAiB,EAAE,OAAe;IACrD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,SAAS;QACX,CAAC;QAED,yDAAyD;QACzD,gDAAgD;QAChD,qCAAqC;QACrC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC7F,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;YAEvE,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,IAAI;gBACX,IAAI;gBACJ,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,CAAC;aACV,CAAC,CAAC;QACL,CAAC;QAED,2CAA2C;QAC3C,iCAAiC;QACjC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9D,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAE1D,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;gBAEvE,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,IAAI;oBACX,IAAI;oBACJ,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,qCAAqC;AACrC,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC;IAC/C,KAAK,EAAE,WAAW;CACnB,CAAC"}