@aiready/consistency 0.8.1 → 0.8.5
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/.turbo/turbo-build.log +8 -8
- package/.turbo/turbo-test.log +12 -40
- package/dist/__tests__/analyzer.test.d.ts +2 -0
- package/dist/__tests__/analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/analyzer.test.js +157 -0
- package/dist/__tests__/analyzer.test.js.map +1 -0
- package/dist/__tests__/language-filter.test.d.ts +2 -0
- package/dist/__tests__/language-filter.test.d.ts.map +1 -0
- package/dist/__tests__/language-filter.test.js +46 -0
- package/dist/__tests__/language-filter.test.js.map +1 -0
- package/dist/__tests__/scoring.test.d.ts +2 -0
- package/dist/__tests__/scoring.test.d.ts.map +1 -0
- package/dist/__tests__/scoring.test.js +118 -0
- package/dist/__tests__/scoring.test.js.map +1 -0
- package/dist/analyzer.d.ts +7 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +160 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/analyzers/naming-ast.d.ts +7 -0
- package/dist/analyzers/naming-ast.d.ts.map +1 -0
- package/dist/analyzers/naming-ast.js +253 -0
- package/dist/analyzers/naming-ast.js.map +1 -0
- package/dist/analyzers/naming-constants.d.ts +21 -0
- package/dist/analyzers/naming-constants.d.ts.map +1 -0
- package/dist/analyzers/naming-constants.js +96 -0
- package/dist/analyzers/naming-constants.js.map +1 -0
- package/dist/analyzers/naming-python.d.ts +16 -0
- package/dist/analyzers/naming-python.d.ts.map +1 -0
- package/dist/analyzers/naming-python.js +165 -0
- package/dist/analyzers/naming-python.js.map +1 -0
- package/dist/analyzers/naming.d.ts +6 -0
- package/dist/analyzers/naming.d.ts.map +1 -0
- package/dist/analyzers/naming.js +234 -0
- package/dist/analyzers/naming.js.map +1 -0
- package/dist/analyzers/patterns.d.ts +10 -0
- package/dist/analyzers/patterns.d.ts.map +1 -0
- package/dist/analyzers/patterns.js +197 -0
- package/dist/analyzers/patterns.js.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/scoring.d.ts +12 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +110 -0
- package/dist/scoring.js.map +1 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ast-parser.d.ts +46 -0
- package/dist/utils/ast-parser.d.ts.map +1 -0
- package/dist/utils/ast-parser.js +157 -0
- package/dist/utils/ast-parser.js.map +1 -0
- package/dist/utils/config-loader.d.ts +19 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +31 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/context-detector.d.ts +40 -0
- package/dist/utils/context-detector.d.ts.map +1 -0
- package/dist/utils/context-detector.js +225 -0
- package/dist/utils/context-detector.js.map +1 -0
- package/dist/utils/scope-tracker.d.ts +87 -0
- package/dist/utils/scope-tracker.d.ts.map +1 -0
- package/dist/utils/scope-tracker.js +161 -0
- package/dist/utils/scope-tracker.js.map +1 -0
- package/package.json +2 -2
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ScanOptions, AnalysisResult, Issue } from '@aiready/core';
|
|
2
|
+
export interface ConsistencyOptions extends ScanOptions {
|
|
3
|
+
/** Check naming conventions and quality */
|
|
4
|
+
checkNaming?: boolean;
|
|
5
|
+
/** Check code pattern consistency */
|
|
6
|
+
checkPatterns?: boolean;
|
|
7
|
+
/** Check architectural consistency */
|
|
8
|
+
checkArchitecture?: boolean;
|
|
9
|
+
/** Minimum severity to report */
|
|
10
|
+
minSeverity?: 'info' | 'minor' | 'major' | 'critical';
|
|
11
|
+
}
|
|
12
|
+
export interface ConsistencyIssue extends Issue {
|
|
13
|
+
type: 'naming-inconsistency' | 'naming-quality' | 'pattern-inconsistency' | 'architecture-inconsistency';
|
|
14
|
+
category: 'naming' | 'patterns' | 'architecture';
|
|
15
|
+
/** Examples of the inconsistency found */
|
|
16
|
+
examples?: string[];
|
|
17
|
+
/** Suggested fix or convention to follow */
|
|
18
|
+
suggestion?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface NamingIssue {
|
|
21
|
+
file: string;
|
|
22
|
+
line: number;
|
|
23
|
+
column?: number;
|
|
24
|
+
type: 'poor-naming' | 'convention-mix' | 'abbreviation' | 'unclear';
|
|
25
|
+
identifier: string;
|
|
26
|
+
suggestion?: string;
|
|
27
|
+
severity: 'critical' | 'major' | 'minor' | 'info';
|
|
28
|
+
}
|
|
29
|
+
export interface PatternIssue {
|
|
30
|
+
files: string[];
|
|
31
|
+
type: 'error-handling' | 'async-style' | 'import-style' | 'api-design';
|
|
32
|
+
description: string;
|
|
33
|
+
examples: string[];
|
|
34
|
+
severity: 'critical' | 'major' | 'minor' | 'info';
|
|
35
|
+
}
|
|
36
|
+
export interface ArchitectureIssue {
|
|
37
|
+
type: 'file-organization' | 'module-structure' | 'export-style';
|
|
38
|
+
description: string;
|
|
39
|
+
affectedPaths: string[];
|
|
40
|
+
severity: 'critical' | 'major' | 'minor' | 'info';
|
|
41
|
+
}
|
|
42
|
+
export interface ConsistencyReport {
|
|
43
|
+
summary: {
|
|
44
|
+
totalIssues: number;
|
|
45
|
+
namingIssues: number;
|
|
46
|
+
patternIssues: number;
|
|
47
|
+
architectureIssues: number;
|
|
48
|
+
filesAnalyzed: number;
|
|
49
|
+
};
|
|
50
|
+
results: AnalysisResult[];
|
|
51
|
+
recommendations: string[];
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qCAAqC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;CACvD;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK;IAC7C,IAAI,EACA,sBAAsB,GACtB,gBAAgB,GAChB,uBAAuB,GACvB,4BAA4B,CAAC;IACjC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;IACjD,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { TSESTree } from '@typescript-eslint/typescript-estree';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a file into an AST
|
|
4
|
+
* Only supports TypeScript/JavaScript files (.ts, .tsx, .js, .jsx)
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseFile(filePath: string, content?: string): TSESTree.Program | null;
|
|
7
|
+
/**
|
|
8
|
+
* Traverse AST nodes with a visitor pattern
|
|
9
|
+
*/
|
|
10
|
+
export declare function traverseAST(node: TSESTree.Node, visitor: {
|
|
11
|
+
enter?: (node: TSESTree.Node, parent: TSESTree.Node | null) => void;
|
|
12
|
+
leave?: (node: TSESTree.Node, parent: TSESTree.Node | null) => void;
|
|
13
|
+
}, parent?: TSESTree.Node | null): void;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a node is within a specific type of ancestor
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasAncestor(node: TSESTree.Node, ancestorTypes: string[], ancestors: TSESTree.Node[]): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Get the name of an identifier or pattern
|
|
20
|
+
*/
|
|
21
|
+
export declare function getIdentifierName(node: TSESTree.Node): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a node is a loop
|
|
24
|
+
*/
|
|
25
|
+
export declare function isLoopStatement(node: TSESTree.Node): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a node is an arrow function or callback
|
|
28
|
+
*/
|
|
29
|
+
export declare function isCallback(node: TSESTree.Node): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Extract function/method name from various declaration types
|
|
32
|
+
*/
|
|
33
|
+
export declare function getFunctionName(node: TSESTree.Node): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a variable declaration is in a destructuring pattern
|
|
36
|
+
*/
|
|
37
|
+
export declare function isInDestructuring(node: TSESTree.Node): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get the line number from a node
|
|
40
|
+
*/
|
|
41
|
+
export declare function getLineNumber(node: TSESTree.Node): number;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a node represents a coverage metric context
|
|
44
|
+
*/
|
|
45
|
+
export declare function isCoverageContext(node: TSESTree.Node, ancestors: TSESTree.Node[]): boolean;
|
|
46
|
+
//# sourceMappingURL=ast-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser.d.ts","sourceRoot":"","sources":["../../src/utils/ast-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGvE;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAsBrF;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACpE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CACrE,EACD,MAAM,GAAE,QAAQ,CAAC,IAAI,GAAG,IAAW,GAClC,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,GACzB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,CAKpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAQ5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAQvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,CAgBlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAI9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,OAAO,CA8B1F"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { parse } from '@typescript-eslint/typescript-estree';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* Parse a file into an AST
|
|
5
|
+
* Only supports TypeScript/JavaScript files (.ts, .tsx, .js, .jsx)
|
|
6
|
+
*/
|
|
7
|
+
export function parseFile(filePath, content) {
|
|
8
|
+
try {
|
|
9
|
+
const code = content ?? readFileSync(filePath, 'utf-8');
|
|
10
|
+
const isTypeScript = filePath.match(/\.tsx?$/);
|
|
11
|
+
return parse(code, {
|
|
12
|
+
jsx: filePath.match(/\.[jt]sx$/i) !== null,
|
|
13
|
+
loc: true,
|
|
14
|
+
range: true,
|
|
15
|
+
comment: false,
|
|
16
|
+
tokens: false,
|
|
17
|
+
// Relaxed parsing for JavaScript files
|
|
18
|
+
sourceType: 'module',
|
|
19
|
+
ecmaVersion: 'latest',
|
|
20
|
+
// Only use TypeScript parser features for .ts/.tsx files
|
|
21
|
+
filePath: isTypeScript ? filePath : undefined,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
// Silently skip files that fail to parse (likely non-JS/TS or syntax errors)
|
|
26
|
+
// Non-JS/TS files should be filtered before reaching this point
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Traverse AST nodes with a visitor pattern
|
|
32
|
+
*/
|
|
33
|
+
export function traverseAST(node, visitor, parent = null) {
|
|
34
|
+
if (!node)
|
|
35
|
+
return;
|
|
36
|
+
visitor.enter?.(node, parent);
|
|
37
|
+
// Visit children
|
|
38
|
+
for (const key of Object.keys(node)) {
|
|
39
|
+
const value = node[key];
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
for (const child of value) {
|
|
42
|
+
if (child && typeof child === 'object' && 'type' in child) {
|
|
43
|
+
traverseAST(child, visitor, node);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (value && typeof value === 'object' && 'type' in value) {
|
|
48
|
+
traverseAST(value, visitor, node);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
visitor.leave?.(node, parent);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if a node is within a specific type of ancestor
|
|
55
|
+
*/
|
|
56
|
+
export function hasAncestor(node, ancestorTypes, ancestors) {
|
|
57
|
+
return ancestors.some(ancestor => ancestorTypes.includes(ancestor.type));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get the name of an identifier or pattern
|
|
61
|
+
*/
|
|
62
|
+
export function getIdentifierName(node) {
|
|
63
|
+
if (node.type === 'Identifier') {
|
|
64
|
+
return node.name;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if a node is a loop
|
|
70
|
+
*/
|
|
71
|
+
export function isLoopStatement(node) {
|
|
72
|
+
return [
|
|
73
|
+
'ForStatement',
|
|
74
|
+
'ForInStatement',
|
|
75
|
+
'ForOfStatement',
|
|
76
|
+
'WhileStatement',
|
|
77
|
+
'DoWhileStatement',
|
|
78
|
+
].includes(node.type);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Check if a node is an arrow function or callback
|
|
82
|
+
*/
|
|
83
|
+
export function isCallback(node) {
|
|
84
|
+
if (node.type === 'ArrowFunctionExpression') {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
if (node.type === 'FunctionExpression') {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract function/method name from various declaration types
|
|
94
|
+
*/
|
|
95
|
+
export function getFunctionName(node) {
|
|
96
|
+
switch (node.type) {
|
|
97
|
+
case 'FunctionDeclaration':
|
|
98
|
+
return node.id?.name ?? null;
|
|
99
|
+
case 'FunctionExpression':
|
|
100
|
+
return node.id?.name ?? null;
|
|
101
|
+
case 'ArrowFunctionExpression':
|
|
102
|
+
return null; // Arrow functions don't have names directly
|
|
103
|
+
case 'MethodDefinition':
|
|
104
|
+
if (node.key.type === 'Identifier') {
|
|
105
|
+
return node.key.name;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
default:
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if a variable declaration is in a destructuring pattern
|
|
114
|
+
*/
|
|
115
|
+
export function isInDestructuring(node) {
|
|
116
|
+
if (!node)
|
|
117
|
+
return false;
|
|
118
|
+
return node.type === 'ObjectPattern' || node.type === 'ArrayPattern';
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get the line number from a node
|
|
122
|
+
*/
|
|
123
|
+
export function getLineNumber(node) {
|
|
124
|
+
return node.loc?.start.line ?? 0;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if a node represents a coverage metric context
|
|
128
|
+
*/
|
|
129
|
+
export function isCoverageContext(node, ancestors) {
|
|
130
|
+
// Check if any ancestor or the node itself references coverage-related properties
|
|
131
|
+
const coveragePatterns = /coverage|summary|metrics|pct|percent|statements|branches|functions|lines/i;
|
|
132
|
+
// Check variable name
|
|
133
|
+
if (node.type === 'Identifier' && coveragePatterns.test(node.name)) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
// Check if it's a property of something coverage-related
|
|
137
|
+
for (const ancestor of ancestors.slice(-3)) { // Check last 3 ancestors
|
|
138
|
+
if (ancestor.type === 'MemberExpression') {
|
|
139
|
+
const memberExpr = ancestor;
|
|
140
|
+
if (memberExpr.object.type === 'Identifier' && coveragePatterns.test(memberExpr.object.name)) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (ancestor.type === 'ObjectPattern' || ancestor.type === 'ObjectExpression') {
|
|
145
|
+
// Check if parent variable has coverage-related name
|
|
146
|
+
const parent = ancestors[ancestors.indexOf(ancestor) - 1];
|
|
147
|
+
if (parent?.type === 'VariableDeclarator') {
|
|
148
|
+
const varDecl = parent;
|
|
149
|
+
if (varDecl.id.type === 'Identifier' && coveragePatterns.test(varDecl.id.name)) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=ast-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../src/utils/ast-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for naming analyzers
|
|
3
|
+
*/
|
|
4
|
+
export interface NamingConfig {
|
|
5
|
+
customAbbreviations: Set<string>;
|
|
6
|
+
customShortWords: Set<string>;
|
|
7
|
+
disabledChecks: Set<string>;
|
|
8
|
+
allAbbreviations: Set<string>;
|
|
9
|
+
allShortWords: Set<string>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Loads and merges naming configuration for consistency analyzers
|
|
13
|
+
* Extracts common config loading logic used by both naming.ts and naming-ast.ts
|
|
14
|
+
*
|
|
15
|
+
* @param files - Array of files being analyzed (used to determine project root)
|
|
16
|
+
* @returns Merged configuration with custom and default abbreviations/short words
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadNamingConfig(files: string[]): Promise<NamingConfig>;
|
|
19
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAsB7E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { loadConfig } from '@aiready/core';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import { COMMON_SHORT_WORDS, ACCEPTABLE_ABBREVIATIONS, } from '../analyzers/naming-constants';
|
|
4
|
+
/**
|
|
5
|
+
* Loads and merges naming configuration for consistency analyzers
|
|
6
|
+
* Extracts common config loading logic used by both naming.ts and naming-ast.ts
|
|
7
|
+
*
|
|
8
|
+
* @param files - Array of files being analyzed (used to determine project root)
|
|
9
|
+
* @returns Merged configuration with custom and default abbreviations/short words
|
|
10
|
+
*/
|
|
11
|
+
export async function loadNamingConfig(files) {
|
|
12
|
+
// Load config from the first file's directory (or project root)
|
|
13
|
+
const rootDir = files.length > 0 ? dirname(files[0]) : process.cwd();
|
|
14
|
+
const config = await loadConfig(rootDir);
|
|
15
|
+
const consistencyConfig = config?.tools?.['consistency'];
|
|
16
|
+
// Extract custom configuration
|
|
17
|
+
const customAbbreviations = new Set(consistencyConfig?.acceptedAbbreviations || []);
|
|
18
|
+
const customShortWords = new Set(consistencyConfig?.shortWords || []);
|
|
19
|
+
const disabledChecks = new Set(consistencyConfig?.disableChecks || []);
|
|
20
|
+
// Merge with defaults
|
|
21
|
+
const allAbbreviations = new Set([...ACCEPTABLE_ABBREVIATIONS, ...customAbbreviations]);
|
|
22
|
+
const allShortWords = new Set([...COMMON_SHORT_WORDS, ...customShortWords]);
|
|
23
|
+
return {
|
|
24
|
+
customAbbreviations,
|
|
25
|
+
customShortWords,
|
|
26
|
+
disabledChecks,
|
|
27
|
+
allAbbreviations,
|
|
28
|
+
allShortWords,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAavC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe;IACpD,gEAAgE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,iBAAiB,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC;IAEzD,+BAA+B;IAC/B,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IAEvE,sBAAsB;IACtB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,wBAAwB,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAE5E,OAAO;QACL,mBAAmB;QACnB,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,aAAa;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { TSESTree } from '@typescript-eslint/typescript-estree';
|
|
2
|
+
export type FileType = 'test' | 'production' | 'config' | 'types';
|
|
3
|
+
export type CodeLayer = 'api' | 'business' | 'data' | 'utility' | 'unknown';
|
|
4
|
+
export interface CodeContext {
|
|
5
|
+
fileType: FileType;
|
|
6
|
+
codeLayer: CodeLayer;
|
|
7
|
+
complexity: number;
|
|
8
|
+
isTestFile: boolean;
|
|
9
|
+
isTypeDefinition: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Detect the file type based on file path and content
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectFileType(filePath: string, ast: TSESTree.Program): FileType;
|
|
15
|
+
/**
|
|
16
|
+
* Detect the code layer based on imports and exports
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectCodeLayer(ast: TSESTree.Program): CodeLayer;
|
|
19
|
+
/**
|
|
20
|
+
* Calculate cyclomatic complexity for a function
|
|
21
|
+
*/
|
|
22
|
+
export declare function calculateComplexity(node: TSESTree.Node): number;
|
|
23
|
+
/**
|
|
24
|
+
* Build a complete context for a file
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildCodeContext(filePath: string, ast: TSESTree.Program): CodeContext;
|
|
27
|
+
/**
|
|
28
|
+
* Get context-adjusted severity based on code context
|
|
29
|
+
*/
|
|
30
|
+
export declare function adjustSeverity(baseSeverity: 'info' | 'minor' | 'major' | 'critical', context: CodeContext, issueType: string): 'info' | 'minor' | 'major' | 'critical';
|
|
31
|
+
/**
|
|
32
|
+
* Check if a short variable name is acceptable in this context
|
|
33
|
+
*/
|
|
34
|
+
export declare function isAcceptableInContext(name: string, context: CodeContext, options: {
|
|
35
|
+
isLoopVariable?: boolean;
|
|
36
|
+
isParameter?: boolean;
|
|
37
|
+
isDestructured?: boolean;
|
|
38
|
+
complexity?: number;
|
|
39
|
+
}): boolean;
|
|
40
|
+
//# sourceMappingURL=context-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-detector.d.ts","sourceRoot":"","sources":["../../src/utils/context-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGhE,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAmBhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAgFhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CA6B/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG,WAAW,CA8BrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,EACrD,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CA6BzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IACP,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAmCT"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { traverseAST } from './ast-parser';
|
|
2
|
+
/**
|
|
3
|
+
* Detect the file type based on file path and content
|
|
4
|
+
*/
|
|
5
|
+
export function detectFileType(filePath, ast) {
|
|
6
|
+
const path = filePath.toLowerCase();
|
|
7
|
+
// Test files
|
|
8
|
+
if (path.match(/\.(test|spec)\.(ts|tsx|js|jsx)$/) || path.includes('__tests__')) {
|
|
9
|
+
return 'test';
|
|
10
|
+
}
|
|
11
|
+
// Type definition files
|
|
12
|
+
if (path.endsWith('.d.ts') || path.includes('types')) {
|
|
13
|
+
return 'types';
|
|
14
|
+
}
|
|
15
|
+
// Config files
|
|
16
|
+
if (path.match(/config|\.config\.|rc\.|setup/) || path.includes('configuration')) {
|
|
17
|
+
return 'config';
|
|
18
|
+
}
|
|
19
|
+
return 'production';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Detect the code layer based on imports and exports
|
|
23
|
+
*/
|
|
24
|
+
export function detectCodeLayer(ast) {
|
|
25
|
+
let hasAPIIndicators = 0;
|
|
26
|
+
let hasBusinessIndicators = 0;
|
|
27
|
+
let hasDataIndicators = 0;
|
|
28
|
+
let hasUtilityIndicators = 0;
|
|
29
|
+
traverseAST(ast, {
|
|
30
|
+
enter: (node) => {
|
|
31
|
+
// Check imports
|
|
32
|
+
if (node.type === 'ImportDeclaration') {
|
|
33
|
+
const source = node.source.value;
|
|
34
|
+
if (source.match(/express|fastify|koa|@nestjs|axios|fetch|http/i)) {
|
|
35
|
+
hasAPIIndicators++;
|
|
36
|
+
}
|
|
37
|
+
if (source.match(/database|prisma|typeorm|sequelize|mongoose|pg|mysql/i)) {
|
|
38
|
+
hasDataIndicators++;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Check function names for layer indicators
|
|
42
|
+
if (node.type === 'FunctionDeclaration' && node.id) {
|
|
43
|
+
const name = node.id.name;
|
|
44
|
+
// API layer patterns
|
|
45
|
+
if (name.match(/^(get|post|put|delete|patch|handle|api|route|controller)/i)) {
|
|
46
|
+
hasAPIIndicators++;
|
|
47
|
+
}
|
|
48
|
+
// Business logic patterns
|
|
49
|
+
if (name.match(/^(calculate|process|validate|transform|compute|analyze)/i)) {
|
|
50
|
+
hasBusinessIndicators++;
|
|
51
|
+
}
|
|
52
|
+
// Data layer patterns
|
|
53
|
+
if (name.match(/^(find|create|update|delete|save|fetch|query|insert)/i)) {
|
|
54
|
+
hasDataIndicators++;
|
|
55
|
+
}
|
|
56
|
+
// Utility patterns
|
|
57
|
+
if (name.match(/^(format|parse|convert|normalize|sanitize|encode|decode)/i)) {
|
|
58
|
+
hasUtilityIndicators++;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Check for exports
|
|
62
|
+
if (node.type === 'ExportNamedDeclaration' || node.type === 'ExportDefaultDeclaration') {
|
|
63
|
+
// Functions exported with "api", "handler", "route" suggest API layer
|
|
64
|
+
if (node.type === 'ExportNamedDeclaration' && node.declaration) {
|
|
65
|
+
if (node.declaration.type === 'FunctionDeclaration' && node.declaration.id) {
|
|
66
|
+
const name = node.declaration.id.name;
|
|
67
|
+
if (name.match(/handler|route|api|controller/i)) {
|
|
68
|
+
hasAPIIndicators += 2; // Stronger signal
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
// Determine layer based on indicators
|
|
76
|
+
const scores = {
|
|
77
|
+
api: hasAPIIndicators,
|
|
78
|
+
business: hasBusinessIndicators,
|
|
79
|
+
data: hasDataIndicators,
|
|
80
|
+
utility: hasUtilityIndicators,
|
|
81
|
+
};
|
|
82
|
+
const maxScore = Math.max(...Object.values(scores));
|
|
83
|
+
if (maxScore === 0) {
|
|
84
|
+
return 'unknown';
|
|
85
|
+
}
|
|
86
|
+
// Return the layer with highest score
|
|
87
|
+
if (scores.api === maxScore)
|
|
88
|
+
return 'api';
|
|
89
|
+
if (scores.data === maxScore)
|
|
90
|
+
return 'data';
|
|
91
|
+
if (scores.business === maxScore)
|
|
92
|
+
return 'business';
|
|
93
|
+
if (scores.utility === maxScore)
|
|
94
|
+
return 'utility';
|
|
95
|
+
return 'unknown';
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Calculate cyclomatic complexity for a function
|
|
99
|
+
*/
|
|
100
|
+
export function calculateComplexity(node) {
|
|
101
|
+
let complexity = 1; // Base complexity
|
|
102
|
+
traverseAST(node, {
|
|
103
|
+
enter: (childNode) => {
|
|
104
|
+
// Each decision point adds 1 to complexity
|
|
105
|
+
switch (childNode.type) {
|
|
106
|
+
case 'IfStatement':
|
|
107
|
+
case 'ConditionalExpression': // ternary
|
|
108
|
+
case 'SwitchCase':
|
|
109
|
+
case 'ForStatement':
|
|
110
|
+
case 'ForInStatement':
|
|
111
|
+
case 'ForOfStatement':
|
|
112
|
+
case 'WhileStatement':
|
|
113
|
+
case 'DoWhileStatement':
|
|
114
|
+
case 'CatchClause':
|
|
115
|
+
complexity++;
|
|
116
|
+
break;
|
|
117
|
+
case 'LogicalExpression':
|
|
118
|
+
// && and || add complexity
|
|
119
|
+
if (childNode.operator === '&&' || childNode.operator === '||') {
|
|
120
|
+
complexity++;
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
return complexity;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Build a complete context for a file
|
|
130
|
+
*/
|
|
131
|
+
export function buildCodeContext(filePath, ast) {
|
|
132
|
+
const fileType = detectFileType(filePath, ast);
|
|
133
|
+
const codeLayer = detectCodeLayer(ast);
|
|
134
|
+
// Calculate average complexity of functions in file
|
|
135
|
+
let totalComplexity = 0;
|
|
136
|
+
let functionCount = 0;
|
|
137
|
+
traverseAST(ast, {
|
|
138
|
+
enter: (node) => {
|
|
139
|
+
if (node.type === 'FunctionDeclaration' ||
|
|
140
|
+
node.type === 'FunctionExpression' ||
|
|
141
|
+
node.type === 'ArrowFunctionExpression') {
|
|
142
|
+
totalComplexity += calculateComplexity(node);
|
|
143
|
+
functionCount++;
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
const avgComplexity = functionCount > 0 ? totalComplexity / functionCount : 1;
|
|
148
|
+
return {
|
|
149
|
+
fileType,
|
|
150
|
+
codeLayer,
|
|
151
|
+
complexity: Math.round(avgComplexity),
|
|
152
|
+
isTestFile: fileType === 'test',
|
|
153
|
+
isTypeDefinition: fileType === 'types',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get context-adjusted severity based on code context
|
|
158
|
+
*/
|
|
159
|
+
export function adjustSeverity(baseSeverity, context, issueType) {
|
|
160
|
+
// Test files: Be more lenient
|
|
161
|
+
if (context.isTestFile) {
|
|
162
|
+
if (baseSeverity === 'minor')
|
|
163
|
+
return 'info';
|
|
164
|
+
if (baseSeverity === 'major')
|
|
165
|
+
return 'minor';
|
|
166
|
+
}
|
|
167
|
+
// Type definition files: Be more lenient (often use short generic names)
|
|
168
|
+
if (context.isTypeDefinition) {
|
|
169
|
+
if (baseSeverity === 'minor')
|
|
170
|
+
return 'info';
|
|
171
|
+
}
|
|
172
|
+
// API layer: Be stricter (public interface)
|
|
173
|
+
if (context.codeLayer === 'api') {
|
|
174
|
+
if (baseSeverity === 'info' && issueType === 'unclear')
|
|
175
|
+
return 'minor';
|
|
176
|
+
if (baseSeverity === 'minor' && issueType === 'unclear')
|
|
177
|
+
return 'major';
|
|
178
|
+
}
|
|
179
|
+
// High complexity: Be stricter (need clearer names)
|
|
180
|
+
if (context.complexity > 10) {
|
|
181
|
+
if (baseSeverity === 'info')
|
|
182
|
+
return 'minor';
|
|
183
|
+
}
|
|
184
|
+
// Utility/helper layer: Allow shorter names
|
|
185
|
+
if (context.codeLayer === 'utility') {
|
|
186
|
+
if (baseSeverity === 'minor' && issueType === 'abbreviation')
|
|
187
|
+
return 'info';
|
|
188
|
+
}
|
|
189
|
+
return baseSeverity;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check if a short variable name is acceptable in this context
|
|
193
|
+
*/
|
|
194
|
+
export function isAcceptableInContext(name, context, options) {
|
|
195
|
+
// Loop variables always acceptable
|
|
196
|
+
if (options.isLoopVariable && ['i', 'j', 'k', 'l', 'n', 'm'].includes(name)) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
// Test files: More lenient
|
|
200
|
+
if (context.isTestFile) {
|
|
201
|
+
// Common test patterns: a/b for comparison, x/y for coordinates
|
|
202
|
+
if (['a', 'b', 'c', 'x', 'y', 'z'].includes(name) && options.isParameter) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Math/graphics context: x, y, z acceptable
|
|
207
|
+
if (context.codeLayer === 'utility' && ['x', 'y', 'z'].includes(name)) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
// Destructured from well-named source: More lenient
|
|
211
|
+
if (options.isDestructured) {
|
|
212
|
+
// Coverage metrics s/b/f/l always acceptable when destructured
|
|
213
|
+
if (['s', 'b', 'f', 'l'].includes(name)) {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Simple functions (complexity < 3): Allow short parameter names
|
|
218
|
+
if (options.isParameter && (options.complexity ?? context.complexity) < 3) {
|
|
219
|
+
if (name.length >= 2) {
|
|
220
|
+
return true; // Two-letter names OK in simple functions
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=context-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-detector.js","sourceRoot":"","sources":["../../src/utils/context-detector.ts"],"names":[],"mappings":"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"}
|