semantic-complexity 0.0.1-cedf2072

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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ast/index.d.ts +2 -0
  3. package/dist/ast/index.d.ts.map +1 -0
  4. package/dist/ast/index.js +2 -0
  5. package/dist/ast/index.js.map +1 -0
  6. package/dist/ast/parser.d.ts +27 -0
  7. package/dist/ast/parser.d.ts.map +1 -0
  8. package/dist/ast/parser.js +273 -0
  9. package/dist/ast/parser.js.map +1 -0
  10. package/dist/compare.d.ts +31 -0
  11. package/dist/compare.d.ts.map +1 -0
  12. package/dist/compare.js +354 -0
  13. package/dist/compare.js.map +1 -0
  14. package/dist/context/index.d.ts +41 -0
  15. package/dist/context/index.d.ts.map +1 -0
  16. package/dist/context/index.js +253 -0
  17. package/dist/context/index.js.map +1 -0
  18. package/dist/graph/call.d.ts +63 -0
  19. package/dist/graph/call.d.ts.map +1 -0
  20. package/dist/graph/call.js +240 -0
  21. package/dist/graph/call.js.map +1 -0
  22. package/dist/graph/dependency.d.ts +52 -0
  23. package/dist/graph/dependency.d.ts.map +1 -0
  24. package/dist/graph/dependency.js +296 -0
  25. package/dist/graph/dependency.js.map +1 -0
  26. package/dist/graph/index.d.ts +3 -0
  27. package/dist/graph/index.d.ts.map +1 -0
  28. package/dist/graph/index.js +3 -0
  29. package/dist/graph/index.js.map +1 -0
  30. package/dist/index.d.ts +21 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +34 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/metrics/cognitive.d.ts +42 -0
  35. package/dist/metrics/cognitive.d.ts.map +1 -0
  36. package/dist/metrics/cognitive.js +204 -0
  37. package/dist/metrics/cognitive.js.map +1 -0
  38. package/dist/metrics/cyclomatic.d.ts +31 -0
  39. package/dist/metrics/cyclomatic.d.ts.map +1 -0
  40. package/dist/metrics/cyclomatic.js +121 -0
  41. package/dist/metrics/cyclomatic.js.map +1 -0
  42. package/dist/metrics/dimensional.d.ts +32 -0
  43. package/dist/metrics/dimensional.d.ts.map +1 -0
  44. package/dist/metrics/dimensional.js +560 -0
  45. package/dist/metrics/dimensional.js.map +1 -0
  46. package/dist/metrics/index.d.ts +26 -0
  47. package/dist/metrics/index.d.ts.map +1 -0
  48. package/dist/metrics/index.js +120 -0
  49. package/dist/metrics/index.js.map +1 -0
  50. package/dist/types.d.ts +341 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +22 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +71 -0
@@ -0,0 +1,560 @@
1
+ /**
2
+ * 차원 기반 복잡도 분석 (Dimensional Complexity)
3
+ *
4
+ * 1D: 제어 흐름 (순환복잡도 기반) - cyclomatic.ts
5
+ * 2D: 중첩 (인지복잡도 기반) - cognitive.ts
6
+ * 3D: 상태 복잡도 - 이 파일
7
+ * 4D: 비동기 복잡도 - 이 파일
8
+ * 5D: 숨은 결합 복잡도 - 이 파일
9
+ */
10
+ import * as ts from 'typescript';
11
+ // ─────────────────────────────────────────────────────────────────
12
+ // 유틸리티 함수
13
+ // ─────────────────────────────────────────────────────────────────
14
+ function getLocation(node, sourceFile) {
15
+ const { line: startLine, character: startColumn } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
16
+ const { line: endLine, character: endColumn } = sourceFile.getLineAndCharacterOfPosition(node.getEnd());
17
+ return {
18
+ filePath: sourceFile.fileName,
19
+ startLine: startLine + 1,
20
+ startColumn: startColumn + 1,
21
+ endLine: endLine + 1,
22
+ endColumn: endColumn + 1,
23
+ };
24
+ }
25
+ // ─────────────────────────────────────────────────────────────────
26
+ // 3D: 상태 복잡도 분석
27
+ // ─────────────────────────────────────────────────────────────────
28
+ /**
29
+ * 상태 복잡도 분석
30
+ */
31
+ export function analyzeStateComplexity(node, sourceFile) {
32
+ const result = {
33
+ enumStates: 0,
34
+ stateMutations: 0,
35
+ stateReads: 0,
36
+ stateBranches: 0,
37
+ stateMachinePatterns: [],
38
+ };
39
+ // 상태 관련 변수 이름 패턴
40
+ const statePatterns = /^(state|status|mode|phase|step|stage|flag|is[A-Z]|has[A-Z]|can[A-Z])/;
41
+ const stateVariables = new Set();
42
+ function visit(n) {
43
+ // 변수 선언에서 상태 변수 탐지
44
+ if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name)) {
45
+ const name = n.name.text;
46
+ if (statePatterns.test(name)) {
47
+ stateVariables.add(name);
48
+ }
49
+ // useState, useReducer 패턴
50
+ if (n.initializer && ts.isCallExpression(n.initializer)) {
51
+ const callText = n.initializer.expression.getText(sourceFile);
52
+ if (callText === 'useState' || callText === 'useReducer') {
53
+ stateVariables.add(name);
54
+ result.enumStates++;
55
+ }
56
+ }
57
+ }
58
+ // 상태 변경 탐지 (할당)
59
+ if (ts.isBinaryExpression(n) && n.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
60
+ if (ts.isIdentifier(n.left)) {
61
+ const name = n.left.text;
62
+ if (stateVariables.has(name) || statePatterns.test(name)) {
63
+ result.stateMutations++;
64
+ }
65
+ }
66
+ // setter 함수 호출 (setXxx)
67
+ if (ts.isCallExpression(n.right)) {
68
+ const callText = n.right.expression.getText(sourceFile);
69
+ if (/^set[A-Z]/.test(callText)) {
70
+ result.stateMutations++;
71
+ }
72
+ }
73
+ }
74
+ // setter 함수 호출
75
+ if (ts.isCallExpression(n)) {
76
+ const callText = n.expression.getText(sourceFile);
77
+ if (/^set[A-Z]/.test(callText)) {
78
+ result.stateMutations++;
79
+ }
80
+ }
81
+ // 상태 읽기 탐지
82
+ if (ts.isIdentifier(n) && !ts.isVariableDeclaration(n.parent)) {
83
+ const name = n.text;
84
+ if (stateVariables.has(name) || statePatterns.test(name)) {
85
+ // 할당 대상이 아닌 경우만
86
+ if (!ts.isBinaryExpression(n.parent) ||
87
+ n.parent.left !== n ||
88
+ n.parent.operatorToken.kind !== ts.SyntaxKind.EqualsToken) {
89
+ result.stateReads++;
90
+ }
91
+ }
92
+ }
93
+ // 상태 기반 분기 (switch on state)
94
+ if (ts.isSwitchStatement(n)) {
95
+ const expr = n.expression.getText(sourceFile);
96
+ if (statePatterns.test(expr) || stateVariables.has(expr)) {
97
+ result.stateBranches++;
98
+ result.stateMachinePatterns.push({
99
+ kind: 'switch-enum',
100
+ location: getLocation(n, sourceFile),
101
+ stateCount: n.caseBlock.clauses.length,
102
+ transitionCount: countTransitionsInSwitch(n, sourceFile),
103
+ });
104
+ }
105
+ }
106
+ // if 문에서 상태 체크
107
+ if (ts.isIfStatement(n)) {
108
+ const condText = n.expression.getText(sourceFile);
109
+ if (statePatterns.test(condText)) {
110
+ result.stateBranches++;
111
+ }
112
+ }
113
+ ts.forEachChild(n, visit);
114
+ }
115
+ visit(node);
116
+ return result;
117
+ }
118
+ function countTransitionsInSwitch(node, sourceFile) {
119
+ let transitions = 0;
120
+ const stateSetterPattern = /^set[A-Z]/;
121
+ function visitCase(clause) {
122
+ clause.statements.forEach((stmt) => {
123
+ const stmtText = stmt.getText(sourceFile);
124
+ if (stateSetterPattern.test(stmtText)) {
125
+ transitions++;
126
+ }
127
+ });
128
+ }
129
+ node.caseBlock.clauses.forEach(visitCase);
130
+ return transitions;
131
+ }
132
+ // ─────────────────────────────────────────────────────────────────
133
+ // 4D: 비동기 복잡도 분석
134
+ // ─────────────────────────────────────────────────────────────────
135
+ /**
136
+ * 비동기 복잡도 분석
137
+ */
138
+ export function analyzeAsyncComplexity(node, sourceFile) {
139
+ const result = {
140
+ asyncBoundaries: 0,
141
+ promiseChains: 0,
142
+ retryPatterns: 0,
143
+ timeouts: 0,
144
+ callbackDepth: 0,
145
+ concurrencyPatterns: [],
146
+ asyncErrorBoundaries: 0,
147
+ };
148
+ let maxCallbackDepth = 0;
149
+ function visit(n, callbackLevel = 0) {
150
+ // async 함수
151
+ if (ts.isFunctionDeclaration(n) || ts.isFunctionExpression(n) ||
152
+ ts.isArrowFunction(n) || ts.isMethodDeclaration(n)) {
153
+ const modifiers = ts.canHaveModifiers(n) ? ts.getModifiers(n) : undefined;
154
+ if (modifiers?.some(m => m.kind === ts.SyntaxKind.AsyncKeyword)) {
155
+ result.asyncBoundaries++;
156
+ }
157
+ }
158
+ // await 표현식
159
+ if (ts.isAwaitExpression(n)) {
160
+ result.asyncBoundaries++;
161
+ }
162
+ // Promise 체인 (.then, .catch, .finally)
163
+ if (ts.isCallExpression(n) && ts.isPropertyAccessExpression(n.expression)) {
164
+ const propName = n.expression.name.text;
165
+ if (propName === 'then' || propName === 'catch' || propName === 'finally') {
166
+ result.promiseChains++;
167
+ }
168
+ }
169
+ // 동시성 패턴 (Promise.all, Promise.race, Promise.allSettled)
170
+ if (ts.isCallExpression(n) && ts.isPropertyAccessExpression(n.expression)) {
171
+ const objText = n.expression.expression.getText(sourceFile);
172
+ const propName = n.expression.name.text;
173
+ if (objText === 'Promise') {
174
+ if (propName === 'all' || propName === 'allSettled') {
175
+ const promiseCount = countPromisesInArray(n.arguments[0]);
176
+ result.concurrencyPatterns.push({
177
+ kind: 'parallel',
178
+ location: getLocation(n, sourceFile),
179
+ promiseCount,
180
+ });
181
+ }
182
+ else if (propName === 'race') {
183
+ const promiseCount = countPromisesInArray(n.arguments[0]);
184
+ result.concurrencyPatterns.push({
185
+ kind: 'race',
186
+ location: getLocation(n, sourceFile),
187
+ promiseCount,
188
+ });
189
+ }
190
+ }
191
+ }
192
+ // 타임아웃/인터벌
193
+ if (ts.isCallExpression(n)) {
194
+ const callText = n.expression.getText(sourceFile);
195
+ if (callText === 'setTimeout' || callText === 'setInterval' ||
196
+ callText === 'requestAnimationFrame') {
197
+ result.timeouts++;
198
+ }
199
+ }
200
+ // 재시도 패턴 탐지
201
+ if (ts.isCallExpression(n)) {
202
+ const callText = n.expression.getText(sourceFile);
203
+ if (/retry|backoff|attempt/i.test(callText)) {
204
+ result.retryPatterns++;
205
+ }
206
+ }
207
+ // 콜백 깊이 추적
208
+ if (ts.isCallExpression(n)) {
209
+ n.arguments.forEach((arg) => {
210
+ if (ts.isFunctionExpression(arg) || ts.isArrowFunction(arg)) {
211
+ const newLevel = callbackLevel + 1;
212
+ maxCallbackDepth = Math.max(maxCallbackDepth, newLevel);
213
+ ts.forEachChild(arg, (child) => visit(child, newLevel));
214
+ }
215
+ else {
216
+ visit(arg, callbackLevel);
217
+ }
218
+ });
219
+ visit(n.expression, callbackLevel);
220
+ return; // 이미 자식들을 처리함
221
+ }
222
+ // async 함수 내 try-catch
223
+ if (ts.isTryStatement(n)) {
224
+ // 부모가 async 함수인지 확인
225
+ let parent = n.parent;
226
+ while (parent) {
227
+ if (ts.isFunctionDeclaration(parent) || ts.isFunctionExpression(parent) ||
228
+ ts.isArrowFunction(parent) || ts.isMethodDeclaration(parent)) {
229
+ const modifiers = ts.canHaveModifiers(parent) ? ts.getModifiers(parent) : undefined;
230
+ if (modifiers?.some(m => m.kind === ts.SyntaxKind.AsyncKeyword)) {
231
+ result.asyncErrorBoundaries++;
232
+ }
233
+ break;
234
+ }
235
+ parent = parent.parent;
236
+ }
237
+ }
238
+ ts.forEachChild(n, (child) => visit(child, callbackLevel));
239
+ }
240
+ visit(node);
241
+ result.callbackDepth = maxCallbackDepth;
242
+ return result;
243
+ }
244
+ function countPromisesInArray(node) {
245
+ if (!node)
246
+ return 0;
247
+ if (ts.isArrayLiteralExpression(node)) {
248
+ return node.elements.length;
249
+ }
250
+ return 1; // 동적 배열일 경우
251
+ }
252
+ // ─────────────────────────────────────────────────────────────────
253
+ // 5D: 숨은 결합 복잡도 분석
254
+ // ─────────────────────────────────────────────────────────────────
255
+ // 잘 알려진 전역 객체들
256
+ const GLOBAL_OBJECTS = new Set([
257
+ 'window', 'document', 'navigator', 'location', 'history',
258
+ 'console', 'localStorage', 'sessionStorage', 'fetch',
259
+ 'XMLHttpRequest', 'WebSocket', 'Worker', 'process',
260
+ 'global', 'globalThis', 'self',
261
+ ]);
262
+ // 암묵적 I/O API
263
+ const IO_APIS = {
264
+ 'console.log': 'console',
265
+ 'console.error': 'console',
266
+ 'console.warn': 'console',
267
+ 'console.info': 'console',
268
+ 'console.debug': 'console',
269
+ 'fetch': 'fetch',
270
+ 'XMLHttpRequest': 'network',
271
+ 'WebSocket': 'network',
272
+ 'localStorage.getItem': 'storage',
273
+ 'localStorage.setItem': 'storage',
274
+ 'sessionStorage.getItem': 'storage',
275
+ 'sessionStorage.setItem': 'storage',
276
+ 'document.getElementById': 'dom',
277
+ 'document.querySelector': 'dom',
278
+ 'document.querySelectorAll': 'dom',
279
+ 'document.createElement': 'dom',
280
+ };
281
+ /**
282
+ * 숨은 결합 복잡도 분석
283
+ */
284
+ export function analyzeCouplingComplexity(node, sourceFile, scopeVariables = new Set()) {
285
+ const result = {
286
+ globalAccess: [],
287
+ implicitIO: [],
288
+ sideEffects: [],
289
+ envDependency: [],
290
+ closureCaptures: [],
291
+ };
292
+ // 현재 스코프의 변수들 수집
293
+ const localVariables = new Set(scopeVariables);
294
+ function collectLocalVariables(n) {
295
+ if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name)) {
296
+ localVariables.add(n.name.text);
297
+ }
298
+ if (ts.isParameter(n) && ts.isIdentifier(n.name)) {
299
+ localVariables.add(n.name.text);
300
+ }
301
+ if (ts.isFunctionDeclaration(n) && n.name) {
302
+ localVariables.add(n.name.text);
303
+ }
304
+ }
305
+ function visit(n) {
306
+ collectLocalVariables(n);
307
+ // 전역 객체 접근
308
+ if (ts.isIdentifier(n) && GLOBAL_OBJECTS.has(n.text)) {
309
+ // 부모가 프로퍼티 접근이거나 호출인 경우
310
+ if (!localVariables.has(n.text)) {
311
+ const isWrite = isWriteAccess(n);
312
+ result.globalAccess.push({
313
+ name: n.text,
314
+ kind: 'global',
315
+ location: getLocation(n, sourceFile),
316
+ isWrite,
317
+ });
318
+ }
319
+ }
320
+ // 암묵적 I/O
321
+ if (ts.isCallExpression(n)) {
322
+ const callText = n.expression.getText(sourceFile);
323
+ for (const [api, kind] of Object.entries(IO_APIS)) {
324
+ if (callText.startsWith(api.split('.')[0]) && callText.includes(api.split('.')[1] || '')) {
325
+ result.implicitIO.push({
326
+ kind,
327
+ location: getLocation(n, sourceFile),
328
+ api: callText,
329
+ });
330
+ break;
331
+ }
332
+ }
333
+ // fetch, XMLHttpRequest 직접 호출
334
+ if (callText === 'fetch') {
335
+ result.implicitIO.push({
336
+ kind: 'fetch',
337
+ location: getLocation(n, sourceFile),
338
+ api: 'fetch',
339
+ });
340
+ }
341
+ }
342
+ // 환경 의존성
343
+ if (ts.isPropertyAccessExpression(n)) {
344
+ const objText = n.expression.getText(sourceFile);
345
+ const propName = n.name.text;
346
+ if (objText === 'process' && propName === 'env') {
347
+ result.envDependency.push({
348
+ kind: 'process-env',
349
+ location: getLocation(n, sourceFile),
350
+ property: 'env',
351
+ });
352
+ }
353
+ if (objText === 'window') {
354
+ result.envDependency.push({
355
+ kind: 'window',
356
+ location: getLocation(n, sourceFile),
357
+ property: propName,
358
+ });
359
+ }
360
+ if (objText === 'document') {
361
+ result.envDependency.push({
362
+ kind: 'document',
363
+ location: getLocation(n, sourceFile),
364
+ property: propName,
365
+ });
366
+ }
367
+ }
368
+ // 부작용 탐지
369
+ if (ts.isCallExpression(n)) {
370
+ const callText = n.expression.getText(sourceFile);
371
+ // 이벤트 등록
372
+ if (callText.includes('addEventListener') || callText.includes('on')) {
373
+ result.sideEffects.push({
374
+ kind: 'event',
375
+ location: getLocation(n, sourceFile),
376
+ target: callText,
377
+ description: 'Event listener registration',
378
+ });
379
+ }
380
+ // 구독 패턴
381
+ if (callText.includes('subscribe') || callText.includes('observe')) {
382
+ result.sideEffects.push({
383
+ kind: 'subscription',
384
+ location: getLocation(n, sourceFile),
385
+ target: callText,
386
+ description: 'Subscription pattern',
387
+ });
388
+ }
389
+ // 타이머
390
+ if (callText === 'setTimeout' || callText === 'setInterval') {
391
+ result.sideEffects.push({
392
+ kind: 'timer',
393
+ location: getLocation(n, sourceFile),
394
+ target: callText,
395
+ description: 'Timer side effect',
396
+ });
397
+ }
398
+ }
399
+ // 클로저 캡처 탐지 (함수 내부에서 외부 변수 참조)
400
+ if ((ts.isFunctionExpression(n) || ts.isArrowFunction(n)) && n.body) {
401
+ const functionLocalVars = new Set();
402
+ // 파라미터 수집
403
+ n.parameters.forEach((p) => {
404
+ if (ts.isIdentifier(p.name)) {
405
+ functionLocalVars.add(p.name.text);
406
+ }
407
+ });
408
+ const captureCheck = (inner) => {
409
+ if (ts.isVariableDeclaration(inner) && ts.isIdentifier(inner.name)) {
410
+ functionLocalVars.add(inner.name.text);
411
+ }
412
+ if (ts.isIdentifier(inner) &&
413
+ localVariables.has(inner.text) &&
414
+ !functionLocalVars.has(inner.text) &&
415
+ !GLOBAL_OBJECTS.has(inner.text)) {
416
+ result.closureCaptures.push({
417
+ variableName: inner.text,
418
+ location: getLocation(inner, sourceFile),
419
+ capturedAt: getLocation(n, sourceFile),
420
+ isMutable: isVariableMutable(inner.text, node),
421
+ });
422
+ }
423
+ ts.forEachChild(inner, captureCheck);
424
+ };
425
+ ts.forEachChild(n.body, captureCheck);
426
+ }
427
+ ts.forEachChild(n, visit);
428
+ }
429
+ visit(node);
430
+ return result;
431
+ }
432
+ function isWriteAccess(node) {
433
+ const parent = node.parent;
434
+ if (ts.isBinaryExpression(parent)) {
435
+ return parent.left === node &&
436
+ parent.operatorToken.kind === ts.SyntaxKind.EqualsToken;
437
+ }
438
+ return false;
439
+ }
440
+ function isVariableMutable(name, scope) {
441
+ let isMutable = false;
442
+ function check(n) {
443
+ if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name) && n.name.text === name) {
444
+ const parent = n.parent;
445
+ if (ts.isVariableDeclarationList(parent)) {
446
+ isMutable = !(parent.flags & ts.NodeFlags.Const);
447
+ }
448
+ }
449
+ ts.forEachChild(n, check);
450
+ }
451
+ check(scope);
452
+ return isMutable;
453
+ }
454
+ // ─────────────────────────────────────────────────────────────────
455
+ // 종합 차원 복잡도 계산
456
+ // ─────────────────────────────────────────────────────────────────
457
+ /**
458
+ * 기본 가중치
459
+ */
460
+ export const DEFAULT_WEIGHTS = {
461
+ control: 1.0,
462
+ nesting: 1.5,
463
+ state: 2.0,
464
+ async: 2.5,
465
+ coupling: 3.0,
466
+ };
467
+ /**
468
+ * 상태 복잡도를 스칼라 점수로 변환
469
+ */
470
+ function scoreStateComplexity(state) {
471
+ return (state.enumStates * 1 +
472
+ state.stateMutations * 2 +
473
+ state.stateReads * 0.5 +
474
+ state.stateBranches * 3 +
475
+ state.stateMachinePatterns.length * 5);
476
+ }
477
+ /**
478
+ * 비동기 복잡도를 스칼라 점수로 변환
479
+ */
480
+ function scoreAsyncComplexity(async) {
481
+ return (async.asyncBoundaries * 1 +
482
+ async.promiseChains * 2 +
483
+ async.retryPatterns * 3 +
484
+ async.timeouts * 2 +
485
+ async.callbackDepth * 3 +
486
+ async.concurrencyPatterns.length * 4 +
487
+ async.asyncErrorBoundaries * 1);
488
+ }
489
+ /**
490
+ * 결합 복잡도를 스칼라 점수로 변환
491
+ */
492
+ function scoreCouplingComplexity(coupling) {
493
+ return (coupling.globalAccess.length * 2 +
494
+ coupling.implicitIO.length * 2 +
495
+ coupling.sideEffects.length * 3 +
496
+ coupling.envDependency.length * 2 +
497
+ coupling.closureCaptures.length * 1);
498
+ }
499
+ /**
500
+ * 차원 기반 복잡도 전체 분석
501
+ */
502
+ export function analyzeDimensionalComplexity(node, sourceFile, cyclomatic, nestingPenalty, weights = DEFAULT_WEIGHTS) {
503
+ // 각 차원 분석
504
+ const state = analyzeStateComplexity(node, sourceFile);
505
+ const async = analyzeAsyncComplexity(node, sourceFile);
506
+ const coupling = analyzeCouplingComplexity(node, sourceFile);
507
+ // 스칼라 점수 계산
508
+ const stateScore = scoreStateComplexity(state);
509
+ const asyncScore = scoreAsyncComplexity(async);
510
+ const couplingScore = scoreCouplingComplexity(coupling);
511
+ // 가중 합산
512
+ const controlWeighted = cyclomatic * weights.control;
513
+ const nestingWeighted = nestingPenalty * weights.nesting;
514
+ const stateWeighted = stateScore * weights.state;
515
+ const asyncWeighted = asyncScore * weights.async;
516
+ const couplingWeighted = couplingScore * weights.coupling;
517
+ const totalWeighted = controlWeighted + nestingWeighted + stateWeighted + asyncWeighted + couplingWeighted;
518
+ // 기여도 계산 (0-1)
519
+ const contributions = {
520
+ control: totalWeighted > 0 ? controlWeighted / totalWeighted : 0,
521
+ nesting: totalWeighted > 0 ? nestingWeighted / totalWeighted : 0,
522
+ state: totalWeighted > 0 ? stateWeighted / totalWeighted : 0,
523
+ async: totalWeighted > 0 ? asyncWeighted / totalWeighted : 0,
524
+ coupling: totalWeighted > 0 ? couplingWeighted / totalWeighted : 0,
525
+ };
526
+ // 핫스팟 생성
527
+ const hotspots = [];
528
+ // 각 차원에서 가장 기여도 높은 항목 추출
529
+ const dimensionScores = [
530
+ { dimension: '1D-control', score: controlWeighted, reason: `${cyclomatic} branch points` },
531
+ { dimension: '2D-nesting', score: nestingWeighted, reason: `${nestingPenalty} nesting penalty` },
532
+ { dimension: '3D-state', score: stateWeighted, reason: `${state.stateMutations} mutations, ${state.stateBranches} state branches` },
533
+ { dimension: '4D-async', score: asyncWeighted, reason: `${async.asyncBoundaries} async boundaries, ${async.promiseChains} chains` },
534
+ { dimension: '5D-coupling', score: couplingWeighted, reason: `${coupling.globalAccess.length} global, ${coupling.sideEffects.length} side effects` },
535
+ ];
536
+ // 상위 3개
537
+ dimensionScores.sort((a, b) => b.score - a.score);
538
+ for (let i = 0; i < 3 && i < dimensionScores.length; i++) {
539
+ if (dimensionScores[i].score > 0) {
540
+ hotspots.push({
541
+ dimension: dimensionScores[i].dimension,
542
+ score: dimensionScores[i].score,
543
+ location: getLocation(node, sourceFile),
544
+ reason: dimensionScores[i].reason,
545
+ });
546
+ }
547
+ }
548
+ return {
549
+ control: cyclomatic,
550
+ nesting: nestingPenalty,
551
+ state,
552
+ async,
553
+ coupling,
554
+ weighted: Math.round(totalWeighted * 10) / 10,
555
+ weights,
556
+ contributions,
557
+ hotspots,
558
+ };
559
+ }
560
+ //# sourceMappingURL=dimensional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimensional.js","sourceRoot":"","sources":["../../src/metrics/dimensional.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAYjC,oEAAoE;AACpE,UAAU;AACV,oEAAoE;AAEpE,SAAS,WAAW,CAAC,IAAa,EAAE,UAAyB;IAC3D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAC/C,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACtE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAC3C,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,SAAS,EAAE,SAAS,GAAG,CAAC;QACxB,WAAW,EAAE,WAAW,GAAG,CAAC;QAC5B,OAAO,EAAE,OAAO,GAAG,CAAC;QACpB,SAAS,EAAE,SAAS,GAAG,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,gBAAgB;AAChB,oEAAoE;AAEpE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAa,EACb,UAAyB;IAEzB,MAAM,MAAM,GAAoB;QAC9B,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,oBAAoB,EAAE,EAAE;KACzB,CAAC;IAEF,iBAAiB;IACjB,MAAM,aAAa,GAAG,sEAAsE,CAAC;IAC7F,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,SAAS,KAAK,CAAC,CAAU;QACvB,mBAAmB;QACnB,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,0BAA0B;YAC1B,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC9D,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;oBACzD,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACzB,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YACnF,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzB,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzD,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,wBAAwB;YACxB,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxD,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACpB,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,gBAAgB;gBAChB,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC;oBAChC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;oBACnB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;oBAC9D,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC;oBAC/B,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM;oBACtC,eAAe,EAAE,wBAAwB,CAAC,CAAC,EAAE,UAAU,CAAC;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAwB,EAAE,UAAyB;IACnF,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,kBAAkB,GAAG,WAAW,CAAC;IAEvC,SAAS,SAAS,CAAC,MAA8B;QAC/C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,oEAAoE;AACpE,iBAAiB;AACjB,oEAAoE;AAEpE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAa,EACb,UAAyB;IAEzB,MAAM,MAAM,GAAoB;QAC9B,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,CAAC;QAChB,mBAAmB,EAAE,EAAE;QACvB,oBAAoB,EAAE,CAAC;KACxB,CAAC;IAEF,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,SAAS,KAAK,CAAC,CAAU,EAAE,gBAAwB,CAAC;QAClD,WAAW;QACX,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACzD,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,SAAS,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1E,IAAI,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChE,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QAED,uCAAuC;QACvC,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1E,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC1E,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAExC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;oBACpD,MAAM,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1D,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC;wBAC9B,IAAI,EAAE,UAAU;wBAChB,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;wBACpC,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBAC/B,MAAM,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1D,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC;wBAC9B,IAAI,EAAE,MAAM;wBACZ,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;wBACpC,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,aAAa;gBACvD,QAAQ,KAAK,uBAAuB,EAAE,CAAC;gBACzC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1B,IAAI,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5D,MAAM,QAAQ,GAAG,aAAa,GAAG,CAAC,CAAC;oBACnC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;oBACxD,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACnC,OAAO,CAAC,cAAc;QACxB,CAAC;QAED,uBAAuB;QACvB,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,oBAAoB;YACpB,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACtB,OAAO,MAAM,EAAE,CAAC;gBACd,IAAI,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC;oBACnE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjE,MAAM,SAAS,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACpF,IAAI,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;wBAChE,MAAM,CAAC,oBAAoB,EAAE,CAAC;oBAChC,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACzB,CAAC;QACH,CAAC;QAED,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,MAAM,CAAC,aAAa,GAAG,gBAAgB,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAyB;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,IAAI,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC,CAAC,YAAY;AACxB,CAAC;AAED,oEAAoE;AACpE,mBAAmB;AACnB,oEAAoE;AAEpE,eAAe;AACf,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS;IACxD,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO;IACpD,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS;IAClD,QAAQ,EAAE,YAAY,EAAE,MAAM;CAC/B,CAAC,CAAC;AAEH,cAAc;AACd,MAAM,OAAO,GAA2C;IACtD,aAAa,EAAE,SAAS;IACxB,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,SAAS;IACzB,cAAc,EAAE,SAAS;IACzB,eAAe,EAAE,SAAS;IAC1B,OAAO,EAAE,OAAO;IAChB,gBAAgB,EAAE,SAAS;IAC3B,WAAW,EAAE,SAAS;IACtB,sBAAsB,EAAE,SAAS;IACjC,sBAAsB,EAAE,SAAS;IACjC,wBAAwB,EAAE,SAAS;IACnC,wBAAwB,EAAE,SAAS;IACnC,yBAAyB,EAAE,KAAK;IAChC,wBAAwB,EAAE,KAAK;IAC/B,2BAA2B,EAAE,KAAK;IAClC,wBAAwB,EAAE,KAAK;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAa,EACb,UAAyB,EACzB,iBAA8B,IAAI,GAAG,EAAE;IAEvC,MAAM,MAAM,GAAuB;QACjC,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,EAAE;KACpB,CAAC;IAEF,iBAAiB;IACjB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAE/C,SAAS,qBAAqB,CAAC,CAAU;QACvC,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,SAAS,KAAK,CAAC,CAAU;QACvB,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzB,WAAW;QACX,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,wBAAwB;YACxB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,UAAU;QACV,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACzF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;wBACrB,IAAI;wBACJ,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;wBACpC,GAAG,EAAE,QAAQ;qBACd,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;oBACrB,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,GAAG,EAAE,OAAO;iBACb,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,SAAS;QACT,IAAI,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAE7B,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAChD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;oBACxB,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;oBACxB,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;oBACxB,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,SAAS;QACT,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAElD,SAAS;YACT,IAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;oBACtB,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,6BAA6B;iBAC3C,CAAC,CAAC;YACL,CAAC;YAED,QAAQ;YACR,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;oBACtB,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,sBAAsB;iBACpC,CAAC,CAAC;YACL,CAAC;YAED,MAAM;YACN,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;oBACtB,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;oBACpC,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,mBAAmB;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACpE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC5C,UAAU;YACV,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzB,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,CAAC,KAAc,EAAQ,EAAE;gBAC5C,IAAI,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnE,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;gBACD,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;oBACtB,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC9B,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAClC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;wBAC1B,YAAY,EAAE,KAAK,CAAC,IAAI;wBACxB,QAAQ,EAAE,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;wBACxC,UAAU,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC;wBACtC,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;qBAC/C,CAAC,CAAC;gBACL,CAAC;gBACD,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACvC,CAAC,CAAC;YAEF,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACxC,CAAC;QAED,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI;YACpB,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,KAAc;IACrD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,SAAS,KAAK,CAAC,CAAU;QACvB,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACnF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,CAAC;IACb,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,oEAAoE;AACpE,eAAe;AACf,oEAAoE;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAsB;IAClD,OAAO,CACL,KAAK,CAAC,UAAU,GAAG,CAAC;QACpB,KAAK,CAAC,cAAc,GAAG,CAAC;QACxB,KAAK,CAAC,UAAU,GAAG,GAAG;QACtB,KAAK,CAAC,aAAa,GAAG,CAAC;QACvB,KAAK,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAsB;IAClD,OAAO,CACL,KAAK,CAAC,eAAe,GAAG,CAAC;QACzB,KAAK,CAAC,aAAa,GAAG,CAAC;QACvB,KAAK,CAAC,aAAa,GAAG,CAAC;QACvB,KAAK,CAAC,QAAQ,GAAG,CAAC;QAClB,KAAK,CAAC,aAAa,GAAG,CAAC;QACvB,KAAK,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;QACpC,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,QAA4B;IAC3D,OAAO,CACL,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QAChC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC9B,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC/B,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QACjC,QAAQ,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAAa,EACb,UAAyB,EACzB,UAAkB,EAClB,cAAsB,EACtB,UAA8B,eAAe;IAE7C,UAAU;IACV,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE7D,YAAY;IACZ,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAExD,QAAQ;IACR,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IACrD,MAAM,eAAe,GAAG,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IACzD,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;IACjD,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;IACjD,MAAM,gBAAgB,GAAG,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAE1D,MAAM,aAAa,GAAG,eAAe,GAAG,eAAe,GAAG,aAAa,GAAG,aAAa,GAAG,gBAAgB,CAAC;IAE3G,eAAe;IACf,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC5D,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC5D,QAAQ,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;KACnE,CAAC;IAEF,SAAS;IACT,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAE1C,yBAAyB;IACzB,MAAM,eAAe,GAIhB;QACH,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,UAAU,gBAAgB,EAAE;QAC1F,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,cAAc,kBAAkB,EAAE;QAChG,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,eAAe,KAAK,CAAC,aAAa,iBAAiB,EAAE;QACnI,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,eAAe,sBAAsB,KAAK,CAAC,aAAa,SAAS,EAAE;QACnI,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,YAAY,QAAQ,CAAC,WAAW,CAAC,MAAM,eAAe,EAAE;KACrJ,CAAC;IAEF,QAAQ;IACR,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzD,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;gBACvC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC/B,QAAQ,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC;gBACvC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,cAAc;QACvB,KAAK;QACL,KAAK;QACL,QAAQ;QACR,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,GAAG,EAAE;QAC7C,OAAO;QACP,aAAa;QACb,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import ts from 'typescript';
2
+ import type { ComplexityResult, ExtendedComplexityResult, FileAnalysisResult, FunctionInfo, DimensionalWeights } from '../types.js';
3
+ export { calculateCyclomaticComplexity, analyzeFunctionCyclomatic, analyzeFileCyclomatic, } from './cyclomatic.js';
4
+ export { calculateCognitiveComplexity, analyzeFunctionCognitive, analyzeFileCognitive, } from './cognitive.js';
5
+ export { analyzeStateComplexity, analyzeAsyncComplexity, analyzeCouplingComplexity, analyzeDimensionalComplexity, DEFAULT_WEIGHTS, } from './dimensional.js';
6
+ /**
7
+ * 함수의 순환복잡도와 인지복잡도를 모두 계산
8
+ */
9
+ export declare function analyzeFunction(functionNode: ts.Node, sourceFile: ts.SourceFile, functionInfo: FunctionInfo): ComplexityResult;
10
+ /**
11
+ * 함수의 확장된 복잡도 분석 (차원 복잡도 포함)
12
+ */
13
+ export declare function analyzeFunctionExtended(functionNode: ts.Node, sourceFile: ts.SourceFile, functionInfo: FunctionInfo, weights?: DimensionalWeights): ExtendedComplexityResult;
14
+ /**
15
+ * 소스 파일의 모든 함수에 대한 복잡도 분석
16
+ */
17
+ export declare function analyzeFile(sourceFile: ts.SourceFile): FileAnalysisResult;
18
+ /**
19
+ * 복잡도 등급 판정
20
+ */
21
+ export declare function getComplexityGrade(cyclomatic: number, cognitive: number): 'low' | 'moderate' | 'high' | 'very-high';
22
+ /**
23
+ * 복잡도 요약 생성 (MCP용)
24
+ */
25
+ export declare function generateComplexitySummary(result: FileAnalysisResult): string;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EACV,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,EAAE,CAAC,IAAI,EACrB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,YAAY,EAAE,YAAY,GACzB,gBAAgB,CAelB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,EAAE,CAAC,IAAI,EACrB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,kBAAoC,GAC5C,wBAAwB,CA6B1B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,kBAAkB,CAsCzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAM3C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA6B5E"}