vibe-and-thrive 1.0.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/.claude/commands/add-tests.md +240 -0
- package/.claude/commands/e2e-scaffold.md +212 -0
- package/.claude/commands/explain.md +110 -0
- package/.claude/commands/fix-types.md +238 -0
- package/.claude/commands/refactor.md +184 -0
- package/.claude/commands/review.md +136 -0
- package/.claude/commands/security-check.md +223 -0
- package/.claude/commands/styleguide.md +446 -0
- package/.claude/commands/tdd-feature.md +227 -0
- package/.claude/commands/vibe-check.md +112 -0
- package/.pre-commit-hooks.yaml +77 -0
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/bin/vibe-check.js +19 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +206 -0
- package/dist/cli.js.map +1 -0
- package/dist/eslint-plugin/index.d.ts +66 -0
- package/dist/eslint-plugin/index.d.ts.map +1 -0
- package/dist/eslint-plugin/index.js +67 -0
- package/dist/eslint-plugin/index.js.map +1 -0
- package/dist/eslint-plugin/rules/max-function-length.d.ts +8 -0
- package/dist/eslint-plugin/rules/max-function-length.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/max-function-length.js +69 -0
- package/dist/eslint-plugin/rules/max-function-length.js.map +1 -0
- package/dist/eslint-plugin/rules/no-any-type.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-any-type.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-any-type.js +29 -0
- package/dist/eslint-plugin/rules/no-any-type.js.map +1 -0
- package/dist/eslint-plugin/rules/no-debug-statements.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-debug-statements.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-debug-statements.js +59 -0
- package/dist/eslint-plugin/rules/no-debug-statements.js.map +1 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.js +56 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.js.map +1 -0
- package/dist/eslint-plugin/rules/no-empty-catch.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-empty-catch.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-empty-catch.js +31 -0
- package/dist/eslint-plugin/rules/no-empty-catch.js.map +1 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.js +58 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.js.map +1 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.js +48 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.js.map +1 -0
- package/dist/hooks/check-any-types.d.ts +6 -0
- package/dist/hooks/check-any-types.d.ts.map +1 -0
- package/dist/hooks/check-any-types.js +73 -0
- package/dist/hooks/check-any-types.js.map +1 -0
- package/dist/hooks/check-commented-code.d.ts +6 -0
- package/dist/hooks/check-commented-code.d.ts.map +1 -0
- package/dist/hooks/check-commented-code.js +81 -0
- package/dist/hooks/check-commented-code.js.map +1 -0
- package/dist/hooks/check-console-error.d.ts +6 -0
- package/dist/hooks/check-console-error.d.ts.map +1 -0
- package/dist/hooks/check-console-error.js +41 -0
- package/dist/hooks/check-console-error.js.map +1 -0
- package/dist/hooks/check-debug-statements.d.ts +6 -0
- package/dist/hooks/check-debug-statements.d.ts.map +1 -0
- package/dist/hooks/check-debug-statements.js +120 -0
- package/dist/hooks/check-debug-statements.js.map +1 -0
- package/dist/hooks/check-deep-nesting.d.ts +6 -0
- package/dist/hooks/check-deep-nesting.d.ts.map +1 -0
- package/dist/hooks/check-deep-nesting.js +116 -0
- package/dist/hooks/check-deep-nesting.js.map +1 -0
- package/dist/hooks/check-docker-platform.d.ts +6 -0
- package/dist/hooks/check-docker-platform.d.ts.map +1 -0
- package/dist/hooks/check-docker-platform.js +42 -0
- package/dist/hooks/check-docker-platform.js.map +1 -0
- package/dist/hooks/check-dry-violations.d.ts +6 -0
- package/dist/hooks/check-dry-violations.d.ts.map +1 -0
- package/dist/hooks/check-dry-violations.js +124 -0
- package/dist/hooks/check-dry-violations.js.map +1 -0
- package/dist/hooks/check-empty-catch.d.ts +6 -0
- package/dist/hooks/check-empty-catch.d.ts.map +1 -0
- package/dist/hooks/check-empty-catch.js +111 -0
- package/dist/hooks/check-empty-catch.js.map +1 -0
- package/dist/hooks/check-function-length.d.ts +6 -0
- package/dist/hooks/check-function-length.d.ts.map +1 -0
- package/dist/hooks/check-function-length.js +152 -0
- package/dist/hooks/check-function-length.js.map +1 -0
- package/dist/hooks/check-hardcoded-urls.d.ts +6 -0
- package/dist/hooks/check-hardcoded-urls.d.ts.map +1 -0
- package/dist/hooks/check-hardcoded-urls.js +124 -0
- package/dist/hooks/check-hardcoded-urls.js.map +1 -0
- package/dist/hooks/check-magic-numbers.d.ts +6 -0
- package/dist/hooks/check-magic-numbers.d.ts.map +1 -0
- package/dist/hooks/check-magic-numbers.js +116 -0
- package/dist/hooks/check-magic-numbers.js.map +1 -0
- package/dist/hooks/check-secrets.d.ts +6 -0
- package/dist/hooks/check-secrets.d.ts.map +1 -0
- package/dist/hooks/check-secrets.js +138 -0
- package/dist/hooks/check-secrets.js.map +1 -0
- package/dist/hooks/check-snake-case-ts.d.ts +6 -0
- package/dist/hooks/check-snake-case-ts.d.ts.map +1 -0
- package/dist/hooks/check-snake-case-ts.js +78 -0
- package/dist/hooks/check-snake-case-ts.js.map +1 -0
- package/dist/hooks/check-todo-fixme.d.ts +6 -0
- package/dist/hooks/check-todo-fixme.d.ts.map +1 -0
- package/dist/hooks/check-todo-fixme.js +41 -0
- package/dist/hooks/check-todo-fixme.js.map +1 -0
- package/dist/hooks/check-unsafe-html.d.ts +6 -0
- package/dist/hooks/check-unsafe-html.d.ts.map +1 -0
- package/dist/hooks/check-unsafe-html.js +101 -0
- package/dist/hooks/check-unsafe-html.js.map +1 -0
- package/dist/hooks/index.d.ts +29 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +54 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/lint-staged/config.d.ts +20 -0
- package/dist/lint-staged/config.d.ts.map +1 -0
- package/dist/lint-staged/config.js +27 -0
- package/dist/lint-staged/config.js.map +1 -0
- package/dist/utils/file-reader.d.ts +24 -0
- package/dist/utils/file-reader.d.ts.map +1 -0
- package/dist/utils/file-reader.js +140 -0
- package/dist/utils/file-reader.js.map +1 -0
- package/dist/utils/patterns.d.ts +27 -0
- package/dist/utils/patterns.d.ts.map +1 -0
- package/dist/utils/patterns.js +84 -0
- package/dist/utils/patterns.js.map +1 -0
- package/dist/utils/reporters.d.ts +21 -0
- package/dist/utils/reporters.d.ts.map +1 -0
- package/dist/utils/reporters.js +115 -0
- package/dist/utils/reporters.js.map +1 -0
- package/dist/utils/types.d.ts +71 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +5 -0
- package/dist/utils/types.js.map +1 -0
- package/integrations/cursorrules.template +147 -0
- package/integrations/eslint.config.js +34 -0
- package/integrations/lint-staged.config.js +34 -0
- package/integrations/ruff.toml +125 -0
- package/integrations/vibe-check.yml +116 -0
- package/integrations/vscode-settings.json +127 -0
- package/package.json +81 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint rule: no-empty-catch
|
|
3
|
+
* Disallow empty catch blocks
|
|
4
|
+
*/
|
|
5
|
+
const rule = {
|
|
6
|
+
meta: {
|
|
7
|
+
type: 'problem',
|
|
8
|
+
docs: {
|
|
9
|
+
description: 'Disallow empty catch blocks that silently swallow errors',
|
|
10
|
+
recommended: true,
|
|
11
|
+
},
|
|
12
|
+
messages: {
|
|
13
|
+
emptyCatch: 'Empty catch block - handle or rethrow the error',
|
|
14
|
+
},
|
|
15
|
+
schema: [],
|
|
16
|
+
},
|
|
17
|
+
create(context) {
|
|
18
|
+
return {
|
|
19
|
+
CatchClause(node) {
|
|
20
|
+
if (node.body?.body?.length === 0) {
|
|
21
|
+
context.report({
|
|
22
|
+
node,
|
|
23
|
+
messageId: 'emptyCatch',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export default rule;
|
|
31
|
+
//# sourceMappingURL=no-empty-catch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-empty-catch.js","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-empty-catch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,0DAA0D;YACvE,WAAW,EAAE,IAAI;SAClB;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,iDAAiD;SAC9D;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,WAAW,CAAC,IAAiD;gBAC3D,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,YAAY;qBACxB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-magic-numbers.d.ts","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-magic-numbers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAsDhB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint rule: no-magic-numbers
|
|
3
|
+
* Disallow magic numbers that should be named constants
|
|
4
|
+
*/
|
|
5
|
+
const ACCEPTABLE_NUMBERS = new Set([-1, 0, 1, 2, 10, 100, 1000]);
|
|
6
|
+
const rule = {
|
|
7
|
+
meta: {
|
|
8
|
+
type: 'suggestion',
|
|
9
|
+
docs: {
|
|
10
|
+
description: 'Disallow magic numbers that should be named constants',
|
|
11
|
+
recommended: false,
|
|
12
|
+
},
|
|
13
|
+
messages: {
|
|
14
|
+
magicNumber: 'Magic number {{ value }} - consider using a named constant',
|
|
15
|
+
},
|
|
16
|
+
schema: [
|
|
17
|
+
{
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
ignore: {
|
|
21
|
+
type: 'array',
|
|
22
|
+
items: { type: 'number' },
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
create(context) {
|
|
30
|
+
const options = context.options[0] || {};
|
|
31
|
+
const ignore = new Set([...ACCEPTABLE_NUMBERS, ...(options.ignore || [])]);
|
|
32
|
+
return {
|
|
33
|
+
Literal(node) {
|
|
34
|
+
if (typeof node.value !== 'number')
|
|
35
|
+
return;
|
|
36
|
+
if (ignore.has(node.value))
|
|
37
|
+
return;
|
|
38
|
+
// Skip array indices
|
|
39
|
+
if (node.parent?.type === 'MemberExpression')
|
|
40
|
+
return;
|
|
41
|
+
// Skip variable declarations with UPPER_CASE names
|
|
42
|
+
if (node.parent?.type === 'VariableDeclarator' &&
|
|
43
|
+
node.parent.id?.name?.match(/^[A-Z][A-Z0-9_]*$/)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
context.report({
|
|
47
|
+
node,
|
|
48
|
+
messageId: 'magicNumber',
|
|
49
|
+
data: {
|
|
50
|
+
value: String(node.value),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
export default rule;
|
|
58
|
+
//# sourceMappingURL=no-magic-numbers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-magic-numbers.js","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-magic-numbers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjE,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,uDAAuD;YACpE,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,4DAA4D;SAC1E;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC1B;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3E,OAAO;YACL,OAAO,CAAC,IAAiE;gBACvE,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;oBAAE,OAAO;gBAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO;gBAEnC,qBAAqB;gBACrB,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,kBAAkB;oBAAE,OAAO;gBAErD,mDAAmD;gBACnD,IACE,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,oBAAoB;oBACzC,IAAI,CAAC,MAAqC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,mBAAmB,CAAC,EAChF,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,aAAa;oBACxB,IAAI,EAAE;wBACJ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;qBAC1B;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-snake-case-props.d.ts","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-snake-case-props.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAQnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAsChB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint rule: no-snake-case-props
|
|
3
|
+
* Disallow snake_case property names in TypeScript interfaces
|
|
4
|
+
*/
|
|
5
|
+
const SNAKE_CASE_PATTERN = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)+$/;
|
|
6
|
+
function toCamelCase(snakeCase) {
|
|
7
|
+
return snakeCase.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
8
|
+
}
|
|
9
|
+
const rule = {
|
|
10
|
+
meta: {
|
|
11
|
+
type: 'suggestion',
|
|
12
|
+
docs: {
|
|
13
|
+
description: 'Disallow snake_case property names in TypeScript interfaces',
|
|
14
|
+
recommended: true,
|
|
15
|
+
},
|
|
16
|
+
fixable: 'code',
|
|
17
|
+
messages: {
|
|
18
|
+
snakeCase: 'Property "{{ name }}" uses snake_case - use camelCase "{{ suggested }}" instead',
|
|
19
|
+
},
|
|
20
|
+
schema: [],
|
|
21
|
+
},
|
|
22
|
+
create(context) {
|
|
23
|
+
return {
|
|
24
|
+
TSPropertySignature(node) {
|
|
25
|
+
const nodeAny = node;
|
|
26
|
+
if (nodeAny.key?.type === 'Identifier' && nodeAny.key.name) {
|
|
27
|
+
const name = nodeAny.key.name;
|
|
28
|
+
if (SNAKE_CASE_PATTERN.test(name)) {
|
|
29
|
+
const keyNode = nodeAny.key;
|
|
30
|
+
context.report({
|
|
31
|
+
node: keyNode,
|
|
32
|
+
messageId: 'snakeCase',
|
|
33
|
+
data: {
|
|
34
|
+
name,
|
|
35
|
+
suggested: toCamelCase(name),
|
|
36
|
+
},
|
|
37
|
+
fix(fixer) {
|
|
38
|
+
return fixer.replaceText(keyNode, toCamelCase(name));
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
export default rule;
|
|
48
|
+
//# sourceMappingURL=no-snake-case-props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-snake-case-props.js","sourceRoot":"","sources":["../../../src/eslint-plugin/rules/no-snake-case-props.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAE7D,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,6DAA6D;YAC1E,WAAW,EAAE,IAAI;SAClB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,SAAS,EAAE,iFAAiF;SAC7F;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,mBAAmB,CAAC,IAAe;gBACjC,MAAM,OAAO,GAAG,IAAkD,CAAC;gBACnE,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC9B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAA2B,CAAC;wBACpD,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,OAAO;4BACb,SAAS,EAAE,WAAW;4BACtB,IAAI,EAAE;gCACJ,IAAI;gCACJ,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;6BAC7B;4BACD,GAAG,CAAC,KAAK;gCACP,OAAO,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;4BACvD,CAAC;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-any-types.d.ts","sourceRoot":"","sources":["../../src/hooks/check-any-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,aAAa,EAAE,IA8E3B,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for 'any' type usage in TypeScript
|
|
3
|
+
*/
|
|
4
|
+
export const checkAnyTypes = {
|
|
5
|
+
id: 'any-types',
|
|
6
|
+
name: 'Check Any Types',
|
|
7
|
+
description: 'Detect usage of "any" type in TypeScript',
|
|
8
|
+
severity: 'warning',
|
|
9
|
+
fileTypes: ['ts', 'tsx', 'mts', 'cts'],
|
|
10
|
+
check(context) {
|
|
11
|
+
const results = [];
|
|
12
|
+
const lines = context.content.split('\n');
|
|
13
|
+
// Track if we're in a block comment
|
|
14
|
+
let inBlockComment = false;
|
|
15
|
+
for (let i = 0; i < lines.length; i++) {
|
|
16
|
+
const line = lines[i];
|
|
17
|
+
const lineNum = i + 1;
|
|
18
|
+
// Handle block comments
|
|
19
|
+
if (line.includes('/*')) {
|
|
20
|
+
inBlockComment = true;
|
|
21
|
+
}
|
|
22
|
+
if (line.includes('*/')) {
|
|
23
|
+
inBlockComment = false;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (inBlockComment) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// Skip single-line comments
|
|
30
|
+
if (line.trim().startsWith('//')) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Remove string literals to avoid false positives
|
|
34
|
+
const lineWithoutStrings = line
|
|
35
|
+
.replace(/"[^"]*"/g, '""')
|
|
36
|
+
.replace(/'[^']*'/g, "''")
|
|
37
|
+
.replace(/`[^`]*`/g, '``');
|
|
38
|
+
// Look for 'any' type annotations
|
|
39
|
+
// Matches: : any, : any[], <any>, as any, etc.
|
|
40
|
+
const anyPatterns = [
|
|
41
|
+
/:\s*any\b/, // : any
|
|
42
|
+
/:\s*any\s*\[/, // : any[]
|
|
43
|
+
/:\s*any\s*\|/, // : any |
|
|
44
|
+
/\|\s*any\b/, // | any
|
|
45
|
+
/<\s*any\s*>/, // <any>
|
|
46
|
+
/<\s*any\s*,/, // <any,
|
|
47
|
+
/,\s*any\s*>/, // , any>
|
|
48
|
+
/as\s+any\b/, // as any
|
|
49
|
+
/:\s*Array\s*<\s*any\s*>/, // : Array<any>
|
|
50
|
+
/:\s*Record\s*<\s*[^,]+,\s*any\s*>/, // : Record<..., any>
|
|
51
|
+
];
|
|
52
|
+
for (const pattern of anyPatterns) {
|
|
53
|
+
const match = lineWithoutStrings.match(pattern);
|
|
54
|
+
if (match) {
|
|
55
|
+
// Check if it's disabled via eslint comment
|
|
56
|
+
if (line.includes('eslint-disable') || line.includes('@ts-ignore')) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
results.push({
|
|
60
|
+
line: lineNum,
|
|
61
|
+
column: match.index || 0,
|
|
62
|
+
message: 'Avoid using "any" type - use "unknown" or a specific type instead',
|
|
63
|
+
severity: 'warning',
|
|
64
|
+
ruleId: 'any-types/no-any',
|
|
65
|
+
});
|
|
66
|
+
break; // Only report once per line
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return results;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=check-any-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-any-types.js","sourceRoot":"","sources":["../../src/hooks/check-any-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,0CAA0C;IACvD,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAEtC,KAAK,CAAC,OAAoB;QACxB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,oCAAoC;QACpC,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,wBAAwB;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,cAAc,GAAG,KAAK,CAAC;gBACvB,SAAS;YACX,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YAED,kDAAkD;YAClD,MAAM,kBAAkB,GAAG,IAAI;iBAC5B,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;iBACzB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;iBACzB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAE7B,kCAAkC;YAClC,+CAA+C;YAC/C,MAAM,WAAW,GAAG;gBAClB,WAAW,EAAqB,QAAQ;gBACxC,cAAc,EAAkB,UAAU;gBAC1C,cAAc,EAAkB,UAAU;gBAC1C,YAAY,EAAoB,QAAQ;gBACxC,aAAa,EAAmB,QAAQ;gBACxC,aAAa,EAAmB,QAAQ;gBACxC,aAAa,EAAmB,SAAS;gBACzC,YAAY,EAAoB,SAAS;gBACzC,yBAAyB,EAAO,eAAe;gBAC/C,mCAAmC,EAAE,qBAAqB;aAC3D,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChD,IAAI,KAAK,EAAE,CAAC;oBACV,4CAA4C;oBAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;wBACnE,SAAS;oBACX,CAAC;oBAED,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;wBACxB,OAAO,EAAE,mEAAmE;wBAC5E,QAAQ,EAAE,SAAS;wBACnB,MAAM,EAAE,kBAAkB;qBAC3B,CAAC,CAAC;oBACH,MAAM,CAAC,4BAA4B;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-commented-code.d.ts","sourceRoot":"","sources":["../../src/hooks/check-commented-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAsBvE,eAAO,MAAM,kBAAkB,EAAE,IAwDhC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for commented-out code blocks
|
|
3
|
+
*/
|
|
4
|
+
// Patterns that indicate commented-out code vs regular comments
|
|
5
|
+
const JS_CODE_PATTERNS = [
|
|
6
|
+
/^\s*\/\/\s*(?:const|let|var|function|class|import|export|return|if|else|for|while|try|catch|switch)\b/,
|
|
7
|
+
/^\s*\/\/\s*\w+\s*\([^)]*\)\s*[;{]?\s*$/, // function calls
|
|
8
|
+
/^\s*\/\/\s*\w+\s*=\s*.+[;,]?\s*$/, // assignments
|
|
9
|
+
/^\s*\/\/\s*}\s*(?:else|catch|finally)?\s*{?\s*$/, // closing braces
|
|
10
|
+
/^\s*\/\/\s*\w+\.\w+\s*\(/, // method calls
|
|
11
|
+
/^\s*\/\*\s*(?:const|let|var|function|class|import|export)\b/,
|
|
12
|
+
];
|
|
13
|
+
const PY_CODE_PATTERNS = [
|
|
14
|
+
/^\s*#\s*(?:def|class|import|from|return|if|elif|else|for|while|try|except|with|async)\b/,
|
|
15
|
+
/^\s*#\s*\w+\s*=\s*.+$/, // assignments
|
|
16
|
+
/^\s*#\s*\w+\s*\([^)]*\)\s*$/, // function calls
|
|
17
|
+
/^\s*#\s*\w+\.\w+\s*\(/, // method calls
|
|
18
|
+
];
|
|
19
|
+
// Minimum consecutive commented lines to report
|
|
20
|
+
const MIN_CONSECUTIVE_LINES = 3;
|
|
21
|
+
export const checkCommentedCode = {
|
|
22
|
+
id: 'commented-code',
|
|
23
|
+
name: 'Check Commented Code',
|
|
24
|
+
description: 'Detect commented-out code blocks that should be removed',
|
|
25
|
+
severity: 'info',
|
|
26
|
+
fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'py'],
|
|
27
|
+
check(context) {
|
|
28
|
+
const results = [];
|
|
29
|
+
const lines = context.content.split('\n');
|
|
30
|
+
const language = getLanguage(context.extension);
|
|
31
|
+
const patterns = language === 'python' ? PY_CODE_PATTERNS : JS_CODE_PATTERNS;
|
|
32
|
+
let consecutiveCodeComments = 0;
|
|
33
|
+
let blockStartLine = 0;
|
|
34
|
+
for (let i = 0; i < lines.length; i++) {
|
|
35
|
+
const line = lines[i];
|
|
36
|
+
const lineNum = i + 1;
|
|
37
|
+
// Check if this line looks like commented-out code
|
|
38
|
+
const looksLikeCode = patterns.some((pattern) => pattern.test(line));
|
|
39
|
+
if (looksLikeCode) {
|
|
40
|
+
if (consecutiveCodeComments === 0) {
|
|
41
|
+
blockStartLine = lineNum;
|
|
42
|
+
}
|
|
43
|
+
consecutiveCodeComments++;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// End of potential block
|
|
47
|
+
if (consecutiveCodeComments >= MIN_CONSECUTIVE_LINES) {
|
|
48
|
+
results.push({
|
|
49
|
+
line: blockStartLine,
|
|
50
|
+
column: 0,
|
|
51
|
+
message: `${consecutiveCodeComments} lines of commented-out code - consider removing`,
|
|
52
|
+
severity: 'info',
|
|
53
|
+
ruleId: 'commented-code/block',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
consecutiveCodeComments = 0;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Check for block at end of file
|
|
60
|
+
if (consecutiveCodeComments >= MIN_CONSECUTIVE_LINES) {
|
|
61
|
+
results.push({
|
|
62
|
+
line: blockStartLine,
|
|
63
|
+
column: 0,
|
|
64
|
+
message: `${consecutiveCodeComments} lines of commented-out code - consider removing`,
|
|
65
|
+
severity: 'info',
|
|
66
|
+
ruleId: 'commented-code/block',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return results;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
function getLanguage(ext) {
|
|
73
|
+
if (['js', 'jsx', 'mjs', 'cjs'].includes(ext))
|
|
74
|
+
return 'javascript';
|
|
75
|
+
if (['ts', 'tsx', 'mts', 'cts'].includes(ext))
|
|
76
|
+
return 'typescript';
|
|
77
|
+
if (['py', 'pyw'].includes(ext))
|
|
78
|
+
return 'python';
|
|
79
|
+
return 'unknown';
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=check-commented-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-commented-code.js","sourceRoot":"","sources":["../../src/hooks/check-commented-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-console-error.d.ts","sourceRoot":"","sources":["../../src/hooks/check-console-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,iBAAiB,EAAE,IA0C/B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for console.error usage that might need proper error handling
|
|
3
|
+
*/
|
|
4
|
+
export const checkConsoleError = {
|
|
5
|
+
id: 'console-error',
|
|
6
|
+
name: 'Check Console Error',
|
|
7
|
+
description: 'Detect console.error that might need proper error handling',
|
|
8
|
+
severity: 'info',
|
|
9
|
+
fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs'],
|
|
10
|
+
check(context) {
|
|
11
|
+
const results = [];
|
|
12
|
+
const lines = context.content.split('\n');
|
|
13
|
+
for (let i = 0; i < lines.length; i++) {
|
|
14
|
+
const line = lines[i];
|
|
15
|
+
const lineNum = i + 1;
|
|
16
|
+
// Skip comment lines
|
|
17
|
+
if (line.trim().startsWith('//') || line.trim().startsWith('*')) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
// Look for console.error
|
|
21
|
+
const match = line.match(/console\.error\s*\(/);
|
|
22
|
+
if (match) {
|
|
23
|
+
// Check if it's in a catch block (look at nearby lines)
|
|
24
|
+
const nearbyLines = lines.slice(Math.max(0, i - 5), i + 1).join('\n');
|
|
25
|
+
const inCatchBlock = /catch\s*\([^)]*\)\s*\{/.test(nearbyLines);
|
|
26
|
+
if (inCatchBlock) {
|
|
27
|
+
// In a catch block - suggest proper error handling
|
|
28
|
+
results.push({
|
|
29
|
+
line: lineNum,
|
|
30
|
+
column: match.index || 0,
|
|
31
|
+
message: 'console.error in catch block - consider using a logging service or rethrowing',
|
|
32
|
+
severity: 'info',
|
|
33
|
+
ruleId: 'console-error/in-catch',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return results;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=check-console-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-console-error.js","sourceRoot":"","sources":["../../src/hooks/check-console-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,4DAA4D;IACzE,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAEnD,KAAK,CAAC,OAAoB;QACxB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,qBAAqB;YACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChE,SAAS;YACX,CAAC;YAED,yBAAyB;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAI,KAAK,EAAE,CAAC;gBACV,wDAAwD;gBACxD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtE,MAAM,YAAY,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAEhE,IAAI,YAAY,EAAE,CAAC;oBACjB,mDAAmD;oBACnD,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;wBACxB,OAAO,EAAE,+EAA+E;wBACxF,QAAQ,EAAE,MAAM;wBAChB,MAAM,EAAE,wBAAwB;qBACjC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-debug-statements.d.ts","sourceRoot":"","sources":["../../src/hooks/check-debug-statements.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAGvE,eAAO,MAAM,oBAAoB,EAAE,IA0ElC,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for debug statements that should be removed before commit
|
|
3
|
+
*/
|
|
4
|
+
import { DEBUG_PATTERNS } from '../utils/patterns.js';
|
|
5
|
+
export const checkDebugStatements = {
|
|
6
|
+
id: 'debug',
|
|
7
|
+
name: 'Check Debug Statements',
|
|
8
|
+
description: 'Detect console.log, print(), debugger, and other debug statements',
|
|
9
|
+
severity: 'warning',
|
|
10
|
+
fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'py'],
|
|
11
|
+
check(context) {
|
|
12
|
+
const results = [];
|
|
13
|
+
const lines = context.content.split('\n');
|
|
14
|
+
// Get patterns for this language
|
|
15
|
+
const language = getLanguageFromExtension(context.extension);
|
|
16
|
+
const patterns = DEBUG_PATTERNS[language] || [];
|
|
17
|
+
if (patterns.length === 0) {
|
|
18
|
+
return results;
|
|
19
|
+
}
|
|
20
|
+
// Track if we're inside a multi-line comment
|
|
21
|
+
let inBlockComment = false;
|
|
22
|
+
for (let i = 0; i < lines.length; i++) {
|
|
23
|
+
const line = lines[i];
|
|
24
|
+
const lineNum = i + 1;
|
|
25
|
+
// Handle block comments for JS/TS
|
|
26
|
+
if (['javascript', 'typescript'].includes(language)) {
|
|
27
|
+
if (line.includes('/*') && !line.includes('*/')) {
|
|
28
|
+
inBlockComment = true;
|
|
29
|
+
}
|
|
30
|
+
if (line.includes('*/')) {
|
|
31
|
+
inBlockComment = false;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (inBlockComment) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Skip single-line comments
|
|
39
|
+
if (isCommentLine(line, language)) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Check each pattern
|
|
43
|
+
for (const pattern of patterns) {
|
|
44
|
+
const match = line.match(pattern);
|
|
45
|
+
if (match) {
|
|
46
|
+
const patternType = getPatternType(pattern.source, language);
|
|
47
|
+
// Skip console.error and console.warn - these are often intentional
|
|
48
|
+
if (patternType === 'console' && /console\.(error|warn)\s*\(/.test(line)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Skip if explicitly marked to keep
|
|
52
|
+
if (line.includes('// eslint-disable') || line.includes('# noqa')) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
results.push({
|
|
56
|
+
line: lineNum,
|
|
57
|
+
column: match.index || 0,
|
|
58
|
+
message: getDebugMessage(patternType, language),
|
|
59
|
+
severity: 'warning',
|
|
60
|
+
ruleId: `debug/${patternType}`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return results;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
function getLanguageFromExtension(ext) {
|
|
69
|
+
if (['js', 'jsx', 'mjs', 'cjs'].includes(ext))
|
|
70
|
+
return 'javascript';
|
|
71
|
+
if (['ts', 'tsx', 'mts', 'cts'].includes(ext))
|
|
72
|
+
return 'typescript';
|
|
73
|
+
if (['py', 'pyw'].includes(ext))
|
|
74
|
+
return 'python';
|
|
75
|
+
return 'unknown';
|
|
76
|
+
}
|
|
77
|
+
function isCommentLine(line, language) {
|
|
78
|
+
const trimmed = line.trim();
|
|
79
|
+
if (['javascript', 'typescript'].includes(language)) {
|
|
80
|
+
return trimmed.startsWith('//') || trimmed.startsWith('*');
|
|
81
|
+
}
|
|
82
|
+
if (language === 'python') {
|
|
83
|
+
return trimmed.startsWith('#');
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
function getPatternType(patternSource, _language) {
|
|
88
|
+
if (patternSource.includes('console'))
|
|
89
|
+
return 'console';
|
|
90
|
+
if (patternSource.includes('debugger'))
|
|
91
|
+
return 'debugger';
|
|
92
|
+
if (patternSource.includes('alert'))
|
|
93
|
+
return 'alert';
|
|
94
|
+
if (patternSource.includes('print'))
|
|
95
|
+
return 'print';
|
|
96
|
+
if (patternSource.includes('breakpoint'))
|
|
97
|
+
return 'breakpoint';
|
|
98
|
+
if (patternSource.includes('pdb') || patternSource.includes('ipdb'))
|
|
99
|
+
return 'pdb';
|
|
100
|
+
return 'debug';
|
|
101
|
+
}
|
|
102
|
+
function getDebugMessage(patternType, _language) {
|
|
103
|
+
switch (patternType) {
|
|
104
|
+
case 'console':
|
|
105
|
+
return 'console.log() statement - remove before commit';
|
|
106
|
+
case 'debugger':
|
|
107
|
+
return 'debugger statement - remove before commit';
|
|
108
|
+
case 'alert':
|
|
109
|
+
return 'alert() statement - remove before commit';
|
|
110
|
+
case 'print':
|
|
111
|
+
return 'print() statement - use proper logging instead';
|
|
112
|
+
case 'breakpoint':
|
|
113
|
+
return 'breakpoint() - remove before commit';
|
|
114
|
+
case 'pdb':
|
|
115
|
+
return 'pdb debugger - remove before commit';
|
|
116
|
+
default:
|
|
117
|
+
return 'Debug statement - remove before commit';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=check-debug-statements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-debug-statements.js","sourceRoot":"","sources":["../../src/hooks/check-debug-statements.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-deep-nesting.d.ts","sourceRoot":"","sources":["../../src/hooks/check-deep-nesting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAIvE,eAAO,MAAM,gBAAgB,EAAE,IAmB9B,CAAC"}
|