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.
- package/CHANGELOG.md +41 -3
- package/README.md +17 -3
- package/dist/cli.js +1 -1
- package/dist/output/sarif.js +1 -1
- package/dist/parsers/alex.d.ts +10 -0
- package/dist/parsers/alex.d.ts.map +1 -0
- package/dist/parsers/alex.js +59 -0
- package/dist/parsers/alex.js.map +1 -0
- package/dist/parsers/ansible-lint.d.ts +8 -0
- package/dist/parsers/ansible-lint.d.ts.map +1 -0
- package/dist/parsers/ansible-lint.js +71 -0
- package/dist/parsers/ansible-lint.js.map +1 -0
- package/dist/parsers/brakeman.d.ts +8 -0
- package/dist/parsers/brakeman.d.ts.map +1 -0
- package/dist/parsers/brakeman.js +85 -0
- package/dist/parsers/brakeman.js.map +1 -0
- package/dist/parsers/buf.d.ts +8 -0
- package/dist/parsers/buf.d.ts.map +1 -0
- package/dist/parsers/buf.js +121 -0
- package/dist/parsers/buf.js.map +1 -0
- package/dist/parsers/bundler-audit.d.ts +11 -0
- package/dist/parsers/bundler-audit.d.ts.map +1 -0
- package/dist/parsers/bundler-audit.js +73 -0
- package/dist/parsers/bundler-audit.js.map +1 -0
- package/dist/parsers/commitlint.d.ts +8 -0
- package/dist/parsers/commitlint.d.ts.map +1 -0
- package/dist/parsers/commitlint.js +86 -0
- package/dist/parsers/commitlint.js.map +1 -0
- package/dist/parsers/eslint-flat.d.ts +9 -0
- package/dist/parsers/eslint-flat.d.ts.map +1 -0
- package/dist/parsers/eslint-flat.js +79 -0
- package/dist/parsers/eslint-flat.js.map +1 -0
- package/dist/parsers/index.d.ts +14 -0
- package/dist/parsers/index.d.ts.map +1 -1
- package/dist/parsers/index.js +55 -1
- package/dist/parsers/index.js.map +1 -1
- package/dist/parsers/lefthook.d.ts +8 -0
- package/dist/parsers/lefthook.d.ts.map +1 -0
- package/dist/parsers/lefthook.js +111 -0
- package/dist/parsers/lefthook.js.map +1 -0
- package/dist/parsers/lint-staged.d.ts +8 -0
- package/dist/parsers/lint-staged.d.ts.map +1 -0
- package/dist/parsers/lint-staged.js +74 -0
- package/dist/parsers/lint-staged.js.map +1 -0
- package/dist/parsers/oxlint.d.ts +8 -0
- package/dist/parsers/oxlint.d.ts.map +1 -0
- package/dist/parsers/oxlint.js +65 -0
- package/dist/parsers/oxlint.js.map +1 -0
- package/dist/parsers/pre-commit.d.ts +8 -0
- package/dist/parsers/pre-commit.d.ts.map +1 -0
- package/dist/parsers/pre-commit.js +95 -0
- package/dist/parsers/pre-commit.js.map +1 -0
- package/dist/parsers/reek.d.ts +8 -0
- package/dist/parsers/reek.d.ts.map +1 -0
- package/dist/parsers/reek.js +70 -0
- package/dist/parsers/reek.js.map +1 -0
- package/dist/parsers/sqlfluff.d.ts +10 -0
- package/dist/parsers/sqlfluff.d.ts.map +1 -0
- package/dist/parsers/sqlfluff.js +88 -0
- package/dist/parsers/sqlfluff.js.map +1 -0
- package/dist/parsers/yard-lint.d.ts +8 -0
- package/dist/parsers/yard-lint.d.ts.map +1 -0
- package/dist/parsers/yard-lint.js +97 -0
- package/dist/parsers/yard-lint.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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.
|
|
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/
|
|
37
|
+
"url": "https://github.com/mensfeld/lostconf.git"
|
|
38
38
|
},
|
|
39
39
|
"bugs": {
|
|
40
|
-
"url": "https://github.com/
|
|
40
|
+
"url": "https://github.com/mensfeld/lostconf/issues"
|
|
41
41
|
},
|
|
42
|
-
"homepage": "https://github.com/
|
|
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"
|