lostconf 0.2.0 → 0.3.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 (65) hide show
  1. package/CHANGELOG.md +41 -3
  2. package/README.md +17 -3
  3. package/dist/cli.js +1 -1
  4. package/dist/output/sarif.js +1 -1
  5. package/dist/parsers/alex.d.ts +10 -0
  6. package/dist/parsers/alex.d.ts.map +1 -0
  7. package/dist/parsers/alex.js +59 -0
  8. package/dist/parsers/alex.js.map +1 -0
  9. package/dist/parsers/ansible-lint.d.ts +8 -0
  10. package/dist/parsers/ansible-lint.d.ts.map +1 -0
  11. package/dist/parsers/ansible-lint.js +71 -0
  12. package/dist/parsers/ansible-lint.js.map +1 -0
  13. package/dist/parsers/brakeman.d.ts +8 -0
  14. package/dist/parsers/brakeman.d.ts.map +1 -0
  15. package/dist/parsers/brakeman.js +85 -0
  16. package/dist/parsers/brakeman.js.map +1 -0
  17. package/dist/parsers/buf.d.ts +8 -0
  18. package/dist/parsers/buf.d.ts.map +1 -0
  19. package/dist/parsers/buf.js +121 -0
  20. package/dist/parsers/buf.js.map +1 -0
  21. package/dist/parsers/bundler-audit.d.ts +11 -0
  22. package/dist/parsers/bundler-audit.d.ts.map +1 -0
  23. package/dist/parsers/bundler-audit.js +73 -0
  24. package/dist/parsers/bundler-audit.js.map +1 -0
  25. package/dist/parsers/commitlint.d.ts +8 -0
  26. package/dist/parsers/commitlint.d.ts.map +1 -0
  27. package/dist/parsers/commitlint.js +86 -0
  28. package/dist/parsers/commitlint.js.map +1 -0
  29. package/dist/parsers/eslint-flat.d.ts +9 -0
  30. package/dist/parsers/eslint-flat.d.ts.map +1 -0
  31. package/dist/parsers/eslint-flat.js +79 -0
  32. package/dist/parsers/eslint-flat.js.map +1 -0
  33. package/dist/parsers/index.d.ts +14 -0
  34. package/dist/parsers/index.d.ts.map +1 -1
  35. package/dist/parsers/index.js +55 -1
  36. package/dist/parsers/index.js.map +1 -1
  37. package/dist/parsers/lefthook.d.ts +8 -0
  38. package/dist/parsers/lefthook.d.ts.map +1 -0
  39. package/dist/parsers/lefthook.js +111 -0
  40. package/dist/parsers/lefthook.js.map +1 -0
  41. package/dist/parsers/lint-staged.d.ts +8 -0
  42. package/dist/parsers/lint-staged.d.ts.map +1 -0
  43. package/dist/parsers/lint-staged.js +74 -0
  44. package/dist/parsers/lint-staged.js.map +1 -0
  45. package/dist/parsers/oxlint.d.ts +8 -0
  46. package/dist/parsers/oxlint.d.ts.map +1 -0
  47. package/dist/parsers/oxlint.js +65 -0
  48. package/dist/parsers/oxlint.js.map +1 -0
  49. package/dist/parsers/pre-commit.d.ts +8 -0
  50. package/dist/parsers/pre-commit.d.ts.map +1 -0
  51. package/dist/parsers/pre-commit.js +95 -0
  52. package/dist/parsers/pre-commit.js.map +1 -0
  53. package/dist/parsers/reek.d.ts +8 -0
  54. package/dist/parsers/reek.d.ts.map +1 -0
  55. package/dist/parsers/reek.js +70 -0
  56. package/dist/parsers/reek.js.map +1 -0
  57. package/dist/parsers/sqlfluff.d.ts +10 -0
  58. package/dist/parsers/sqlfluff.d.ts.map +1 -0
  59. package/dist/parsers/sqlfluff.js +88 -0
  60. package/dist/parsers/sqlfluff.js.map +1 -0
  61. package/dist/parsers/yard-lint.d.ts +8 -0
  62. package/dist/parsers/yard-lint.d.ts.map +1 -0
  63. package/dist/parsers/yard-lint.js +97 -0
  64. package/dist/parsers/yard-lint.js.map +1 -0
  65. package/package.json +5 -5
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Parser for lint-staged configuration files
3
+ * https://github.com/lint-staged/lint-staged
4
+ */
5
+ import { PatternType } from '../core/types.js';
6
+ import { isGlobPattern } from '../validator/glob.js';
7
+ /** Parse lint-staged config and extract patterns */
8
+ function parseLintStagedConfig(_filename, content) {
9
+ const patterns = [];
10
+ let config;
11
+ try {
12
+ config = JSON.parse(content);
13
+ }
14
+ catch {
15
+ return patterns;
16
+ }
17
+ if (!config || typeof config !== 'object') {
18
+ return patterns;
19
+ }
20
+ const lineMap = buildLineMap(content);
21
+ // In lint-staged, the keys are glob patterns matching files
22
+ // The values are commands to run (which we don't need to validate)
23
+ for (const key of Object.keys(config)) {
24
+ // Skip non-pattern keys (like $schema, etc.)
25
+ if (key.startsWith('$')) {
26
+ continue;
27
+ }
28
+ const lineInfo = lineMap.get(key);
29
+ const type = isGlobPattern(key) ? PatternType.GLOB : PatternType.PATH;
30
+ patterns.push({
31
+ value: key,
32
+ type,
33
+ line: lineInfo?.line ?? 1,
34
+ column: lineInfo?.column
35
+ });
36
+ }
37
+ return patterns;
38
+ }
39
+ function buildLineMap(content) {
40
+ const map = new Map();
41
+ const lines = content.split('\n');
42
+ for (let i = 0; i < lines.length; i++) {
43
+ const line = lines[i];
44
+ const lineNum = i + 1;
45
+ // Match both property names and string values
46
+ const keyMatches = line.matchAll(/"([^"]+)":/g);
47
+ for (const match of keyMatches) {
48
+ const value = match[1];
49
+ if (value && !map.has(value)) {
50
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
51
+ }
52
+ }
53
+ const stringMatches = line.matchAll(/"([^"]+)"/g);
54
+ for (const match of stringMatches) {
55
+ const value = match[1];
56
+ if (value && !map.has(value)) {
57
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
58
+ }
59
+ }
60
+ }
61
+ return map;
62
+ }
63
+ /** lint-staged config parser */
64
+ export const lintStagedParser = {
65
+ name: 'lint-staged',
66
+ filePatterns: [
67
+ '.lintstagedrc',
68
+ '.lintstagedrc.json',
69
+ '**/.lintstagedrc',
70
+ '**/.lintstagedrc.json'
71
+ ],
72
+ parse: parseLintStagedConfig
73
+ };
74
+ //# sourceMappingURL=lint-staged.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-staged.js","sourceRoot":"","sources":["../../src/parsers/lint-staged.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Parser for oxlint configuration files
3
+ * https://oxc.rs/docs/guide/usage/linter.html
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** Oxlint config parser */
7
+ export declare const oxlintParser: Parser;
8
+ //# sourceMappingURL=oxlint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oxlint.d.ts","sourceRoot":"","sources":["../../src/parsers/oxlint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAiEjD,2BAA2B;AAC3B,eAAO,MAAM,YAAY,EAAE,MAS1B,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Parser for oxlint configuration files
3
+ * https://oxc.rs/docs/guide/usage/linter.html
4
+ */
5
+ import { PatternType } from '../core/types.js';
6
+ import { isGlobPattern } from '../validator/glob.js';
7
+ /** Parse .oxlintrc.json and extract patterns */
8
+ function parseOxlintConfig(_filename, content) {
9
+ const patterns = [];
10
+ let config;
11
+ try {
12
+ config = JSON.parse(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 ignorePatterns
22
+ if (Array.isArray(config.ignorePatterns)) {
23
+ for (const value of config.ignorePatterns) {
24
+ if (typeof value !== 'string')
25
+ continue;
26
+ const lineInfo = lineMap.get(value);
27
+ const type = isGlobPattern(value) ? PatternType.GLOB : PatternType.PATH;
28
+ patterns.push({
29
+ value,
30
+ type,
31
+ line: lineInfo?.line ?? 1,
32
+ column: lineInfo?.column
33
+ });
34
+ }
35
+ }
36
+ return patterns;
37
+ }
38
+ function buildLineMap(content) {
39
+ const map = new Map();
40
+ const lines = content.split('\n');
41
+ for (let i = 0; i < lines.length; i++) {
42
+ const line = lines[i];
43
+ const lineNum = i + 1;
44
+ const stringMatches = line.matchAll(/"([^"]+)"/g);
45
+ for (const match of stringMatches) {
46
+ const value = match[1];
47
+ if (value && !map.has(value)) {
48
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
49
+ }
50
+ }
51
+ }
52
+ return map;
53
+ }
54
+ /** Oxlint config parser */
55
+ export const oxlintParser = {
56
+ name: 'oxlint',
57
+ filePatterns: [
58
+ '.oxlintrc.json',
59
+ 'oxlint.config.json',
60
+ '**/.oxlintrc.json',
61
+ '**/oxlint.config.json'
62
+ ],
63
+ parse: parseOxlintConfig
64
+ };
65
+ //# sourceMappingURL=oxlint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oxlint.js","sourceRoot":"","sources":["../../src/parsers/oxlint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQrD,gDAAgD;AAChD,SAAS,iBAAiB,CAAC,SAAiB,EAAE,OAAe;IAC3D,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,MAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEtC,yBAAyB;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;YAExE,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK;gBACL,IAAI;gBACJ,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC;gBACzB,MAAM,EAAE,QAAQ,EAAE,MAAM;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6C,CAAC;IACjE,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;QAEtB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2BAA2B;AAC3B,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE;QACZ,gBAAgB;QAChB,oBAAoB;QACpB,mBAAmB;QACnB,uBAAuB;KACxB;IACD,KAAK,EAAE,iBAAiB;CACzB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Parser for pre-commit configuration files
3
+ * https://pre-commit.com/
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** pre-commit config parser */
7
+ export declare const preCommitParser: Parser;
8
+ //# sourceMappingURL=pre-commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-commit.d.ts","sourceRoot":"","sources":["../../src/parsers/pre-commit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA4HjD,+BAA+B;AAC/B,eAAO,MAAM,eAAe,EAAE,MAI7B,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Parser for pre-commit configuration files
3
+ * https://pre-commit.com/
4
+ */
5
+ import { parse as parseYaml } from 'yaml';
6
+ import { PatternType } from '../core/types.js';
7
+ import { looksLikeRegex } from '../validator/regex.js';
8
+ /** Parse .pre-commit-config.yaml */
9
+ function parsePreCommit(_filename, content) {
10
+ const patterns = [];
11
+ let config;
12
+ try {
13
+ config = parseYaml(content);
14
+ }
15
+ catch {
16
+ return patterns;
17
+ }
18
+ if (!config || typeof config !== 'object') {
19
+ return patterns;
20
+ }
21
+ const lineMap = buildLineMap(content);
22
+ // Extract top-level exclude pattern (regex)
23
+ if (config.exclude) {
24
+ addPattern(patterns, config.exclude, lineMap);
25
+ }
26
+ // Extract top-level files pattern (regex)
27
+ if (config.files) {
28
+ addPattern(patterns, config.files, lineMap);
29
+ }
30
+ // Extract patterns from repo hooks
31
+ if (Array.isArray(config.repos)) {
32
+ for (const repo of config.repos) {
33
+ if (!repo || typeof repo !== 'object')
34
+ continue;
35
+ if (Array.isArray(repo.hooks)) {
36
+ for (const hook of repo.hooks) {
37
+ if (!hook || typeof hook !== 'object')
38
+ continue;
39
+ // Extract files pattern (regex)
40
+ if (hook.files) {
41
+ addPattern(patterns, hook.files, lineMap);
42
+ }
43
+ // Extract exclude pattern (regex)
44
+ if (hook.exclude) {
45
+ addPattern(patterns, hook.exclude, lineMap);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return patterns;
52
+ }
53
+ function addPattern(patterns, value, lineMap) {
54
+ const lineInfo = lineMap.get(value);
55
+ // pre-commit uses regex patterns for files/exclude
56
+ const type = looksLikeRegex(value) ? PatternType.REGEX : PatternType.PATH;
57
+ patterns.push({
58
+ value,
59
+ type,
60
+ line: lineInfo?.line ?? 1,
61
+ column: lineInfo?.column
62
+ });
63
+ }
64
+ function buildLineMap(content) {
65
+ const map = new Map();
66
+ const lines = content.split('\n');
67
+ for (let i = 0; i < lines.length; i++) {
68
+ const line = lines[i];
69
+ const lineNum = i + 1;
70
+ // Match YAML string values (quoted and unquoted)
71
+ const quotedMatches = line.matchAll(/["']([^"']+)["']/g);
72
+ for (const match of quotedMatches) {
73
+ const value = match[1];
74
+ if (value && !map.has(value)) {
75
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
76
+ }
77
+ }
78
+ // Match unquoted values after colon
79
+ const unquotedMatch = line.match(/:\s*([^\s#]+)/);
80
+ if (unquotedMatch && unquotedMatch[1]) {
81
+ const value = unquotedMatch[1];
82
+ if (!map.has(value)) {
83
+ map.set(value, { line: lineNum, column: (unquotedMatch.index ?? 0) + 1 });
84
+ }
85
+ }
86
+ }
87
+ return map;
88
+ }
89
+ /** pre-commit config parser */
90
+ export const preCommitParser = {
91
+ name: 'pre-commit',
92
+ filePatterns: ['.pre-commit-config.yaml', '.pre-commit-config.yml', '**/.pre-commit-config.yaml'],
93
+ parse: parsePreCommit
94
+ };
95
+ //# sourceMappingURL=pre-commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-commit.js","sourceRoot":"","sources":["../../src/parsers/pre-commit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Parser for Reek configuration files
3
+ * https://github.com/troessner/reek
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** Reek config parser */
7
+ export declare const reekParser: Parser;
8
+ //# sourceMappingURL=reek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reek.d.ts","sourceRoot":"","sources":["../../src/parsers/reek.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA2EjD,yBAAyB;AACzB,eAAO,MAAM,UAAU,EAAE,MAIxB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Parser for Reek configuration files
3
+ * https://github.com/troessner/reek
4
+ */
5
+ import { parse as parseYaml } from 'yaml';
6
+ import { PatternType } from '../core/types.js';
7
+ import { isGlobPattern } from '../validator/glob.js';
8
+ /** Parse Reek configuration */
9
+ function parseReek(_filename, content) {
10
+ const patterns = [];
11
+ let config;
12
+ try {
13
+ config = parseYaml(content);
14
+ }
15
+ catch {
16
+ return patterns;
17
+ }
18
+ if (!config || typeof config !== 'object') {
19
+ return patterns;
20
+ }
21
+ const lineMap = buildLineMap(content);
22
+ // Extract exclude_paths
23
+ if (Array.isArray(config.exclude_paths)) {
24
+ for (const value of config.exclude_paths) {
25
+ if (typeof value !== 'string')
26
+ continue;
27
+ const lineInfo = lineMap.get(value);
28
+ const type = isGlobPattern(value) ? PatternType.GLOB : PatternType.PATH;
29
+ patterns.push({
30
+ value,
31
+ type,
32
+ line: lineInfo?.line ?? 1,
33
+ column: lineInfo?.column
34
+ });
35
+ }
36
+ }
37
+ return patterns;
38
+ }
39
+ function buildLineMap(content) {
40
+ const map = new Map();
41
+ const lines = content.split('\n');
42
+ for (let i = 0; i < lines.length; i++) {
43
+ const line = lines[i];
44
+ const lineNum = i + 1;
45
+ // Match YAML string values (quoted and unquoted)
46
+ const quotedMatches = line.matchAll(/["']([^"']+)["']/g);
47
+ for (const match of quotedMatches) {
48
+ const value = match[1];
49
+ if (value && !map.has(value)) {
50
+ map.set(value, { line: lineNum, column: (match.index ?? 0) + 1 });
51
+ }
52
+ }
53
+ // Match unquoted list items
54
+ const listItemMatch = line.match(/^\s*-\s+([^\s#]+)/);
55
+ if (listItemMatch && listItemMatch[1]) {
56
+ const value = listItemMatch[1];
57
+ if (!map.has(value)) {
58
+ map.set(value, { line: lineNum, column: (listItemMatch.index ?? 0) + 1 });
59
+ }
60
+ }
61
+ }
62
+ return map;
63
+ }
64
+ /** Reek config parser */
65
+ export const reekParser = {
66
+ name: 'reek',
67
+ filePatterns: ['.reek.yml', '.reek', 'config.reek', '**/.reek.yml'],
68
+ parse: parseReek
69
+ };
70
+ //# sourceMappingURL=reek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reek.js","sourceRoot":"","sources":["../../src/parsers/reek.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Parser for sqlfluff configuration files
3
+ * https://docs.sqlfluff.com/
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** sqlfluff .sqlfluff file parser */
7
+ export declare const sqlfluffParser: Parser;
8
+ /** sqlfluff setup.cfg parser */
9
+ export declare const sqlfluffSetupCfgParser: Parser;
10
+ //# sourceMappingURL=sqlfluff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlfluff.d.ts","sourceRoot":"","sources":["../../src/parsers/sqlfluff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoFjD,qCAAqC;AACrC,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,sBAAsB,EAAE,MAIpC,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Parser for sqlfluff configuration files
3
+ * https://docs.sqlfluff.com/
4
+ */
5
+ import { PatternType } from '../core/types.js';
6
+ import { isGlobPattern } from '../validator/glob.js';
7
+ /** Parse .sqlfluff or setup.cfg file */
8
+ function parseSqlfluff(_filename, content) {
9
+ const patterns = [];
10
+ const lines = content.split('\n');
11
+ let inSqlfluffSection = false;
12
+ let currentKey = '';
13
+ for (let i = 0; i < lines.length; i++) {
14
+ const line = lines[i];
15
+ const lineNum = i + 1;
16
+ const trimmed = line.trim();
17
+ // Check for [sqlfluff] or [sqlfluff:*] sections
18
+ if (trimmed === '[sqlfluff]' || trimmed.startsWith('[sqlfluff:')) {
19
+ inSqlfluffSection = true;
20
+ continue;
21
+ }
22
+ // Check if we've entered a different section
23
+ if (trimmed.startsWith('[') && trimmed.endsWith(']') && !trimmed.startsWith('[sqlfluff')) {
24
+ inSqlfluffSection = false;
25
+ continue;
26
+ }
27
+ if (!inSqlfluffSection)
28
+ continue;
29
+ // Skip empty lines and comments
30
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith(';')) {
31
+ continue;
32
+ }
33
+ // Parse key = value
34
+ if (trimmed.includes('=')) {
35
+ const [key, value] = trimmed.split('=').map((s) => s.trim());
36
+ currentKey = key;
37
+ // Check if this is a path-related field
38
+ if (isPathField(key) && value) {
39
+ extractPatterns(value, lineNum, patterns);
40
+ }
41
+ }
42
+ else if (currentKey && isPathField(currentKey)) {
43
+ // Continuation line
44
+ extractPatterns(trimmed, lineNum, patterns);
45
+ }
46
+ }
47
+ return patterns;
48
+ }
49
+ /** Check if a key is a path-related field */
50
+ function isPathField(key) {
51
+ return ['ignore', 'ignore_templated_areas', 'template_path', 'library_path'].includes(key);
52
+ // Note: exclude_rules contains rule IDs (L001, L002), not paths
53
+ // Note: sql_file_exts contains file extensions (.sql, .sql.j2), not paths
54
+ }
55
+ /** Extract patterns from a value string */
56
+ function extractPatterns(value, line, patterns) {
57
+ // Split by comma or newline
58
+ const parts = value
59
+ .split(/[,\n]/)
60
+ .map((s) => s.trim())
61
+ .filter((s) => s && !s.startsWith('#') && !s.startsWith(';'));
62
+ for (const part of parts) {
63
+ // Skip empty parts
64
+ if (!part)
65
+ continue;
66
+ // Determine type
67
+ const type = isGlobPattern(part) ? PatternType.GLOB : PatternType.PATH;
68
+ patterns.push({
69
+ value: part,
70
+ type,
71
+ line,
72
+ column: 1
73
+ });
74
+ }
75
+ }
76
+ /** sqlfluff .sqlfluff file parser */
77
+ export const sqlfluffParser = {
78
+ name: 'sqlfluff',
79
+ filePatterns: ['.sqlfluff', '**/.sqlfluff'],
80
+ parse: parseSqlfluff
81
+ };
82
+ /** sqlfluff setup.cfg parser */
83
+ export const sqlfluffSetupCfgParser = {
84
+ name: 'sqlfluff-setup',
85
+ filePatterns: ['setup.cfg', '**/setup.cfg'],
86
+ parse: parseSqlfluff
87
+ };
88
+ //# sourceMappingURL=sqlfluff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlfluff.js","sourceRoot":"","sources":["../../src/parsers/sqlfluff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,wCAAwC;AACxC,SAAS,aAAa,CAAC,SAAiB,EAAE,OAAe;IACvD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,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,gDAAgD;QAChD,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjE,iBAAiB,GAAG,IAAI,CAAC;YACzB,SAAS;QACX,CAAC;QAED,6CAA6C;QAC7C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACzF,iBAAiB,GAAG,KAAK,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,CAAC,iBAAiB;YAAE,SAAS;QAEjC,gCAAgC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnE,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,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;YAC7D,UAAU,GAAG,GAAG,CAAC;YAEjB,wCAAwC;YACxC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC9B,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,oBAAoB;YACpB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,6CAA6C;AAC7C,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,CAAC,QAAQ,EAAE,wBAAwB,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3F,gEAAgE;IAChE,0EAA0E;AAC5E,CAAC;AAED,2CAA2C;AAC3C,SAAS,eAAe,CAAC,KAAa,EAAE,IAAY,EAAE,QAAmB;IACvE,4BAA4B;IAC5B,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mBAAmB;QACnB,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,iBAAiB;QACjB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QAEvE,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,IAAI;YACX,IAAI;YACJ,IAAI;YACJ,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,qCAAqC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IAC3C,KAAK,EAAE,aAAa;CACrB,CAAC;AAEF,gCAAgC;AAChC,MAAM,CAAC,MAAM,sBAAsB,GAAW;IAC5C,IAAI,EAAE,gBAAgB;IACtB,YAAY,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IAC3C,KAAK,EAAE,aAAa;CACrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Parser for YARD-Lint configuration files
3
+ * https://github.com/mensfeld/yard-lint
4
+ */
5
+ import type { Parser } from '../plugin/types.js';
6
+ /** YARD-Lint config parser */
7
+ export declare const yardLintParser: Parser;
8
+ //# sourceMappingURL=yard-lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yard-lint.d.ts","sourceRoot":"","sources":["../../src/parsers/yard-lint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoHjD,8BAA8B;AAC9B,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Parser for YARD-Lint configuration files
3
+ * https://github.com/mensfeld/yard-lint
4
+ */
5
+ import { parse as parseYaml } from 'yaml';
6
+ import { PatternType } from '../core/types.js';
7
+ import { isGlobPattern } from '../validator/glob.js';
8
+ /** Parse YARD-Lint configuration */
9
+ function parseYardLint(_filename, content) {
10
+ const patterns = [];
11
+ let config;
12
+ try {
13
+ config = parseYaml(content);
14
+ }
15
+ catch {
16
+ return patterns;
17
+ }
18
+ if (!config || typeof config !== 'object') {
19
+ return patterns;
20
+ }
21
+ const lineMap = buildLineMap(content);
22
+ // Extract global exclusions from AllValidators
23
+ if (config.AllValidators && typeof config.AllValidators === 'object') {
24
+ if (Array.isArray(config.AllValidators.Exclude)) {
25
+ for (const value of config.AllValidators.Exclude) {
26
+ if (typeof value !== 'string')
27
+ continue;
28
+ const lineInfo = lineMap.get(value);
29
+ const type = isGlobPattern(value) ? PatternType.GLOB : PatternType.PATH;
30
+ patterns.push({
31
+ value,
32
+ type,
33
+ line: lineInfo?.line ?? 1,
34
+ column: lineInfo?.column
35
+ });
36
+ }
37
+ }
38
+ }
39
+ // Extract per-validator exclusions
40
+ for (const [key, value] of Object.entries(config)) {
41
+ // Skip AllValidators (already processed) and non-object values
42
+ if (key === 'AllValidators' || typeof value !== 'object' || value === null) {
43
+ continue;
44
+ }
45
+ const validator = value;
46
+ // Extract Exclude patterns
47
+ if (Array.isArray(validator.Exclude)) {
48
+ for (const pattern of validator.Exclude) {
49
+ if (typeof pattern !== 'string')
50
+ continue;
51
+ const lineInfo = lineMap.get(pattern);
52
+ const type = isGlobPattern(pattern) ? PatternType.GLOB : PatternType.PATH;
53
+ patterns.push({
54
+ value: pattern,
55
+ type,
56
+ line: lineInfo?.line ?? 1,
57
+ column: lineInfo?.column
58
+ });
59
+ }
60
+ }
61
+ // Note: ExcludedMethods contains method signatures, not file paths,
62
+ // but we could track them if needed in the future
63
+ }
64
+ return patterns;
65
+ }
66
+ function buildLineMap(content) {
67
+ const map = new Map();
68
+ const lines = content.split('\n');
69
+ for (let i = 0; i < lines.length; i++) {
70
+ const line = lines[i];
71
+ const lineNum = i + 1;
72
+ // Match YAML string values (quoted and unquoted)
73
+ const quotedMatches = line.matchAll(/["']([^"']+)["']/g);
74
+ for (const match of quotedMatches) {
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
+ // Match unquoted list items
81
+ const listItemMatch = line.match(/^\s*-\s+([^\s#]+)/);
82
+ if (listItemMatch && listItemMatch[1]) {
83
+ const value = listItemMatch[1];
84
+ if (!map.has(value)) {
85
+ map.set(value, { line: lineNum, column: (listItemMatch.index ?? 0) + 1 });
86
+ }
87
+ }
88
+ }
89
+ return map;
90
+ }
91
+ /** YARD-Lint config parser */
92
+ export const yardLintParser = {
93
+ name: 'yard-lint',
94
+ filePatterns: ['.yard-lint.yml', '**/.yard-lint.yml'],
95
+ parse: parseYardLint
96
+ };
97
+ //# sourceMappingURL=yard-lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yard-lint.js","sourceRoot":"","sources":["../../src/parsers/yard-lint.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lostconf",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A meta-linter that detects stale references in configuration files",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -34,12 +34,12 @@
34
34
  },
35
35
  "repository": {
36
36
  "type": "git",
37
- "url": "https://github.com/lostconf/lostconf.git"
37
+ "url": "https://github.com/mensfeld/lostconf.git"
38
38
  },
39
39
  "bugs": {
40
- "url": "https://github.com/lostconf/lostconf/issues"
40
+ "url": "https://github.com/mensfeld/lostconf/issues"
41
41
  },
42
- "homepage": "https://github.com/lostconf/lostconf#readme",
42
+ "homepage": "https://github.com/mensfeld/lostconf#readme",
43
43
  "keywords": [
44
44
  "linter",
45
45
  "config",
@@ -49,7 +49,7 @@
49
49
  "prettier",
50
50
  "cleanup"
51
51
  ],
52
- "author": "",
52
+ "author": "Maciej Mensfeld <maciej@mensfeld.pl>",
53
53
  "license": "MIT",
54
54
  "engines": {
55
55
  "node": ">=18.0.0"