@aiready/consistency 0.21.8 → 0.21.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.turbo/turbo-build.log +23 -24
  2. package/.turbo/turbo-format-check.log +1 -1
  3. package/.turbo/turbo-lint.log +1 -1
  4. package/.turbo/turbo-test.log +18 -19
  5. package/.turbo/turbo-type-check.log +1 -1
  6. package/dist/index.d.mts +3 -3
  7. package/dist/index.d.ts +3 -3
  8. package/dist/index.js +4 -4
  9. package/dist/index.mjs +3 -3
  10. package/package.json +2 -2
  11. package/src/__tests__/provider.test.ts +6 -34
  12. package/src/index.ts +3 -3
  13. package/src/provider.ts +2 -2
  14. package/dist/__tests__/analyzer.test.d.ts +0 -2
  15. package/dist/__tests__/analyzer.test.d.ts.map +0 -1
  16. package/dist/__tests__/analyzer.test.js +0 -157
  17. package/dist/__tests__/analyzer.test.js.map +0 -1
  18. package/dist/__tests__/language-filter.test.d.ts +0 -2
  19. package/dist/__tests__/language-filter.test.d.ts.map +0 -1
  20. package/dist/__tests__/language-filter.test.js +0 -46
  21. package/dist/__tests__/language-filter.test.js.map +0 -1
  22. package/dist/__tests__/scoring.test.d.ts +0 -2
  23. package/dist/__tests__/scoring.test.d.ts.map +0 -1
  24. package/dist/__tests__/scoring.test.js +0 -118
  25. package/dist/__tests__/scoring.test.js.map +0 -1
  26. package/dist/analyzer.d.ts +0 -7
  27. package/dist/analyzer.d.ts.map +0 -1
  28. package/dist/analyzer.js +0 -160
  29. package/dist/analyzer.js.map +0 -1
  30. package/dist/analyzers/naming-ast.d.ts +0 -7
  31. package/dist/analyzers/naming-ast.d.ts.map +0 -1
  32. package/dist/analyzers/naming-ast.js +0 -253
  33. package/dist/analyzers/naming-ast.js.map +0 -1
  34. package/dist/analyzers/naming-constants.d.ts +0 -21
  35. package/dist/analyzers/naming-constants.d.ts.map +0 -1
  36. package/dist/analyzers/naming-constants.js +0 -96
  37. package/dist/analyzers/naming-constants.js.map +0 -1
  38. package/dist/analyzers/naming-python.d.ts +0 -16
  39. package/dist/analyzers/naming-python.d.ts.map +0 -1
  40. package/dist/analyzers/naming-python.js +0 -165
  41. package/dist/analyzers/naming-python.js.map +0 -1
  42. package/dist/analyzers/naming.d.ts +0 -6
  43. package/dist/analyzers/naming.d.ts.map +0 -1
  44. package/dist/analyzers/naming.js +0 -234
  45. package/dist/analyzers/naming.js.map +0 -1
  46. package/dist/analyzers/patterns.d.ts +0 -10
  47. package/dist/analyzers/patterns.d.ts.map +0 -1
  48. package/dist/analyzers/patterns.js +0 -197
  49. package/dist/analyzers/patterns.js.map +0 -1
  50. package/dist/chunk-2BTBNG6X.mjs +0 -814
  51. package/dist/chunk-3ZB6FFRL.mjs +0 -661
  52. package/dist/chunk-5UFRGXSB.mjs +0 -783
  53. package/dist/chunk-66M3TIO7.mjs +0 -837
  54. package/dist/chunk-6BM5MV3S.mjs +0 -719
  55. package/dist/chunk-6H3JHDP7.mjs +0 -832
  56. package/dist/chunk-7PHHJOGC.mjs +0 -1374
  57. package/dist/chunk-AASFXGUR.mjs +0 -1622
  58. package/dist/chunk-AR7DIZLP.mjs +0 -827
  59. package/dist/chunk-BDDMOIU2.mjs +0 -385
  60. package/dist/chunk-BMILMNKJ.mjs +0 -1633
  61. package/dist/chunk-BYY6MD5T.mjs +0 -729
  62. package/dist/chunk-CA4Q5JBK.mjs +0 -1143
  63. package/dist/chunk-CF4LU7KE.mjs +0 -384
  64. package/dist/chunk-CJINEUIH.mjs +0 -1369
  65. package/dist/chunk-CLWNLHDB.mjs +0 -909
  66. package/dist/chunk-CZUJTDNH.mjs +0 -848
  67. package/dist/chunk-DNGW3WQK.mjs +0 -810
  68. package/dist/chunk-DSI3TEO2.mjs +0 -662
  69. package/dist/chunk-EIQ5K6OO.mjs +0 -1579
  70. package/dist/chunk-FEJODRK5.mjs +0 -783
  71. package/dist/chunk-FK56AZ43.mjs +0 -817
  72. package/dist/chunk-H6S7WKSQ.mjs +0 -729
  73. package/dist/chunk-HAOJLJNB.mjs +0 -1290
  74. package/dist/chunk-HJCP36VW.mjs +0 -821
  75. package/dist/chunk-HPG7P6PD.mjs +0 -1372
  76. package/dist/chunk-IVRBV7SE.mjs +0 -1295
  77. package/dist/chunk-IXBC6GVT.mjs +0 -832
  78. package/dist/chunk-J5IFYDVU.mjs +0 -1579
  79. package/dist/chunk-KWQVBF7K.mjs +0 -831
  80. package/dist/chunk-LD3CHHU2.mjs +0 -1297
  81. package/dist/chunk-LMOXGPCM.mjs +0 -722
  82. package/dist/chunk-LSXZH6X6.mjs +0 -810
  83. package/dist/chunk-LUAREV6A.mjs +0 -508
  84. package/dist/chunk-MAPVFXBP.mjs +0 -708
  85. package/dist/chunk-MM2PLUCH.mjs +0 -1376
  86. package/dist/chunk-NPWCJZUG.mjs +0 -708
  87. package/dist/chunk-ON73WHHU.mjs +0 -1310
  88. package/dist/chunk-P6NVKUBB.mjs +0 -831
  89. package/dist/chunk-Q3KTWDSL.mjs +0 -808
  90. package/dist/chunk-Q5XMWG33.mjs +0 -661
  91. package/dist/chunk-QOIPVP6P.mjs +0 -1607
  92. package/dist/chunk-RMEQWG52.mjs +0 -1633
  93. package/dist/chunk-S6BZVTWN.mjs +0 -731
  94. package/dist/chunk-TE6JYZD3.mjs +0 -810
  95. package/dist/chunk-TLVLM3M5.mjs +0 -771
  96. package/dist/chunk-TXHPUU7A.mjs +0 -863
  97. package/dist/chunk-UMBBTNQN.mjs +0 -787
  98. package/dist/chunk-V2UPXL7L.mjs +0 -842
  99. package/dist/chunk-VODCPPET.mjs +0 -1292
  100. package/dist/chunk-W6UGMKRV.mjs +0 -1310
  101. package/dist/chunk-WGH4TGZ3.mjs +0 -1288
  102. package/dist/chunk-WTBDNCEN.mjs +0 -1352
  103. package/dist/chunk-XVW5DKJQ.mjs +0 -1619
  104. package/dist/chunk-YCDCIOJN.mjs +0 -842
  105. package/dist/chunk-YEHXYHGY.mjs +0 -1497
  106. package/dist/chunk-YHHXE2JX.mjs +0 -912
  107. package/dist/chunk-ZB6UK276.mjs +0 -662
  108. package/dist/chunk-ZG3KFSD3.mjs +0 -1142
  109. package/dist/cli.d.ts.map +0 -1
  110. package/dist/cli.js.map +0 -1
  111. package/dist/index.d.ts.map +0 -1
  112. package/dist/index.js.map +0 -1
  113. package/dist/scoring.d.ts +0 -12
  114. package/dist/scoring.d.ts.map +0 -1
  115. package/dist/scoring.js +0 -110
  116. package/dist/scoring.js.map +0 -1
  117. package/dist/types.d.ts +0 -53
  118. package/dist/types.d.ts.map +0 -1
  119. package/dist/types.js +0 -2
  120. package/dist/types.js.map +0 -1
  121. package/dist/utils/ast-parser.d.ts +0 -46
  122. package/dist/utils/ast-parser.d.ts.map +0 -1
  123. package/dist/utils/ast-parser.js +0 -157
  124. package/dist/utils/ast-parser.js.map +0 -1
  125. package/dist/utils/config-loader.d.ts +0 -19
  126. package/dist/utils/config-loader.d.ts.map +0 -1
  127. package/dist/utils/config-loader.js +0 -31
  128. package/dist/utils/config-loader.js.map +0 -1
  129. package/dist/utils/context-detector.d.ts +0 -40
  130. package/dist/utils/context-detector.d.ts.map +0 -1
  131. package/dist/utils/context-detector.js +0 -225
  132. package/dist/utils/context-detector.js.map +0 -1
  133. package/dist/utils/scope-tracker.d.ts +0 -87
  134. package/dist/utils/scope-tracker.d.ts.map +0 -1
  135. package/dist/utils/scope-tracker.js +0 -161
  136. package/dist/utils/scope-tracker.js.map +0 -1
@@ -1,225 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-detector.js","sourceRoot":"","sources":["../../src/utils/context-detector.ts"],"names":[],"mappings":"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"}
@@ -1,87 +0,0 @@
1
- import { TSESTree } from '@typescript-eslint/typescript-estree';
2
- export type ScopeType = 'global' | 'function' | 'block' | 'loop' | 'class';
3
- export interface VariableInfo {
4
- name: string;
5
- node: TSESTree.Node;
6
- declarationLine: number;
7
- references: TSESTree.Node[];
8
- type?: TSESTree.TypeNode | null;
9
- isParameter: boolean;
10
- isDestructured: boolean;
11
- isLoopVariable: boolean;
12
- }
13
- export interface Scope {
14
- type: ScopeType;
15
- node: TSESTree.Node;
16
- parent: Scope | null;
17
- children: Scope[];
18
- variables: Map<string, VariableInfo>;
19
- }
20
- export declare class ScopeTracker {
21
- private currentScope;
22
- private readonly rootScope;
23
- private readonly allScopes;
24
- constructor(rootNode: TSESTree.Program);
25
- /**
26
- * Enter a new scope
27
- */
28
- enterScope(type: ScopeType, node: TSESTree.Node): void;
29
- /**
30
- * Exit current scope and return to parent
31
- */
32
- exitScope(): void;
33
- /**
34
- * Declare a variable in the current scope
35
- */
36
- declareVariable(name: string, node: TSESTree.Node, line: number, options?: {
37
- type?: TSESTree.TypeNode | null;
38
- isParameter?: boolean;
39
- isDestructured?: boolean;
40
- isLoopVariable?: boolean;
41
- }): void;
42
- /**
43
- * Add a reference to a variable
44
- */
45
- addReference(name: string, node: TSESTree.Node): void;
46
- /**
47
- * Find a variable in current or parent scopes
48
- */
49
- findVariable(name: string): VariableInfo | null;
50
- /**
51
- * Get all variables in current scope (not including parent scopes)
52
- */
53
- getCurrentScopeVariables(): VariableInfo[];
54
- /**
55
- * Get all variables across all scopes
56
- */
57
- getAllVariables(): VariableInfo[];
58
- /**
59
- * Calculate actual usage count (references minus declaration)
60
- */
61
- getUsageCount(varInfo: VariableInfo): number;
62
- /**
63
- * Check if a variable is short-lived (used within N lines)
64
- */
65
- isShortLived(varInfo: VariableInfo, maxLines?: number): boolean;
66
- /**
67
- * Check if a variable is used in a limited scope (e.g., only in one callback)
68
- */
69
- isLocallyScoped(varInfo: VariableInfo): boolean;
70
- /**
71
- * Get current scope type
72
- */
73
- getCurrentScopeType(): ScopeType;
74
- /**
75
- * Check if currently in a loop scope
76
- */
77
- isInLoop(): boolean;
78
- /**
79
- * Check if currently in a function scope
80
- */
81
- isInFunction(): boolean;
82
- /**
83
- * Get the root scope
84
- */
85
- getRootScope(): Scope;
86
- }
87
- //# sourceMappingURL=scope-tracker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scope-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/scope-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACtC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,QAAQ,EAAE,QAAQ,CAAC,OAAO;IAYtC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IActD;;OAEG;IACH,SAAS,IAAI,IAAI;IAMjB;;OAEG;IACH,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QACP,IAAI,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;QAChC,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;KACrB,GACL,IAAI;IAeP;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IAOrD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAc/C;;OAEG;IACH,wBAAwB,IAAI,YAAY,EAAE;IAI1C;;OAEG;IACH,eAAe,IAAI,YAAY,EAAE;IAUjC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAI5C;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO;IAalE;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAY/C;;OAEG;IACH,mBAAmB,IAAI,SAAS;IAIhC;;OAEG;IACH,QAAQ,IAAI,OAAO;IAWnB;;OAEG;IACH,YAAY,IAAI,OAAO;IAWvB;;OAEG;IACH,YAAY,IAAI,KAAK;CAGtB"}
@@ -1,161 +0,0 @@
1
- export class ScopeTracker {
2
- constructor(rootNode) {
3
- this.allScopes = [];
4
- this.rootScope = {
5
- type: 'global',
6
- node: rootNode,
7
- parent: null,
8
- children: [],
9
- variables: new Map(),
10
- };
11
- this.currentScope = this.rootScope;
12
- this.allScopes.push(this.rootScope);
13
- }
14
- /**
15
- * Enter a new scope
16
- */
17
- enterScope(type, node) {
18
- const newScope = {
19
- type,
20
- node,
21
- parent: this.currentScope,
22
- children: [],
23
- variables: new Map(),
24
- };
25
- this.currentScope.children.push(newScope);
26
- this.currentScope = newScope;
27
- this.allScopes.push(newScope);
28
- }
29
- /**
30
- * Exit current scope and return to parent
31
- */
32
- exitScope() {
33
- if (this.currentScope.parent) {
34
- this.currentScope = this.currentScope.parent;
35
- }
36
- }
37
- /**
38
- * Declare a variable in the current scope
39
- */
40
- declareVariable(name, node, line, options = {}) {
41
- const varInfo = {
42
- name,
43
- node,
44
- declarationLine: line,
45
- references: [],
46
- type: options.type,
47
- isParameter: options.isParameter ?? false,
48
- isDestructured: options.isDestructured ?? false,
49
- isLoopVariable: options.isLoopVariable ?? false,
50
- };
51
- this.currentScope.variables.set(name, varInfo);
52
- }
53
- /**
54
- * Add a reference to a variable
55
- */
56
- addReference(name, node) {
57
- const varInfo = this.findVariable(name);
58
- if (varInfo) {
59
- varInfo.references.push(node);
60
- }
61
- }
62
- /**
63
- * Find a variable in current or parent scopes
64
- */
65
- findVariable(name) {
66
- let scope = this.currentScope;
67
- while (scope) {
68
- const varInfo = scope.variables.get(name);
69
- if (varInfo) {
70
- return varInfo;
71
- }
72
- scope = scope.parent;
73
- }
74
- return null;
75
- }
76
- /**
77
- * Get all variables in current scope (not including parent scopes)
78
- */
79
- getCurrentScopeVariables() {
80
- return Array.from(this.currentScope.variables.values());
81
- }
82
- /**
83
- * Get all variables across all scopes
84
- */
85
- getAllVariables() {
86
- const allVars = [];
87
- for (const scope of this.allScopes) {
88
- allVars.push(...Array.from(scope.variables.values()));
89
- }
90
- return allVars;
91
- }
92
- /**
93
- * Calculate actual usage count (references minus declaration)
94
- */
95
- getUsageCount(varInfo) {
96
- return varInfo.references.length;
97
- }
98
- /**
99
- * Check if a variable is short-lived (used within N lines)
100
- */
101
- isShortLived(varInfo, maxLines = 5) {
102
- if (varInfo.references.length === 0) {
103
- return false; // Unused variable
104
- }
105
- const declarationLine = varInfo.declarationLine;
106
- const maxUsageLine = Math.max(...varInfo.references.map(ref => ref.loc?.start.line ?? declarationLine));
107
- return (maxUsageLine - declarationLine) <= maxLines;
108
- }
109
- /**
110
- * Check if a variable is used in a limited scope (e.g., only in one callback)
111
- */
112
- isLocallyScoped(varInfo) {
113
- // If all references are within a small scope (e.g., arrow function), it's locally scoped
114
- if (varInfo.references.length === 0)
115
- return false;
116
- // Check if usage span is small
117
- const lines = varInfo.references.map(ref => ref.loc?.start.line ?? 0);
118
- const minLine = Math.min(...lines);
119
- const maxLine = Math.max(...lines);
120
- return (maxLine - minLine) <= 3;
121
- }
122
- /**
123
- * Get current scope type
124
- */
125
- getCurrentScopeType() {
126
- return this.currentScope.type;
127
- }
128
- /**
129
- * Check if currently in a loop scope
130
- */
131
- isInLoop() {
132
- let scope = this.currentScope;
133
- while (scope) {
134
- if (scope.type === 'loop') {
135
- return true;
136
- }
137
- scope = scope.parent;
138
- }
139
- return false;
140
- }
141
- /**
142
- * Check if currently in a function scope
143
- */
144
- isInFunction() {
145
- let scope = this.currentScope;
146
- while (scope) {
147
- if (scope.type === 'function') {
148
- return true;
149
- }
150
- scope = scope.parent;
151
- }
152
- return false;
153
- }
154
- /**
155
- * Get the root scope
156
- */
157
- getRootScope() {
158
- return this.rootScope;
159
- }
160
- }
161
- //# sourceMappingURL=scope-tracker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scope-tracker.js","sourceRoot":"","sources":["../../src/utils/scope-tracker.ts"],"names":[],"mappings":"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"}