check-my-toolkit 1.5.4 → 1.5.6
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/dist/code/tools/comment-utils.d.ts +18 -0
- package/dist/code/tools/comment-utils.d.ts.map +1 -0
- package/dist/code/tools/comment-utils.js +113 -0
- package/dist/code/tools/comment-utils.js.map +1 -0
- package/dist/code/tools/disable-comments.d.ts +12 -45
- package/dist/code/tools/disable-comments.d.ts.map +1 -1
- package/dist/code/tools/disable-comments.js +144 -121
- package/dist/code/tools/disable-comments.js.map +1 -1
- package/dist/config/schema.d.ts +20 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +46 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/validate/index.d.ts +2 -1
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +1 -0
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/tier.d.ts +1 -1
- package/dist/validate/tier.d.ts.map +1 -1
- package/dist/validate/tier.js +151 -33
- package/dist/validate/tier.js.map +1 -1
- package/dist/validate/types.d.ts +18 -0
- package/dist/validate/types.d.ts.map +1 -1
- package/dist/validate/types.js +4 -1
- package/dist/validate/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** File extensions with known comment syntax */
|
|
2
|
+
export declare const KNOWN_EXTENSIONS: Set<string>;
|
|
3
|
+
/**
|
|
4
|
+
* Find the first pattern that appears in the given text range.
|
|
5
|
+
*/
|
|
6
|
+
export declare function findFirstPattern(text: string, patterns: string[]): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Find where a block comment ends in a line. Returns -1 if not found.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findBlockEnd(line: string, startIndex: number): number;
|
|
11
|
+
/**
|
|
12
|
+
* Find comment start in a line, respecting string boundaries.
|
|
13
|
+
*/
|
|
14
|
+
export declare function findCommentInLine(line: string, startPos: number, isPython: boolean): {
|
|
15
|
+
index: number;
|
|
16
|
+
isBlock: boolean;
|
|
17
|
+
} | null;
|
|
18
|
+
//# sourceMappingURL=comment-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-utils.d.ts","sourceRoot":"","sources":["../../../src/code/tools/comment-utils.ts"],"names":[],"mappings":"AAOA,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,aAA4C,CAAC;AAgB1E;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAOhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGrE;AAoED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,GAChB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAgB5C"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** File extensions with known comment syntax */
|
|
2
|
+
export const KNOWN_EXTENSIONS = new Set(["py", "ts", "tsx", "js", "jsx"]);
|
|
3
|
+
/**
|
|
4
|
+
* Check if a character at the given index starts a block comment.
|
|
5
|
+
*/
|
|
6
|
+
function isBlockCommentStart(line, index) {
|
|
7
|
+
return line[index] === "/" && line[index + 1] === "*";
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Check if a character at the given index starts a line comment.
|
|
11
|
+
*/
|
|
12
|
+
function isLineCommentStart(line, index) {
|
|
13
|
+
return line[index] === "/" && line[index + 1] === "/";
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Find the first pattern that appears in the given text range.
|
|
17
|
+
*/
|
|
18
|
+
export function findFirstPattern(text, patterns) {
|
|
19
|
+
for (const pattern of patterns) {
|
|
20
|
+
if (text.includes(pattern)) {
|
|
21
|
+
return pattern;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Find where a block comment ends in a line. Returns -1 if not found.
|
|
28
|
+
*/
|
|
29
|
+
export function findBlockEnd(line, startIndex) {
|
|
30
|
+
const idx = line.indexOf("*/", startIndex);
|
|
31
|
+
return idx === -1 ? -1 : idx + 2;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if a quote character can be toggled given current state.
|
|
35
|
+
*/
|
|
36
|
+
function canToggle(char, target, state, isPython) {
|
|
37
|
+
if (char !== target) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (target === "'") {
|
|
41
|
+
return !state.double && !state.template;
|
|
42
|
+
}
|
|
43
|
+
if (target === '"') {
|
|
44
|
+
return !state.single && !state.template;
|
|
45
|
+
}
|
|
46
|
+
return !isPython && !state.single && !state.double; // backtick
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Update quote state based on current character.
|
|
50
|
+
*/
|
|
51
|
+
function updateQuotes(char, prev, state, isPython) {
|
|
52
|
+
if (prev === "\\") {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (canToggle(char, "'", state, isPython)) {
|
|
56
|
+
state.single = !state.single;
|
|
57
|
+
}
|
|
58
|
+
else if (canToggle(char, '"', state, isPython)) {
|
|
59
|
+
state.double = !state.double;
|
|
60
|
+
}
|
|
61
|
+
else if (canToggle(char, "`", state, isPython)) {
|
|
62
|
+
state.template = !state.template;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if currently inside a string based on quote state.
|
|
67
|
+
*/
|
|
68
|
+
function inString(state) {
|
|
69
|
+
return state.single || state.double || state.template;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check for comment marker at position, return type or null.
|
|
73
|
+
*/
|
|
74
|
+
function getCommentAt(line, i, isPython) {
|
|
75
|
+
if (isPython) {
|
|
76
|
+
return line[i] === "#" ? { isBlock: false } : null;
|
|
77
|
+
}
|
|
78
|
+
if (isLineCommentStart(line, i)) {
|
|
79
|
+
return { isBlock: false };
|
|
80
|
+
}
|
|
81
|
+
if (isBlockCommentStart(line, i)) {
|
|
82
|
+
return { isBlock: true };
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build quote state for a line up to the given position.
|
|
88
|
+
*/
|
|
89
|
+
function buildQuoteState(line, endPos, isPython) {
|
|
90
|
+
const quotes = { single: false, double: false, template: false };
|
|
91
|
+
for (let i = 0; i < endPos; i++) {
|
|
92
|
+
updateQuotes(line[i], line[i - 1] || "", quotes, isPython);
|
|
93
|
+
}
|
|
94
|
+
return quotes;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Find comment start in a line, respecting string boundaries.
|
|
98
|
+
*/
|
|
99
|
+
export function findCommentInLine(line, startPos, isPython) {
|
|
100
|
+
const quotes = buildQuoteState(line, startPos, isPython);
|
|
101
|
+
for (let i = startPos; i < line.length; i++) {
|
|
102
|
+
updateQuotes(line[i], line[i - 1] || "", quotes, isPython);
|
|
103
|
+
if (inString(quotes)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const comment = getCommentAt(line, i, isPython);
|
|
107
|
+
if (comment) {
|
|
108
|
+
return { index: i, isBlock: comment.isBlock };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=comment-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-utils.js","sourceRoot":"","sources":["../../../src/code/tools/comment-utils.ts"],"names":[],"mappings":"AAOA,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAE1E;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,KAAa;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAa;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAkB;IAC/D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,UAAkB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC3C,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc,EAAE,KAAiB,EAAE,QAAiB;IACnF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW;AACjE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,KAAiB,EAAE,QAAiB;IACpF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/B,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/B,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,KAAiB;IACjC,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,CAAS,EAAE,QAAiB;IAC9D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC;IACD,IAAI,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,MAAc,EAAE,QAAiB;IACtE,MAAM,MAAM,GAAe,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,QAAgB,EAChB,QAAiB;IAEjB,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEzD,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -16,60 +16,27 @@ export declare class DisableCommentsRunner extends BaseToolRunner {
|
|
|
16
16
|
readonly toolId = "disable-comments";
|
|
17
17
|
readonly configFiles: string[];
|
|
18
18
|
private config;
|
|
19
|
-
/**
|
|
20
|
-
* Set the configuration for this runner
|
|
21
|
-
*/
|
|
22
19
|
setConfig(config: DisableCommentsConfig): void;
|
|
23
|
-
/**
|
|
24
|
-
* Get the patterns to search for
|
|
25
|
-
*/
|
|
26
20
|
private getPatterns;
|
|
27
|
-
/**
|
|
28
|
-
* Get the file extensions to scan
|
|
29
|
-
*/
|
|
30
21
|
private getExtensions;
|
|
31
|
-
/**
|
|
32
|
-
* Get the exclude patterns
|
|
33
|
-
*/
|
|
34
22
|
private getExcludePatterns;
|
|
35
|
-
/**
|
|
36
|
-
* Build glob pattern for file extensions
|
|
37
|
-
*/
|
|
38
23
|
private buildGlobPattern;
|
|
39
24
|
run(projectRoot: string): Promise<CheckResult>;
|
|
40
|
-
|
|
41
|
-
* Scan files for disable comment patterns
|
|
42
|
-
*/
|
|
43
|
-
private scanFiles;
|
|
44
|
-
/** File extensions with known comment syntax */
|
|
45
|
-
private static readonly KNOWN_EXTENSIONS;
|
|
46
|
-
/** Check if we can toggle a specific quote type */
|
|
47
|
-
private canToggleQuote;
|
|
48
|
-
/** Quote tracking state for string detection */
|
|
49
|
-
private updateQuoteState;
|
|
50
|
-
/** Check if character is a comment marker */
|
|
51
|
-
private isCommentMarker;
|
|
52
|
-
/**
|
|
53
|
-
* Find the start of a comment in a line, ignoring comment markers inside strings.
|
|
54
|
-
* Returns the index of the comment start, or -1 if no comment found.
|
|
55
|
-
*/
|
|
56
|
-
private findCommentStart;
|
|
57
|
-
/**
|
|
58
|
-
* Check if a pattern appears in a comment (not in a string)
|
|
59
|
-
*/
|
|
60
|
-
private isPatternInComment;
|
|
61
|
-
/**
|
|
62
|
-
* Scan a single file for disable comment patterns
|
|
63
|
-
*/
|
|
25
|
+
private scanAllFiles;
|
|
64
26
|
private scanFile;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
27
|
+
private scanContent;
|
|
28
|
+
private scanLine;
|
|
29
|
+
private scanSimpleLine;
|
|
30
|
+
private scanJsLine;
|
|
31
|
+
private processJsLineComments;
|
|
32
|
+
private handleInsideBlock;
|
|
33
|
+
private handleOutsideBlock;
|
|
34
|
+
private handleLineComment;
|
|
35
|
+
private handleBlockCommentStart;
|
|
36
|
+
/** Check if a pattern appears in a comment (not in a string) - for simple line detection */
|
|
37
|
+
private isPatternInComment;
|
|
68
38
|
private createViolation;
|
|
69
39
|
private createErrorViolation;
|
|
70
|
-
/**
|
|
71
|
-
* Audit - for disable comments, just verify config is valid
|
|
72
|
-
*/
|
|
73
40
|
audit(_projectRoot: string): Promise<CheckResult>;
|
|
74
41
|
}
|
|
75
42
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disable-comments.d.ts","sourceRoot":"","sources":["../../../src/code/tools/disable-comments.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"disable-comments.d.ts","sourceRoot":"","sources":["../../../src/code/tools/disable-comments.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA0C3C,oDAAoD;AACpD,UAAU,qBAAqB;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AA8BD;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,MAAM,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAM;IAEpC,OAAO,CAAC,MAAM,CAA6B;IAE3C,SAAS,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI;IAI9C,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IASlB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAyBpD,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,uBAAuB;IAqC/B,4FAA4F;IAC5F,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,oBAAoB;IASb,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAoBjE"}
|
|
@@ -2,6 +2,7 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { glob } from "glob";
|
|
4
4
|
import { BaseToolRunner } from "./base.js";
|
|
5
|
+
import { findBlockEnd, findCommentInLine, findFirstPattern, KNOWN_EXTENSIONS, } from "./comment-utils.js";
|
|
5
6
|
/** Default patterns to detect disable comments */
|
|
6
7
|
const DEFAULT_PATTERNS = [
|
|
7
8
|
// ESLint
|
|
@@ -42,36 +43,20 @@ export class DisableCommentsRunner extends BaseToolRunner {
|
|
|
42
43
|
toolId = "disable-comments";
|
|
43
44
|
configFiles = []; // No config file needed
|
|
44
45
|
config = {};
|
|
45
|
-
/**
|
|
46
|
-
* Set the configuration for this runner
|
|
47
|
-
*/
|
|
48
46
|
setConfig(config) {
|
|
49
47
|
this.config = config;
|
|
50
48
|
}
|
|
51
|
-
/**
|
|
52
|
-
* Get the patterns to search for
|
|
53
|
-
*/
|
|
54
49
|
getPatterns() {
|
|
55
50
|
return this.config.patterns ?? DEFAULT_PATTERNS;
|
|
56
51
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Get the file extensions to scan
|
|
59
|
-
*/
|
|
60
52
|
getExtensions() {
|
|
61
53
|
return this.config.extensions ?? DEFAULT_EXTENSIONS;
|
|
62
54
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Get the exclude patterns
|
|
65
|
-
*/
|
|
66
55
|
getExcludePatterns() {
|
|
67
56
|
return [...DEFAULT_EXCLUDE, ...(this.config.exclude ?? [])];
|
|
68
57
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Build glob pattern for file extensions
|
|
71
|
-
*/
|
|
72
58
|
buildGlobPattern() {
|
|
73
59
|
const extensions = this.getExtensions();
|
|
74
|
-
// Deduplicate extensions to avoid glob pattern issues
|
|
75
60
|
const unique = [...new Set(extensions)];
|
|
76
61
|
if (unique.length === 1) {
|
|
77
62
|
return `**/*.${unique[0]}`;
|
|
@@ -81,17 +66,15 @@ export class DisableCommentsRunner extends BaseToolRunner {
|
|
|
81
66
|
async run(projectRoot) {
|
|
82
67
|
const startTime = Date.now();
|
|
83
68
|
try {
|
|
84
|
-
const
|
|
85
|
-
const ignorePatterns = this.getExcludePatterns();
|
|
86
|
-
const files = await glob(pattern, {
|
|
69
|
+
const files = await glob(this.buildGlobPattern(), {
|
|
87
70
|
cwd: projectRoot,
|
|
88
|
-
ignore:
|
|
71
|
+
ignore: this.getExcludePatterns(),
|
|
89
72
|
nodir: true,
|
|
90
73
|
});
|
|
91
74
|
if (files.length === 0) {
|
|
92
75
|
return this.pass(Date.now() - startTime);
|
|
93
76
|
}
|
|
94
|
-
const violations = this.
|
|
77
|
+
const violations = this.scanAllFiles(projectRoot, files);
|
|
95
78
|
return this.fromViolations(violations, Date.now() - startTime);
|
|
96
79
|
}
|
|
97
80
|
catch (error) {
|
|
@@ -99,132 +82,176 @@ export class DisableCommentsRunner extends BaseToolRunner {
|
|
|
99
82
|
return this.fail([this.createErrorViolation(`Disable comments check error: ${message}`)], Date.now() - startTime);
|
|
100
83
|
}
|
|
101
84
|
}
|
|
102
|
-
|
|
103
|
-
* Scan files for disable comment patterns
|
|
104
|
-
*/
|
|
105
|
-
scanFiles(projectRoot, files) {
|
|
85
|
+
scanAllFiles(projectRoot, files) {
|
|
106
86
|
const violations = [];
|
|
107
87
|
const patterns = this.getPatterns();
|
|
108
88
|
for (const file of files) {
|
|
109
89
|
const filePath = path.join(projectRoot, file);
|
|
110
|
-
|
|
111
|
-
violations.push(...fileViolations);
|
|
90
|
+
violations.push(...this.scanFile(filePath, { file, patterns, inBlockComment: false }));
|
|
112
91
|
}
|
|
113
92
|
return violations;
|
|
114
93
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (char !== quoteChar) {
|
|
120
|
-
return false;
|
|
94
|
+
scanFile(absolutePath, ctx) {
|
|
95
|
+
try {
|
|
96
|
+
const content = fs.readFileSync(absolutePath, "utf-8");
|
|
97
|
+
return this.scanContent(content, ctx);
|
|
121
98
|
}
|
|
122
|
-
|
|
123
|
-
return
|
|
99
|
+
catch {
|
|
100
|
+
return []; // Skip unreadable files
|
|
124
101
|
}
|
|
125
|
-
|
|
126
|
-
|
|
102
|
+
}
|
|
103
|
+
scanContent(content, ctx) {
|
|
104
|
+
const lines = content.split("\n");
|
|
105
|
+
const ext = path.extname(ctx.file).slice(1).toLowerCase();
|
|
106
|
+
const violations = [];
|
|
107
|
+
let inBlock = ctx.inBlockComment;
|
|
108
|
+
for (let i = 0; i < lines.length; i++) {
|
|
109
|
+
const params = {
|
|
110
|
+
line: lines[i],
|
|
111
|
+
lineNum: i + 1,
|
|
112
|
+
ext,
|
|
113
|
+
patterns: ctx.patterns,
|
|
114
|
+
};
|
|
115
|
+
const result = this.scanLine(params, inBlock);
|
|
116
|
+
if (result.violation) {
|
|
117
|
+
violations.push(this.createViolation(ctx.file, result.violation));
|
|
118
|
+
}
|
|
119
|
+
inBlock = result.inBlockComment;
|
|
127
120
|
}
|
|
128
|
-
return
|
|
121
|
+
return violations;
|
|
129
122
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (
|
|
133
|
-
|
|
123
|
+
scanLine(params, inBlock) {
|
|
124
|
+
const { ext } = params;
|
|
125
|
+
if (ext === "py" || !KNOWN_EXTENSIONS.has(ext)) {
|
|
126
|
+
return { violation: this.scanSimpleLine(params), inBlockComment: false };
|
|
134
127
|
}
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
return this.scanJsLine(params, inBlock);
|
|
129
|
+
}
|
|
130
|
+
scanSimpleLine(params) {
|
|
131
|
+
const { line, lineNum, ext, patterns } = params;
|
|
132
|
+
for (const pattern of patterns) {
|
|
133
|
+
if (this.isPatternInComment(line, pattern, ext)) {
|
|
134
|
+
return { line: lineNum, pattern, content: line };
|
|
135
|
+
}
|
|
137
136
|
}
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
scanJsLine(params, inBlock) {
|
|
140
|
+
const { line, lineNum, patterns } = params;
|
|
141
|
+
return this.processJsLineComments(line, lineNum, patterns, inBlock);
|
|
142
|
+
}
|
|
143
|
+
processJsLineComments(line, lineNum, patterns, inBlock) {
|
|
144
|
+
let state = { pos: 0, inBlock };
|
|
145
|
+
while (state.pos < line.length) {
|
|
146
|
+
const r = state.inBlock
|
|
147
|
+
? this.handleInsideBlock(line, lineNum, patterns, state.pos)
|
|
148
|
+
: this.handleOutsideBlock(line, lineNum, patterns, state.pos);
|
|
149
|
+
if (r.done) {
|
|
150
|
+
return r.result;
|
|
151
|
+
}
|
|
152
|
+
state = { pos: r.nextPos, inBlock: r.enterBlock ?? false };
|
|
153
|
+
if (r.enterBlock) {
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
140
156
|
}
|
|
157
|
+
return { violation: null, inBlockComment: state.inBlock };
|
|
141
158
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
159
|
+
handleInsideBlock(line, lineNum, patterns, pos) {
|
|
160
|
+
const blockEnd = findBlockEnd(line, pos);
|
|
161
|
+
const text = line.slice(pos, blockEnd === -1 ? line.length : blockEnd);
|
|
162
|
+
const pattern = findFirstPattern(text, patterns);
|
|
163
|
+
if (pattern) {
|
|
164
|
+
return {
|
|
165
|
+
done: true,
|
|
166
|
+
result: {
|
|
167
|
+
violation: { line: lineNum, pattern, content: line },
|
|
168
|
+
inBlockComment: blockEnd === -1,
|
|
169
|
+
},
|
|
170
|
+
nextPos: 0,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (blockEnd === -1) {
|
|
174
|
+
return { done: true, result: { violation: null, inBlockComment: true }, nextPos: 0 };
|
|
147
175
|
}
|
|
148
|
-
return
|
|
176
|
+
return { done: false, result: { violation: null, inBlockComment: false }, nextPos: blockEnd };
|
|
149
177
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
this.
|
|
162
|
-
const inString = quoteState.single || quoteState.double || quoteState.template;
|
|
163
|
-
if (!inString && this.isCommentMarker(line, i, isPython)) {
|
|
164
|
-
return i;
|
|
165
|
-
}
|
|
178
|
+
handleOutsideBlock(line, lineNum, patterns, pos) {
|
|
179
|
+
const comment = findCommentInLine(line, pos, false);
|
|
180
|
+
if (!comment) {
|
|
181
|
+
return {
|
|
182
|
+
done: true,
|
|
183
|
+
result: { violation: null, inBlockComment: false },
|
|
184
|
+
nextPos: 0,
|
|
185
|
+
enterBlock: false,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
if (!comment.isBlock) {
|
|
189
|
+
return this.handleLineComment(line, lineNum, patterns, comment.index);
|
|
166
190
|
}
|
|
167
|
-
return
|
|
191
|
+
return this.handleBlockCommentStart(line, lineNum, patterns, comment.index);
|
|
168
192
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
193
|
+
handleLineComment(line, lineNum, patterns, index) {
|
|
194
|
+
const pattern = findFirstPattern(line.slice(index), patterns);
|
|
195
|
+
const result = pattern
|
|
196
|
+
? { violation: { line: lineNum, pattern, content: line }, inBlockComment: false }
|
|
197
|
+
: { violation: null, inBlockComment: false };
|
|
198
|
+
return { done: true, result, nextPos: 0, enterBlock: false };
|
|
199
|
+
}
|
|
200
|
+
handleBlockCommentStart(line, lineNum, patterns, index) {
|
|
201
|
+
const blockEnd = findBlockEnd(line, index + 2);
|
|
202
|
+
const text = line.slice(index + 2, blockEnd === -1 ? line.length : blockEnd);
|
|
203
|
+
const pattern = findFirstPattern(text, patterns);
|
|
204
|
+
if (pattern) {
|
|
205
|
+
return {
|
|
206
|
+
done: true,
|
|
207
|
+
result: {
|
|
208
|
+
violation: { line: lineNum, pattern, content: line },
|
|
209
|
+
inBlockComment: blockEnd === -1,
|
|
210
|
+
},
|
|
211
|
+
nextPos: 0,
|
|
212
|
+
enterBlock: false,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
if (blockEnd === -1) {
|
|
216
|
+
return {
|
|
217
|
+
done: false,
|
|
218
|
+
result: { violation: null, inBlockComment: true },
|
|
219
|
+
nextPos: 0,
|
|
220
|
+
enterBlock: true,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
done: false,
|
|
225
|
+
result: { violation: null, inBlockComment: false },
|
|
226
|
+
nextPos: blockEnd,
|
|
227
|
+
enterBlock: false,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** Check if a pattern appears in a comment (not in a string) - for simple line detection */
|
|
172
231
|
isPatternInComment(line, pattern, extension) {
|
|
173
|
-
|
|
174
|
-
if (patternIndex === -1) {
|
|
232
|
+
if (!line.includes(pattern)) {
|
|
175
233
|
return false;
|
|
176
234
|
}
|
|
177
|
-
|
|
178
|
-
// This maintains backward compatibility for custom extensions like .md
|
|
179
|
-
if (!DisableCommentsRunner.KNOWN_EXTENSIONS.has(extension)) {
|
|
235
|
+
if (!KNOWN_EXTENSIONS.has(extension)) {
|
|
180
236
|
return true;
|
|
181
237
|
}
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
return commentStart !== -1 && commentStart <= patternIndex;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Scan a single file for disable comment patterns
|
|
189
|
-
*/
|
|
190
|
-
scanFile(relativePath, absolutePath, patterns) {
|
|
191
|
-
const violations = [];
|
|
192
|
-
try {
|
|
193
|
-
const content = fs.readFileSync(absolutePath, "utf-8");
|
|
194
|
-
const lines = content.split("\n");
|
|
195
|
-
// Get file extension for comment detection
|
|
196
|
-
const extension = path.extname(relativePath).slice(1).toLowerCase();
|
|
197
|
-
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
198
|
-
const line = lines[lineIndex];
|
|
199
|
-
const lineNumber = lineIndex + 1;
|
|
200
|
-
for (const pattern of patterns) {
|
|
201
|
-
// Only flag if pattern appears in an actual comment, not in a string
|
|
202
|
-
if (this.isPatternInComment(line, pattern, extension)) {
|
|
203
|
-
violations.push(this.createViolation(relativePath, lineNumber, pattern, line));
|
|
204
|
-
break; // Only report first matching pattern per line
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
catch {
|
|
210
|
-
// Skip files that can't be read (binary, permission issues, etc.)
|
|
238
|
+
const comment = findCommentInLine(line, 0, extension === "py");
|
|
239
|
+
if (!comment) {
|
|
240
|
+
return false;
|
|
211
241
|
}
|
|
212
|
-
|
|
242
|
+
const patternIndex = line.indexOf(pattern);
|
|
243
|
+
return comment.index <= patternIndex;
|
|
213
244
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
createViolation(file, line, pattern, lineContent) {
|
|
218
|
-
// Trim and truncate the line content for the message
|
|
219
|
-
const trimmedContent = lineContent.trim();
|
|
220
|
-
const displayContent = trimmedContent.length > 60 ? `${trimmedContent.substring(0, 60)}...` : trimmedContent;
|
|
245
|
+
createViolation(file, data) {
|
|
246
|
+
const trimmed = data.content.trim();
|
|
247
|
+
const display = trimmed.length > 60 ? `${trimmed.substring(0, 60)}...` : trimmed;
|
|
221
248
|
return {
|
|
222
249
|
rule: `${this.rule}.${this.toolId}`,
|
|
223
250
|
tool: this.toolId,
|
|
224
251
|
file,
|
|
225
|
-
line,
|
|
226
|
-
message: `Found "${pattern}" comment: ${
|
|
227
|
-
code: pattern,
|
|
252
|
+
line: data.line,
|
|
253
|
+
message: `Found "${data.pattern}" comment: ${display}`,
|
|
254
|
+
code: data.pattern,
|
|
228
255
|
severity: "error",
|
|
229
256
|
};
|
|
230
257
|
}
|
|
@@ -236,12 +263,8 @@ export class DisableCommentsRunner extends BaseToolRunner {
|
|
|
236
263
|
severity: "error",
|
|
237
264
|
};
|
|
238
265
|
}
|
|
239
|
-
/**
|
|
240
|
-
* Audit - for disable comments, just verify config is valid
|
|
241
|
-
*/
|
|
242
266
|
async audit(_projectRoot) {
|
|
243
267
|
const startTime = Date.now();
|
|
244
|
-
// Validate patterns if provided
|
|
245
268
|
const patterns = this.getPatterns();
|
|
246
269
|
if (patterns.length === 0) {
|
|
247
270
|
return this.fail([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disable-comments.js","sourceRoot":"","sources":["../../../src/code/tools/disable-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"disable-comments.js","sourceRoot":"","sources":["../../../src/code/tools/disable-comments.ts"],"names":[],"mappings":"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"}
|