semantic-complexity 0.0.7-741984fb → 0.0.15-f5745e88

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 (163) hide show
  1. package/dist/__tests__/analyzers.test.d.ts +5 -0
  2. package/dist/__tests__/analyzers.test.d.ts.map +1 -0
  3. package/dist/__tests__/analyzers.test.js +357 -0
  4. package/dist/__tests__/analyzers.test.js.map +1 -0
  5. package/dist/__tests__/gate.test.d.ts +5 -0
  6. package/dist/__tests__/gate.test.d.ts.map +1 -0
  7. package/dist/__tests__/gate.test.js +140 -0
  8. package/dist/__tests__/gate.test.js.map +1 -0
  9. package/dist/analyzers/bread.d.ts +63 -0
  10. package/dist/analyzers/bread.d.ts.map +1 -0
  11. package/dist/analyzers/bread.js +415 -0
  12. package/dist/analyzers/bread.js.map +1 -0
  13. package/dist/analyzers/cheese.d.ts +111 -0
  14. package/dist/analyzers/cheese.d.ts.map +1 -0
  15. package/dist/analyzers/cheese.js +881 -0
  16. package/dist/analyzers/cheese.js.map +1 -0
  17. package/dist/analyzers/ham.d.ts +33 -0
  18. package/dist/analyzers/ham.d.ts.map +1 -0
  19. package/dist/analyzers/ham.js +264 -0
  20. package/dist/analyzers/ham.js.map +1 -0
  21. package/dist/analyzers/index.d.ts +7 -0
  22. package/dist/analyzers/index.d.ts.map +1 -0
  23. package/dist/analyzers/index.js +7 -0
  24. package/dist/analyzers/index.js.map +1 -0
  25. package/dist/budget/index.d.ts +50 -0
  26. package/dist/budget/index.d.ts.map +1 -0
  27. package/dist/budget/index.js +138 -0
  28. package/dist/budget/index.js.map +1 -0
  29. package/dist/cli/index.d.ts +6 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +103 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/gate/index.d.ts +31 -0
  34. package/dist/gate/index.d.ts.map +1 -0
  35. package/dist/gate/index.js +117 -0
  36. package/dist/gate/index.js.map +1 -0
  37. package/dist/gate/waiver.d.ts +83 -0
  38. package/dist/gate/waiver.d.ts.map +1 -0
  39. package/dist/gate/waiver.js +425 -0
  40. package/dist/gate/waiver.js.map +1 -0
  41. package/dist/index.d.ts +8 -34
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +8 -49
  44. package/dist/index.js.map +1 -1
  45. package/dist/mcp/index.d.ts +5 -0
  46. package/dist/mcp/index.d.ts.map +1 -0
  47. package/dist/mcp/index.js +351 -0
  48. package/dist/mcp/index.js.map +1 -0
  49. package/dist/recommend/index.d.ts +32 -0
  50. package/dist/recommend/index.d.ts.map +1 -0
  51. package/dist/recommend/index.js +169 -0
  52. package/dist/recommend/index.js.map +1 -0
  53. package/dist/simplex/index.d.ts +26 -0
  54. package/dist/simplex/index.d.ts.map +1 -0
  55. package/dist/simplex/index.js +100 -0
  56. package/dist/simplex/index.js.map +1 -0
  57. package/dist/types/index.d.ts +39 -0
  58. package/dist/types/index.d.ts.map +1 -0
  59. package/dist/types/index.js +5 -0
  60. package/dist/types/index.js.map +1 -0
  61. package/package.json +27 -52
  62. package/LICENSE +0 -21
  63. package/README.md +0 -72
  64. package/dist/ast/index.d.ts +0 -2
  65. package/dist/ast/index.d.ts.map +0 -1
  66. package/dist/ast/index.js +0 -2
  67. package/dist/ast/index.js.map +0 -1
  68. package/dist/ast/parser.d.ts +0 -27
  69. package/dist/ast/parser.d.ts.map +0 -1
  70. package/dist/ast/parser.js +0 -273
  71. package/dist/ast/parser.js.map +0 -1
  72. package/dist/canonical/convergence.d.ts +0 -56
  73. package/dist/canonical/convergence.d.ts.map +0 -1
  74. package/dist/canonical/convergence.js +0 -149
  75. package/dist/canonical/convergence.js.map +0 -1
  76. package/dist/canonical/index.d.ts +0 -11
  77. package/dist/canonical/index.d.ts.map +0 -1
  78. package/dist/canonical/index.js +0 -11
  79. package/dist/canonical/index.js.map +0 -1
  80. package/dist/canonical/profiles.d.ts +0 -40
  81. package/dist/canonical/profiles.d.ts.map +0 -1
  82. package/dist/canonical/profiles.js +0 -182
  83. package/dist/canonical/profiles.js.map +0 -1
  84. package/dist/canonical/types.d.ts +0 -124
  85. package/dist/canonical/types.d.ts.map +0 -1
  86. package/dist/canonical/types.js +0 -46
  87. package/dist/canonical/types.js.map +0 -1
  88. package/dist/compare.d.ts +0 -31
  89. package/dist/compare.d.ts.map +0 -1
  90. package/dist/compare.js +0 -354
  91. package/dist/compare.js.map +0 -1
  92. package/dist/context/index.d.ts +0 -41
  93. package/dist/context/index.d.ts.map +0 -1
  94. package/dist/context/index.js +0 -253
  95. package/dist/context/index.js.map +0 -1
  96. package/dist/gates/delta.d.ts +0 -45
  97. package/dist/gates/delta.d.ts.map +0 -1
  98. package/dist/gates/delta.js +0 -260
  99. package/dist/gates/delta.js.map +0 -1
  100. package/dist/gates/index.d.ts +0 -9
  101. package/dist/gates/index.d.ts.map +0 -1
  102. package/dist/gates/index.js +0 -9
  103. package/dist/gates/index.js.map +0 -1
  104. package/dist/gates/types.d.ts +0 -96
  105. package/dist/gates/types.d.ts.map +0 -1
  106. package/dist/gates/types.js +0 -59
  107. package/dist/gates/types.js.map +0 -1
  108. package/dist/graph/call.d.ts +0 -63
  109. package/dist/graph/call.d.ts.map +0 -1
  110. package/dist/graph/call.js +0 -240
  111. package/dist/graph/call.js.map +0 -1
  112. package/dist/graph/dependency.d.ts +0 -52
  113. package/dist/graph/dependency.d.ts.map +0 -1
  114. package/dist/graph/dependency.js +0 -296
  115. package/dist/graph/dependency.js.map +0 -1
  116. package/dist/graph/index.d.ts +0 -3
  117. package/dist/graph/index.d.ts.map +0 -1
  118. package/dist/graph/index.js +0 -3
  119. package/dist/graph/index.js.map +0 -1
  120. package/dist/metrics/cognitive.d.ts +0 -42
  121. package/dist/metrics/cognitive.d.ts.map +0 -1
  122. package/dist/metrics/cognitive.js +0 -204
  123. package/dist/metrics/cognitive.js.map +0 -1
  124. package/dist/metrics/cyclomatic.d.ts +0 -31
  125. package/dist/metrics/cyclomatic.d.ts.map +0 -1
  126. package/dist/metrics/cyclomatic.js +0 -121
  127. package/dist/metrics/cyclomatic.js.map +0 -1
  128. package/dist/metrics/dimensional.d.ts +0 -32
  129. package/dist/metrics/dimensional.d.ts.map +0 -1
  130. package/dist/metrics/dimensional.js +0 -560
  131. package/dist/metrics/dimensional.js.map +0 -1
  132. package/dist/metrics/index.d.ts +0 -26
  133. package/dist/metrics/index.d.ts.map +0 -1
  134. package/dist/metrics/index.js +0 -120
  135. package/dist/metrics/index.js.map +0 -1
  136. package/dist/metrics/meta.d.ts +0 -90
  137. package/dist/metrics/meta.d.ts.map +0 -1
  138. package/dist/metrics/meta.js +0 -144
  139. package/dist/metrics/meta.js.map +0 -1
  140. package/dist/tensor/canonical.d.ts +0 -53
  141. package/dist/tensor/canonical.d.ts.map +0 -1
  142. package/dist/tensor/canonical.js +0 -192
  143. package/dist/tensor/canonical.js.map +0 -1
  144. package/dist/tensor/index.d.ts +0 -22
  145. package/dist/tensor/index.d.ts.map +0 -1
  146. package/dist/tensor/index.js +0 -22
  147. package/dist/tensor/index.js.map +0 -1
  148. package/dist/tensor/matrix.d.ts +0 -62
  149. package/dist/tensor/matrix.d.ts.map +0 -1
  150. package/dist/tensor/matrix.js +0 -187
  151. package/dist/tensor/matrix.js.map +0 -1
  152. package/dist/tensor/scoring.d.ts +0 -82
  153. package/dist/tensor/scoring.d.ts.map +0 -1
  154. package/dist/tensor/scoring.js +0 -233
  155. package/dist/tensor/scoring.js.map +0 -1
  156. package/dist/tensor/types.d.ts +0 -186
  157. package/dist/tensor/types.d.ts.map +0 -1
  158. package/dist/tensor/types.js +0 -15
  159. package/dist/tensor/types.js.map +0 -1
  160. package/dist/types.d.ts +0 -341
  161. package/dist/types.d.ts.map +0 -1
  162. package/dist/types.js +0 -22
  163. package/dist/types.js.map +0 -1
@@ -1,296 +0,0 @@
1
- import * as path from 'node:path';
2
- import * as fs from 'node:fs';
3
- import { parseSourceFile, extractImports } from '../ast/parser.js';
4
- /**
5
- * 의존성 그래프 빌더
6
- */
7
- export class DependencyGraph {
8
- nodes = new Map();
9
- projectRoot;
10
- constructor(projectRoot) {
11
- this.projectRoot = path.resolve(projectRoot);
12
- }
13
- /**
14
- * 프로젝트 루트 경로 반환
15
- */
16
- getProjectRoot() {
17
- return this.projectRoot;
18
- }
19
- /**
20
- * 파일의 의존성 분석
21
- */
22
- analyzeFile(filePath, content) {
23
- const absPath = path.resolve(filePath);
24
- const normalizedPath = this.normalizePath(absPath);
25
- // 이미 분석된 경우 캐시된 결과 반환
26
- const existing = this.nodes.get(normalizedPath);
27
- if (existing)
28
- return existing;
29
- // 파일 내용 읽기
30
- const fileContent = content ?? this.readFile(absPath);
31
- if (!fileContent) {
32
- const node = {
33
- filePath: normalizedPath,
34
- imports: [],
35
- importedBy: [],
36
- depth: -1,
37
- };
38
- this.nodes.set(normalizedPath, node);
39
- return node;
40
- }
41
- // 파싱 및 import 추출
42
- const sourceFile = parseSourceFile(absPath, fileContent);
43
- const imports = extractImports(sourceFile);
44
- // import 경로 해석
45
- const resolvedImports = imports
46
- .map((imp) => this.resolveImportPath(absPath, imp.source))
47
- .filter((p) => p !== null);
48
- // 노드 생성
49
- const node = {
50
- filePath: normalizedPath,
51
- imports: resolvedImports,
52
- importedBy: [],
53
- depth: 0,
54
- };
55
- this.nodes.set(normalizedPath, node);
56
- // 역방향 참조 업데이트
57
- for (const importPath of resolvedImports) {
58
- const importNode = this.nodes.get(importPath);
59
- if (importNode && !importNode.importedBy.includes(normalizedPath)) {
60
- importNode.importedBy.push(normalizedPath);
61
- }
62
- }
63
- return node;
64
- }
65
- /**
66
- * 디렉토리 내 모든 파일 분석
67
- */
68
- analyzeDirectory(dirPath, extensions = ['.ts', '.tsx', '.js', '.jsx']) {
69
- const files = this.findFiles(dirPath, extensions);
70
- for (const file of files) {
71
- this.analyzeFile(file);
72
- }
73
- // 모든 파일 분석 후 역방향 참조 재구성
74
- this.rebuildReverseReferences();
75
- // 깊이 계산
76
- this.calculateDepths();
77
- }
78
- /**
79
- * 특정 파일에서 시작하는 의존성 트리 구축
80
- */
81
- buildDependencyTree(filePath, maxDepth = 5) {
82
- const absPath = path.resolve(filePath);
83
- const normalizedPath = this.normalizePath(absPath);
84
- const visited = new Set();
85
- const result = [];
86
- const traverse = (nodePath, depth) => {
87
- if (depth > maxDepth || visited.has(nodePath))
88
- return;
89
- visited.add(nodePath);
90
- let node = this.nodes.get(nodePath);
91
- if (!node) {
92
- node = this.analyzeFile(nodePath);
93
- }
94
- const nodeWithDepth = { ...node, depth };
95
- result.push(nodeWithDepth);
96
- for (const importPath of node.imports) {
97
- traverse(importPath, depth + 1);
98
- }
99
- };
100
- traverse(normalizedPath, 0);
101
- return result;
102
- }
103
- /**
104
- * 특정 파일을 참조하는 파일들 찾기
105
- */
106
- findDependents(filePath, maxDepth = 5) {
107
- const absPath = path.resolve(filePath);
108
- const normalizedPath = this.normalizePath(absPath);
109
- const visited = new Set();
110
- const result = [];
111
- const traverse = (nodePath, depth) => {
112
- if (depth > maxDepth || visited.has(nodePath))
113
- return;
114
- visited.add(nodePath);
115
- const node = this.nodes.get(nodePath);
116
- if (!node)
117
- return;
118
- const nodeWithDepth = { ...node, depth };
119
- result.push(nodeWithDepth);
120
- for (const dependentPath of node.importedBy) {
121
- traverse(dependentPath, depth + 1);
122
- }
123
- };
124
- traverse(normalizedPath, 0);
125
- return result;
126
- }
127
- /**
128
- * 노드 조회
129
- */
130
- getNode(filePath) {
131
- const normalizedPath = this.normalizePath(path.resolve(filePath));
132
- return this.nodes.get(normalizedPath);
133
- }
134
- /**
135
- * 모든 노드 반환
136
- */
137
- getAllNodes() {
138
- return Array.from(this.nodes.values());
139
- }
140
- /**
141
- * 순환 의존성 탐지
142
- */
143
- findCircularDependencies() {
144
- const cycles = [];
145
- const visited = new Set();
146
- const recursionStack = new Set();
147
- const dfs = (nodePath, path) => {
148
- visited.add(nodePath);
149
- recursionStack.add(nodePath);
150
- const node = this.nodes.get(nodePath);
151
- if (!node)
152
- return false;
153
- for (const importPath of node.imports) {
154
- if (!visited.has(importPath)) {
155
- if (dfs(importPath, [...path, importPath])) {
156
- return true;
157
- }
158
- }
159
- else if (recursionStack.has(importPath)) {
160
- // 순환 발견
161
- const cycleStart = path.indexOf(importPath);
162
- if (cycleStart >= 0) {
163
- cycles.push([...path.slice(cycleStart), importPath]);
164
- }
165
- else {
166
- cycles.push([...path, importPath]);
167
- }
168
- }
169
- }
170
- recursionStack.delete(nodePath);
171
- return false;
172
- };
173
- for (const nodePath of this.nodes.keys()) {
174
- if (!visited.has(nodePath)) {
175
- dfs(nodePath, [nodePath]);
176
- }
177
- }
178
- return cycles;
179
- }
180
- // ─── Private Methods ───────────────────────────────────────────
181
- normalizePath(filePath) {
182
- return filePath.replace(/\\/g, '/');
183
- }
184
- readFile(filePath) {
185
- try {
186
- return fs.readFileSync(filePath, 'utf-8');
187
- }
188
- catch {
189
- return null;
190
- }
191
- }
192
- resolveImportPath(fromFile, importSource) {
193
- // 상대 경로만 처리 (node_modules 제외)
194
- if (!importSource.startsWith('.')) {
195
- return null;
196
- }
197
- const fromDir = path.dirname(fromFile);
198
- const resolved = path.resolve(fromDir, importSource);
199
- // 확장자가 없으면 추가
200
- const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js', '/index.jsx'];
201
- for (const ext of extensions) {
202
- const candidate = resolved + ext;
203
- if (fs.existsSync(candidate)) {
204
- return this.normalizePath(candidate);
205
- }
206
- }
207
- // 이미 확장자가 있는 경우
208
- if (fs.existsSync(resolved)) {
209
- return this.normalizePath(resolved);
210
- }
211
- return null;
212
- }
213
- findFiles(dirPath, extensions) {
214
- const files = [];
215
- const traverse = (dir) => {
216
- try {
217
- const entries = fs.readdirSync(dir, { withFileTypes: true });
218
- for (const entry of entries) {
219
- const fullPath = path.join(dir, entry.name);
220
- // node_modules 등 제외
221
- if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist') {
222
- continue;
223
- }
224
- if (entry.isDirectory()) {
225
- traverse(fullPath);
226
- }
227
- else if (extensions.some((ext) => entry.name.endsWith(ext))) {
228
- files.push(fullPath);
229
- }
230
- }
231
- }
232
- catch {
233
- // 접근 불가 디렉토리 무시
234
- }
235
- };
236
- traverse(dirPath);
237
- return files;
238
- }
239
- rebuildReverseReferences() {
240
- // 기존 역참조 초기화
241
- for (const node of this.nodes.values()) {
242
- node.importedBy = [];
243
- }
244
- // 역참조 재구성
245
- for (const node of this.nodes.values()) {
246
- for (const importPath of node.imports) {
247
- const importNode = this.nodes.get(importPath);
248
- if (importNode && !importNode.importedBy.includes(node.filePath)) {
249
- importNode.importedBy.push(node.filePath);
250
- }
251
- }
252
- }
253
- }
254
- calculateDepths() {
255
- // 루트 노드 찾기 (참조되지 않는 노드)
256
- const roots = Array.from(this.nodes.values()).filter((node) => node.importedBy.length === 0);
257
- // BFS로 깊이 계산
258
- const visited = new Set();
259
- const queue = roots.map((r) => ({
260
- path: r.filePath,
261
- depth: 0,
262
- }));
263
- while (queue.length > 0) {
264
- const { path: nodePath, depth } = queue.shift();
265
- if (visited.has(nodePath))
266
- continue;
267
- visited.add(nodePath);
268
- const node = this.nodes.get(nodePath);
269
- if (!node)
270
- continue;
271
- node.depth = depth;
272
- for (const importPath of node.imports) {
273
- if (!visited.has(importPath)) {
274
- queue.push({ path: importPath, depth: depth + 1 });
275
- }
276
- }
277
- }
278
- }
279
- }
280
- /**
281
- * 의존성 그래프를 DOT 형식으로 출력 (시각화용)
282
- */
283
- export function exportToDot(graph) {
284
- const lines = ['digraph DependencyGraph {', ' rankdir=TB;'];
285
- for (const node of graph.getAllNodes()) {
286
- const shortName = path.basename(node.filePath);
287
- lines.push(` "${shortName}" [label="${shortName}"];`);
288
- for (const importPath of node.imports) {
289
- const importName = path.basename(importPath);
290
- lines.push(` "${shortName}" -> "${importName}";`);
291
- }
292
- }
293
- lines.push('}');
294
- return lines.join('\n');
295
- }
296
- //# sourceMappingURL=dependency.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/graph/dependency.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export { DependencyGraph, exportToDot } from './dependency.js';
2
- export { CallGraph, exportToMermaid } from './call.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -1,3 +0,0 @@
1
- export { DependencyGraph, exportToDot } from './dependency.js';
2
- export { CallGraph, exportToMermaid } from './call.js';
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -1,42 +0,0 @@
1
- import ts from 'typescript';
2
- import type { ComplexityResult, ComplexityDetail, FunctionInfo } from '../types.js';
3
- /**
4
- * SonarSource 인지복잡도 계산
5
- *
6
- * 기본 원칙:
7
- * 1. 중첩은 복잡성을 증가시킨다 (nesting penalty)
8
- * 2. 선형 흐름 중단은 복잡성을 증가시킨다 (structural increment)
9
- * 3. 일부 구조는 "하이브리드" (둘 다 적용)
10
- *
11
- * Structural Increment (+1):
12
- * - if, else if, else
13
- * - switch
14
- * - for, for-in, for-of, while, do-while
15
- * - catch
16
- * - goto (JS/TS에서는 labeled break/continue)
17
- * - 재귀 호출
18
- * - 중첩 함수
19
- *
20
- * Nesting Penalty (+nesting level):
21
- * - if, else if, else (중첩 시)
22
- * - switch (중첩 시)
23
- * - for, for-in, for-of, while, do-while (중첩 시)
24
- * - catch (중첩 시)
25
- * - 삼항 연산자 (중첩 시)
26
- * - 중첩 함수
27
- *
28
- * 참고: 순환복잡도와 달리 &&, ||, ??는 시퀀스가 아닌 경우에만 카운트
29
- */
30
- export declare function calculateCognitiveComplexity(node: ts.Node, sourceFile: ts.SourceFile, currentFunctionName?: string): {
31
- complexity: number;
32
- details: ComplexityDetail[];
33
- };
34
- /**
35
- * 함수 노드에서 인지복잡도 계산
36
- */
37
- export declare function analyzeFunctionCognitive(functionNode: ts.Node, sourceFile: ts.SourceFile, functionInfo: FunctionInfo): ComplexityResult;
38
- /**
39
- * 소스 파일의 모든 함수에 대한 인지복잡도 계산
40
- */
41
- export declare function analyzeFileCognitive(sourceFile: ts.SourceFile): ComplexityResult[];
42
- //# sourceMappingURL=cognitive.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cognitive.d.ts","sourceRoot":"","sources":["../../src/metrics/cognitive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,YAAY,EACb,MAAM,aAAa,CAAC;AAGrB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,mBAAmB,CAAC,EAAE,MAAM,GAC3B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,CA6KrD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,EAAE,CAAC,IAAI,EACrB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,YAAY,EAAE,YAAY,GACzB,gBAAgB,CAalB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,gBAAgB,EAAE,CAwBpB"}
@@ -1,204 +0,0 @@
1
- import ts from 'typescript';
2
- import { getSourceLocation, extractFunctionInfo } from '../ast/parser.js';
3
- /**
4
- * SonarSource 인지복잡도 계산
5
- *
6
- * 기본 원칙:
7
- * 1. 중첩은 복잡성을 증가시킨다 (nesting penalty)
8
- * 2. 선형 흐름 중단은 복잡성을 증가시킨다 (structural increment)
9
- * 3. 일부 구조는 "하이브리드" (둘 다 적용)
10
- *
11
- * Structural Increment (+1):
12
- * - if, else if, else
13
- * - switch
14
- * - for, for-in, for-of, while, do-while
15
- * - catch
16
- * - goto (JS/TS에서는 labeled break/continue)
17
- * - 재귀 호출
18
- * - 중첩 함수
19
- *
20
- * Nesting Penalty (+nesting level):
21
- * - if, else if, else (중첩 시)
22
- * - switch (중첩 시)
23
- * - for, for-in, for-of, while, do-while (중첩 시)
24
- * - catch (중첩 시)
25
- * - 삼항 연산자 (중첩 시)
26
- * - 중첩 함수
27
- *
28
- * 참고: 순환복잡도와 달리 &&, ||, ??는 시퀀스가 아닌 경우에만 카운트
29
- */
30
- export function calculateCognitiveComplexity(node, sourceFile, currentFunctionName) {
31
- let complexity = 0;
32
- const details = [];
33
- function addDetail(node, type, increment, nestingLevel, description) {
34
- const totalIncrement = increment + nestingLevel;
35
- details.push({
36
- type,
37
- location: getSourceLocation(node, sourceFile),
38
- increment: totalIncrement,
39
- nestingLevel,
40
- description: `${description} (+${increment}${nestingLevel > 0 ? ` +${nestingLevel} nesting` : ''})`,
41
- });
42
- complexity += totalIncrement;
43
- }
44
- function visit(node, nestingLevel, inLogicalSequence) {
45
- switch (node.kind) {
46
- case ts.SyntaxKind.IfStatement: {
47
- const ifStmt = node;
48
- // if 또는 else if
49
- const parent = node.parent;
50
- const isElseIf = parent &&
51
- ts.isIfStatement(parent) &&
52
- parent.elseStatement === node;
53
- if (isElseIf) {
54
- addDetail(node, 'else-if', 1, 0, 'else if'); // else if는 nesting penalty 없음
55
- }
56
- else {
57
- addDetail(node, 'if', 1, nestingLevel, 'if 조건문');
58
- }
59
- // then 브랜치
60
- visit(ifStmt.thenStatement, nestingLevel + 1, false);
61
- // else 브랜치
62
- if (ifStmt.elseStatement) {
63
- if (ts.isIfStatement(ifStmt.elseStatement)) {
64
- // else if는 nesting 증가 없이 순회
65
- visit(ifStmt.elseStatement, nestingLevel, false);
66
- }
67
- else {
68
- addDetail(ifStmt.elseStatement, 'else', 1, 0, 'else');
69
- visit(ifStmt.elseStatement, nestingLevel + 1, false);
70
- }
71
- }
72
- return; // 자식 노드 이미 처리함
73
- }
74
- case ts.SyntaxKind.SwitchStatement:
75
- addDetail(node, 'switch', 1, nestingLevel, 'switch 문');
76
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
77
- return;
78
- case ts.SyntaxKind.ForStatement:
79
- addDetail(node, 'for', 1, nestingLevel, 'for 반복문');
80
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
81
- return;
82
- case ts.SyntaxKind.ForInStatement:
83
- addDetail(node, 'for-in', 1, nestingLevel, 'for-in 반복문');
84
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
85
- return;
86
- case ts.SyntaxKind.ForOfStatement:
87
- addDetail(node, 'for-of', 1, nestingLevel, 'for-of 반복문');
88
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
89
- return;
90
- case ts.SyntaxKind.WhileStatement:
91
- addDetail(node, 'while', 1, nestingLevel, 'while 반복문');
92
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
93
- return;
94
- case ts.SyntaxKind.DoStatement:
95
- addDetail(node, 'do-while', 1, nestingLevel, 'do-while 반복문');
96
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
97
- return;
98
- case ts.SyntaxKind.CatchClause:
99
- addDetail(node, 'catch', 1, nestingLevel, 'catch 예외 처리');
100
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
101
- return;
102
- case ts.SyntaxKind.ConditionalExpression:
103
- addDetail(node, 'conditional', 1, nestingLevel, '삼항 연산자');
104
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
105
- return;
106
- case ts.SyntaxKind.BinaryExpression: {
107
- const binary = node;
108
- const op = binary.operatorToken.kind;
109
- // 논리 연산자 시퀀스 처리
110
- // a && b && c 는 +1 (시퀀스)
111
- // a && b || c 는 +2 (다른 연산자)
112
- const isLogical = op === ts.SyntaxKind.AmpersandAmpersandToken ||
113
- op === ts.SyntaxKind.BarBarToken ||
114
- op === ts.SyntaxKind.QuestionQuestionToken;
115
- if (isLogical) {
116
- const parentBinary = node.parent;
117
- const isContinuingSequence = inLogicalSequence &&
118
- ts.isBinaryExpression(parentBinary) &&
119
- parentBinary.operatorToken.kind === op;
120
- if (!isContinuingSequence) {
121
- const type = op === ts.SyntaxKind.AmpersandAmpersandToken
122
- ? 'logical-and'
123
- : op === ts.SyntaxKind.BarBarToken
124
- ? 'logical-or'
125
- : 'nullish-coalescing';
126
- const desc = op === ts.SyntaxKind.AmpersandAmpersandToken
127
- ? '논리 AND 시퀀스'
128
- : op === ts.SyntaxKind.BarBarToken
129
- ? '논리 OR 시퀀스'
130
- : 'Nullish coalescing 시퀀스';
131
- addDetail(node, type, 1, 0, desc);
132
- }
133
- visit(binary.left, nestingLevel, true);
134
- visit(binary.right, nestingLevel, true);
135
- return;
136
- }
137
- break;
138
- }
139
- case ts.SyntaxKind.FunctionDeclaration:
140
- case ts.SyntaxKind.FunctionExpression:
141
- case ts.SyntaxKind.ArrowFunction: {
142
- // 중첩 함수 (콜백)
143
- if (nestingLevel > 0) {
144
- addDetail(node, 'nested-function', 1, nestingLevel, '중첩 함수/콜백');
145
- }
146
- // 중첩 함수 내부는 새로운 nesting 시작
147
- ts.forEachChild(node, (child) => visit(child, nestingLevel + 1, false));
148
- return;
149
- }
150
- case ts.SyntaxKind.CallExpression: {
151
- // 재귀 호출 감지
152
- const call = node;
153
- if (currentFunctionName &&
154
- ts.isIdentifier(call.expression) &&
155
- call.expression.text === currentFunctionName) {
156
- addDetail(node, 'recursion', 1, 0, '재귀 호출');
157
- }
158
- break;
159
- }
160
- default:
161
- break;
162
- }
163
- ts.forEachChild(node, (child) => visit(child, nestingLevel, inLogicalSequence));
164
- }
165
- visit(node, 0, false);
166
- return { complexity, details };
167
- }
168
- /**
169
- * 함수 노드에서 인지복잡도 계산
170
- */
171
- export function analyzeFunctionCognitive(functionNode, sourceFile, functionInfo) {
172
- const { complexity, details } = calculateCognitiveComplexity(functionNode, sourceFile, functionInfo.name !== '<anonymous>' ? functionInfo.name : undefined);
173
- return {
174
- function: functionInfo,
175
- cyclomatic: 0, // cyclomatic.ts에서 별도 계산
176
- cognitive: complexity,
177
- details,
178
- };
179
- }
180
- /**
181
- * 소스 파일의 모든 함수에 대한 인지복잡도 계산
182
- */
183
- export function analyzeFileCognitive(sourceFile) {
184
- const results = [];
185
- function visit(node, className) {
186
- // 클래스 처리
187
- if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
188
- const name = node.name?.getText(sourceFile) ?? '<anonymous>';
189
- node.members.forEach((member) => visit(member, name));
190
- return;
191
- }
192
- // 함수 노드 확인
193
- const functionInfo = extractFunctionInfo(node, sourceFile, className);
194
- if (functionInfo) {
195
- const result = analyzeFunctionCognitive(node, sourceFile, functionInfo);
196
- results.push(result);
197
- }
198
- // 자식 노드 순회 - 중첩 함수는 별도로 분석하지 않음 (상위 함수에 포함)
199
- // 최상위 레벨 함수만 독립적으로 분석
200
- }
201
- ts.forEachChild(sourceFile, (node) => visit(node));
202
- return results;
203
- }
204
- //# sourceMappingURL=cognitive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cognitive.js","sourceRoot":"","sources":["../../src/metrics/cognitive.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import ts from 'typescript';
2
- import type { ComplexityResult, ComplexityDetail, FunctionInfo } from '../types.js';
3
- /**
4
- * McCabe 순환복잡도 계산
5
- *
6
- * V(G) = E - N + 2P
7
- * 단순화: 분기점 개수 + 1
8
- *
9
- * 분기점:
10
- * - if, else if
11
- * - case (switch)
12
- * - for, for-in, for-of
13
- * - while, do-while
14
- * - catch
15
- * - 삼항 연산자 (?:)
16
- * - 논리 AND (&&), OR (||)
17
- * - nullish coalescing (??)
18
- */
19
- export declare function calculateCyclomaticComplexity(node: ts.Node, sourceFile: ts.SourceFile): {
20
- complexity: number;
21
- details: ComplexityDetail[];
22
- };
23
- /**
24
- * 함수 노드에서 순환복잡도 계산
25
- */
26
- export declare function analyzeFunctionCyclomatic(functionNode: ts.Node, sourceFile: ts.SourceFile, functionInfo: FunctionInfo): ComplexityResult;
27
- /**
28
- * 소스 파일의 모든 함수에 대한 순환복잡도 계산
29
- */
30
- export declare function analyzeFileCyclomatic(sourceFile: ts.SourceFile): ComplexityResult[];
31
- //# sourceMappingURL=cyclomatic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cyclomatic.d.ts","sourceRoot":"","sources":["../../src/metrics/cyclomatic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,YAAY,EACb,MAAM,aAAa,CAAC;AAGrB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAqFrD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,EAAE,CAAC,IAAI,EACrB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,YAAY,EAAE,YAAY,GACzB,gBAAgB,CAYlB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,gBAAgB,EAAE,CAwBpB"}