semantic-complexity 0.0.7-741984fb โ†’ 0.0.13-2aaf183b

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 +54 -0
  38. package/dist/gate/waiver.d.ts.map +1 -0
  39. package/dist/gate/waiver.js +280 -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 +140 -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
@@ -0,0 +1,415 @@
1
+ /**
2
+ * ๐Ÿž Bread Analyzer - Security & Trust Boundary (TypeScript)
3
+ *
4
+ * ๋ณด์•ˆ ๊ตฌ์กฐ ์•ˆ์ •์„ฑ ๋ถ„์„:
5
+ * - Trust boundary ํƒ์ง€
6
+ * - Auth/Authz ํ๋ฆ„ ๋ถ„์„
7
+ * - Secret ํŒจํ„ด ํƒ์ง€
8
+ * - Hidden dependencies ๊ณ„์‚ฐ
9
+ *
10
+ * TypeScript ์ „์šฉ ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ถ„์„:
11
+ * - any ํƒ€์ž… ์‚ฌ์šฉ ํƒ์ง€
12
+ * - Type assertion (as) ๋‚จ์šฉ
13
+ * - @ts-ignore, @ts-expect-error ์‚ฌ์šฉ
14
+ * - Non-null assertion (!) ๋‚จ์šฉ
15
+ * - unknown vs any ์‚ฌ์šฉ ํŒจํ„ด
16
+ */
17
+ import ts from 'typescript';
18
+ // =============================================================
19
+ // Trust Boundary Patterns (TypeScript/JavaScript)
20
+ // =============================================================
21
+ const TRUST_BOUNDARY_PATTERNS = {
22
+ marker: [
23
+ [/TRUST_BOUNDARY\s*[:=]/i, 'Trust boundary marker'],
24
+ [/\/\*\*.*TRUST.?BOUNDARY/is, 'Trust boundary JSDoc'],
25
+ [/\/\/\s*TRUST.?BOUNDARY/i, 'Trust boundary comment'],
26
+ ],
27
+ api: [
28
+ // Express/Fastify/Koa
29
+ [/\.(get|post|put|delete|patch|all)\s*\(\s*['"`]/, 'HTTP endpoint'],
30
+ [/@(Get|Post|Put|Delete|Patch|All)\s*\(/, 'NestJS endpoint'],
31
+ [/@Controller\s*\(/, 'NestJS Controller'],
32
+ // tRPC
33
+ [/\.query\s*\(|\.mutation\s*\(/, 'tRPC procedure'],
34
+ // GraphQL
35
+ [/@(Query|Mutation|Resolver)\s*\(/, 'GraphQL resolver'],
36
+ ],
37
+ auth: [
38
+ [/@(Auth|Authenticated|RequireAuth|Protected)\s*(\(|$)/i, 'Auth decorator'],
39
+ [/@(UseGuards|Guard)\s*\(.*Auth/i, 'NestJS Auth Guard'],
40
+ [/passport\.(authenticate|use)/i, 'Passport.js'],
41
+ [/verifyToken|validateToken|checkToken/i, 'Token verification'],
42
+ [/requireAuth|isAuthenticated|ensureAuth/i, 'Auth middleware'],
43
+ [/jwt\.(verify|decode|sign)/i, 'JWT operation'],
44
+ ],
45
+ network: [
46
+ [/@(RateLimit|Throttle)\s*\(/i, 'Rate limiting'],
47
+ [/helmet\s*\(/i, 'Helmet security'],
48
+ [/cors\s*\(/i, 'CORS policy'],
49
+ ],
50
+ data: [
51
+ [/@(Validate|IsString|IsNumber|IsEmail)\s*\(/i, 'class-validator'],
52
+ [/zod\.(string|number|object)|z\.(string|number|object)/i, 'Zod validation'],
53
+ [/yup\.(string|number|object)/i, 'Yup validation'],
54
+ [/sanitize|escape|encodeURI/i, 'Data sanitization'],
55
+ ],
56
+ };
57
+ // =============================================================
58
+ // Auth Explicit Patterns
59
+ // =============================================================
60
+ const AUTH_EXPLICIT_PATTERNS = [
61
+ // Explicit declarations
62
+ [/AUTH_FLOW\s*[:=]/i, 10, 'explicit AUTH_FLOW declaration'],
63
+ [/AUTH_FLOW\s*=/i, 10, 'explicit AUTH_FLOW variable'],
64
+ // Functions/classes
65
+ [/function\s+authenticate\s*\(/i, 10, 'authenticate function'],
66
+ [/function\s+authorize\s*\(/i, 10, 'authorize function'],
67
+ [/class\s+\w*Auth\w*\s*(extends|implements|{)/i, 8, 'Auth class'],
68
+ // Decorators
69
+ [/@(Auth|Authenticated|RequireAuth)\s*\(/i, 8, 'Auth decorator'],
70
+ [/@UseGuards\s*\(.*Auth/i, 8, 'NestJS Auth Guard'],
71
+ // Middleware/functions
72
+ [/verifyToken|validateToken/i, 7, 'token verification'],
73
+ [/checkPermission|hasPermission/i, 7, 'permission check'],
74
+ // Libraries
75
+ [/passport\./i, 6, 'Passport.js'],
76
+ [/jwt\./i, 5, 'JWT usage'],
77
+ [/OAuth|oauth/i, 5, 'OAuth usage'],
78
+ // Session
79
+ [/req\.session|ctx\.session/i, 3, 'session access'],
80
+ ];
81
+ // =============================================================
82
+ // Secret Patterns
83
+ // =============================================================
84
+ const SECRET_PATTERNS = [
85
+ // High - Hardcoded secrets
86
+ [/['"`]?password['"`]?\s*[:=]\s*['"`][^'"`]+['"`]/i, 'password', 'high'],
87
+ [/['"`]?api[_-]?key['"`]?\s*[:=]\s*['"`][^'"`]+['"`]/i, 'api_key', 'high'],
88
+ [/['"`]?secret['"`]?\s*[:=]\s*['"`][^'"`]+['"`]/i, 'secret', 'high'],
89
+ [/['"`]?private[_-]?key['"`]?\s*[:=]\s*['"`][^'"`]+['"`]/i, 'private_key', 'high'],
90
+ [/-----BEGIN (RSA |EC |DSA )?PRIVATE KEY-----/, 'private_key_pem', 'high'],
91
+ // High - AWS/Cloud credentials
92
+ [/AKIA[0-9A-Z]{16}/, 'aws_access_key', 'high'],
93
+ [/['"`](sk|pk)[-_](live|test)[-_][a-zA-Z0-9]+['"`]/, 'stripe_key', 'high'],
94
+ // Medium
95
+ [/['"`]?token['"`]?\s*[:=]\s*['"`][^'"`]+['"`]/i, 'token', 'medium'],
96
+ [/Bearer\s+[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_]+/, 'jwt_token', 'medium'],
97
+ // Low - Environment variable access (OK)
98
+ [/process\.env\.[A-Z_]+KEY/i, 'env_key_access', 'low'],
99
+ [/process\.env\.[A-Z_]+SECRET/i, 'env_secret_access', 'low'],
100
+ ];
101
+ // =============================================================
102
+ // Secret Leak Patterns (console output)
103
+ // =============================================================
104
+ const SECRET_LEAK_PATTERNS = [
105
+ // High - Auth/secret info in console
106
+ [/console\.(log|warn|error|info)\s*\(.*\b(password|passwd|pwd)\b/i, 'password_leak', 'high'],
107
+ [/console\.(log|warn|error|info)\s*\(.*\b(api[_-]?key|secret)\b/i, 'api_key_leak', 'high'],
108
+ [/console\.(log|warn|error|info)\s*\(.*\b(token|access[_-]?token)\b/i, 'token_leak', 'high'],
109
+ [/console\.(log|warn|error|info)\s*\(.*\b(credential|private[_-]?key)\b/i, 'credential_leak', 'high'],
110
+ // Medium
111
+ [/console\.(log|warn|error|info)\s*\(.*\b(auth|session)\b/i, 'auth_leak', 'medium'],
112
+ ];
113
+ // =============================================================
114
+ // Hidden Dependency Patterns
115
+ // =============================================================
116
+ const HIDDEN_DEP_PATTERNS = {
117
+ global: [
118
+ /\bglobal\./,
119
+ /\bglobalThis\./,
120
+ /\bwindow\./,
121
+ /\bdocument\./,
122
+ ],
123
+ env: [
124
+ /process\.env/,
125
+ /import\.meta\.env/,
126
+ /Deno\.env/,
127
+ ],
128
+ io: [
129
+ /console\.(log|warn|error|info|debug)/,
130
+ /fs\.(read|write|append|unlink|mkdir)/,
131
+ /fsPromises\./,
132
+ /fetch\s*\(/,
133
+ /axios\./,
134
+ /http\.(get|post|request)/,
135
+ ],
136
+ };
137
+ // =============================================================
138
+ // Analyzer
139
+ // =============================================================
140
+ export function analyzeBread(source, _filePath) {
141
+ const lines = source.split('\n');
142
+ const trustBoundaries = detectTrustBoundaries(lines);
143
+ const [authExplicitness, authPatterns] = analyzeAuthExplicitness(source);
144
+ const secretPatterns = detectSecrets(lines);
145
+ const hiddenDeps = countHiddenDeps(source);
146
+ // TypeScript ์ „์šฉ ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ถ„์„
147
+ const typeSafety = analyzeTypeSafety(source);
148
+ const violations = collectViolations(trustBoundaries, authExplicitness, authPatterns, secretPatterns, typeSafety);
149
+ return {
150
+ trustBoundaryCount: trustBoundaries.length,
151
+ trustBoundaries,
152
+ authExplicitness,
153
+ authPatterns,
154
+ secretPatterns,
155
+ hiddenDeps,
156
+ violations,
157
+ typeSafety,
158
+ };
159
+ }
160
+ function detectTrustBoundaries(lines) {
161
+ const boundaries = [];
162
+ lines.forEach((line, idx) => {
163
+ for (const [boundaryType, patterns] of Object.entries(TRUST_BOUNDARY_PATTERNS)) {
164
+ for (const [pattern, description] of patterns) {
165
+ if (pattern.test(line)) {
166
+ boundaries.push({
167
+ name: extractName(line),
168
+ line: idx + 1,
169
+ boundaryType: boundaryType,
170
+ description,
171
+ });
172
+ }
173
+ }
174
+ }
175
+ });
176
+ return boundaries;
177
+ }
178
+ function analyzeAuthExplicitness(source) {
179
+ let totalScore = 0;
180
+ const maxPossible = AUTH_EXPLICIT_PATTERNS.reduce((sum, [, score]) => sum + score, 0);
181
+ const patternsFound = [];
182
+ for (const [pattern, score, description] of AUTH_EXPLICIT_PATTERNS) {
183
+ if (pattern.test(source)) {
184
+ totalScore += score;
185
+ patternsFound.push(description);
186
+ }
187
+ }
188
+ const explicitness = maxPossible > 0 ? Math.min(1.0, totalScore / maxPossible) : 0;
189
+ return [explicitness, patternsFound];
190
+ }
191
+ function detectSecrets(lines) {
192
+ const secrets = [];
193
+ lines.forEach((line, idx) => {
194
+ // Hardcoded secrets
195
+ for (const [pattern, patternType, severity] of SECRET_PATTERNS) {
196
+ const match = pattern.exec(line);
197
+ if (match) {
198
+ if (severity === 'low')
199
+ continue; // env access is OK
200
+ secrets.push({
201
+ line: idx + 1,
202
+ patternType,
203
+ snippet: maskSecret(match[0]),
204
+ severity,
205
+ });
206
+ }
207
+ }
208
+ // Secret leaks in console
209
+ for (const [pattern, patternType, severity] of SECRET_LEAK_PATTERNS) {
210
+ if (pattern.test(line)) {
211
+ secrets.push({
212
+ line: idx + 1,
213
+ patternType,
214
+ snippet: line.trim().slice(0, 50),
215
+ severity,
216
+ });
217
+ }
218
+ }
219
+ });
220
+ return secrets;
221
+ }
222
+ function countHiddenDeps(source) {
223
+ const count = (patterns) => patterns.reduce((sum, p) => sum + (source.match(new RegExp(p.source, 'g')) || []).length, 0);
224
+ const global = count(HIDDEN_DEP_PATTERNS.global);
225
+ const env = count(HIDDEN_DEP_PATTERNS.env);
226
+ const io = count(HIDDEN_DEP_PATTERNS.io);
227
+ return { global, env, io, total: global + env + io };
228
+ }
229
+ function collectViolations(boundaries, authExplicitness, authPatterns, secrets, typeSafety) {
230
+ const violations = [];
231
+ if (boundaries.length === 0) {
232
+ violations.push('No trust boundary defined');
233
+ }
234
+ const authFlowDeclared = authPatterns.some(p => p.includes('AUTH_FLOW'));
235
+ if (!authFlowDeclared && authExplicitness < 0.3) {
236
+ violations.push(`Low auth explicitness: ${authExplicitness.toFixed(2)}`);
237
+ }
238
+ const highSecrets = secrets.filter(s => s.severity === 'high');
239
+ if (highSecrets.length > 0) {
240
+ violations.push(`High severity secrets detected: ${highSecrets.length}`);
241
+ }
242
+ // TypeScript ํƒ€์ž… ์•ˆ์ „์„ฑ ์œ„๋ฐ˜
243
+ if (typeSafety.anyCount > 3) {
244
+ violations.push(`Excessive 'any' usage: ${typeSafety.anyCount} occurrences`);
245
+ }
246
+ if (typeSafety.tsIgnoreCount > 0) {
247
+ violations.push(`@ts-ignore/@ts-expect-error found: ${typeSafety.tsIgnoreCount}`);
248
+ }
249
+ if (typeSafety.safetyScore < 0.5) {
250
+ violations.push(`Low type safety score: ${typeSafety.safetyScore.toFixed(2)}`);
251
+ }
252
+ return violations;
253
+ }
254
+ function extractName(line) {
255
+ // Function/class name
256
+ const funcMatch = /function\s+(\w+)|class\s+(\w+)|const\s+(\w+)\s*=/.exec(line);
257
+ if (funcMatch) {
258
+ return funcMatch[1] || funcMatch[2] || funcMatch[3];
259
+ }
260
+ // Decorator
261
+ const decMatch = /@(\w+)/.exec(line);
262
+ if (decMatch) {
263
+ return decMatch[1];
264
+ }
265
+ return line.trim().slice(0, 30);
266
+ }
267
+ function maskSecret(secret) {
268
+ if (secret.length <= 8) {
269
+ return '*'.repeat(secret.length);
270
+ }
271
+ return secret.slice(0, 4) + '*'.repeat(secret.length - 4);
272
+ }
273
+ /**
274
+ * any ํƒ€์ž… ์‚ฌ์šฉ ๊ฐ์ง€ (๊ฐœ๋… ์ˆ˜ ~7)
275
+ */
276
+ function detectAnyUsage(sourceFile) {
277
+ const locations = [];
278
+ let count = 0;
279
+ let unknownCount = 0;
280
+ function visit(node) {
281
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
282
+ if (ts.isTypeReferenceNode(node) && node.getText(sourceFile) === 'any') {
283
+ count++;
284
+ locations.push({
285
+ line: line + 1,
286
+ column: character + 1,
287
+ code: node.parent.getText(sourceFile).slice(0, 50),
288
+ reason: 'Explicit any type',
289
+ });
290
+ }
291
+ if (node.kind === ts.SyntaxKind.AnyKeyword) {
292
+ count++;
293
+ locations.push({
294
+ line: line + 1,
295
+ column: character + 1,
296
+ code: node.parent.getText(sourceFile).slice(0, 50),
297
+ reason: 'any keyword in type annotation',
298
+ });
299
+ }
300
+ if (node.kind === ts.SyntaxKind.UnknownKeyword) {
301
+ unknownCount++;
302
+ }
303
+ ts.forEachChild(node, visit);
304
+ }
305
+ visit(sourceFile);
306
+ return { count, locations, unknownCount };
307
+ }
308
+ /**
309
+ * Type assertion ๊ฐ์ง€ (๊ฐœ๋… ์ˆ˜ ~8)
310
+ */
311
+ function detectTypeAssertions(sourceFile) {
312
+ const locations = [];
313
+ let count = 0;
314
+ let nonNullCount = 0;
315
+ function visit(node) {
316
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
317
+ if (ts.isAsExpression(node)) {
318
+ count++;
319
+ const typeText = node.type.getText(sourceFile);
320
+ const severity = typeText === 'any' ? 'as any (dangerous)' : 'type assertion';
321
+ locations.push({
322
+ line: line + 1,
323
+ column: character + 1,
324
+ code: node.getText(sourceFile).slice(0, 50),
325
+ reason: severity,
326
+ });
327
+ }
328
+ if (ts.isTypeAssertionExpression(node)) {
329
+ count++;
330
+ locations.push({
331
+ line: line + 1,
332
+ column: character + 1,
333
+ code: node.getText(sourceFile).slice(0, 50),
334
+ reason: 'angle-bracket assertion',
335
+ });
336
+ }
337
+ if (ts.isNonNullExpression(node)) {
338
+ nonNullCount++;
339
+ }
340
+ ts.forEachChild(node, visit);
341
+ }
342
+ visit(sourceFile);
343
+ return { count, locations, nonNullCount };
344
+ }
345
+ /**
346
+ * ํƒ€์ž… ์•ˆ์ „์„ฑ ์ ์ˆ˜ ๊ณ„์‚ฐ (๊ฐœ๋… ์ˆ˜ ~5)
347
+ */
348
+ function calculateTypeSafetyScore(anyCount, assertionCount, nonNullCount, tsIgnoreCount, unknownCount) {
349
+ const penalties = anyCount * 0.1 +
350
+ assertionCount * 0.05 +
351
+ nonNullCount * 0.02 +
352
+ tsIgnoreCount * 0.15;
353
+ const bonuses = unknownCount * 0.05;
354
+ return Math.max(0, Math.min(1, 1 - penalties + bonuses));
355
+ }
356
+ /**
357
+ * ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ถ„์„ ๋ฉ”์ธ (๊ฐœ๋… ์ˆ˜ ~8) - ์กฐํ•ฉ๋งŒ ์ˆ˜ํ–‰
358
+ */
359
+ function analyzeTypeSafety(source) {
360
+ const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
361
+ const tsIgnoreLocations = [];
362
+ const anyResult = detectAnyUsage(sourceFile);
363
+ const assertionResult = detectTypeAssertions(sourceFile);
364
+ const tsIgnoreCount = countTsIgnoreComments(source, tsIgnoreLocations);
365
+ const safetyScore = calculateTypeSafetyScore(anyResult.count, assertionResult.count, assertionResult.nonNullCount, tsIgnoreCount, anyResult.unknownCount);
366
+ return {
367
+ anyCount: anyResult.count,
368
+ anyLocations: anyResult.locations,
369
+ assertionCount: assertionResult.count,
370
+ assertionLocations: assertionResult.locations,
371
+ nonNullAssertionCount: assertionResult.nonNullCount,
372
+ tsIgnoreCount,
373
+ tsIgnoreLocations,
374
+ unknownCount: anyResult.unknownCount,
375
+ safetyScore,
376
+ };
377
+ }
378
+ function countTsIgnoreComments(source, locations) {
379
+ const lines = source.split('\n');
380
+ let count = 0;
381
+ lines.forEach((line, idx) => {
382
+ // @ts-ignore
383
+ if (/@ts-ignore/.test(line)) {
384
+ count++;
385
+ locations.push({
386
+ line: idx + 1,
387
+ column: line.indexOf('@ts-ignore') + 1,
388
+ code: line.trim().slice(0, 50),
389
+ reason: '@ts-ignore suppresses type checking',
390
+ });
391
+ }
392
+ // ts-expect-error directive
393
+ if (/@ts-expect-error/.test(line)) {
394
+ count++;
395
+ locations.push({
396
+ line: idx + 1,
397
+ column: line.indexOf('@ts-expect-error') + 1,
398
+ code: line.trim().slice(0, 50),
399
+ reason: '@ts-expect-error suppresses type checking',
400
+ });
401
+ }
402
+ // @ts-nocheck (whole file)
403
+ if (/@ts-nocheck/.test(line)) {
404
+ count += 5; // Heavy penalty for disabling entire file
405
+ locations.push({
406
+ line: idx + 1,
407
+ column: line.indexOf('@ts-nocheck') + 1,
408
+ code: line.trim().slice(0, 50),
409
+ reason: '@ts-nocheck disables type checking for entire file',
410
+ });
411
+ }
412
+ });
413
+ return count;
414
+ }
415
+ //# sourceMappingURL=bread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bread.js","sourceRoot":"","sources":["../../src/analyzers/bread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * ๐Ÿง€ Cheese Analyzer - Cognitive Accessibility (TypeScript)
3
+ *
4
+ * ์ธ์ง€ ๊ฐ€๋Šฅ ์กฐ๊ฑด (4๊ฐ€์ง€ ๋ชจ๋‘ ์ถฉ์กฑ):
5
+ * 1. ์ค‘์ฒฉ ๊นŠ์ด โ‰ค 4
6
+ * 2. ๊ฐœ๋… ์ˆ˜ โ‰ค 9/ํ•จ์ˆ˜ (Miller's Law: 7ยฑ2)
7
+ * 3. ์ˆจ๊ฒจ์ง„ ์˜์กด์„ฑ โ‰ค 2
8
+ * 4. stateร—asyncร—retry 2๊ฐœ ์ด์ƒ ๊ณต์กด ๊ธˆ์ง€
9
+ *
10
+ * TypeScript ์ „์šฉ ๋ณต์žก๋„ ๋ถ„์„:
11
+ * - ์ œ๋„ค๋ฆญ ๋ณต์žก๋„ (ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜, constraints, nested)
12
+ * - ์œ ๋‹ˆ์˜จ/์ธํ„ฐ์„น์…˜ ํƒ€์ž… ๋ณต์žก๋„
13
+ * - ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ๋ณต์žก๋„
14
+ * - ๋งคํ•‘ ํƒ€์ž… ๋ณต์žก๋„
15
+ * - ํƒ€์ž… ๊ฐ€๋“œ ๋ณต์žก๋„
16
+ * - ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์Šคํƒ ๋ณต์žก๋„
17
+ *
18
+ * Anti-pattern Penalty (TypeScript):
19
+ * - Rest parameters (...args) โ†’ +3 ๊ฐœ๋…
20
+ * - Object spread for config bundling โ†’ +3 ๊ฐœ๋…
21
+ * - Complex generics (>3 params or nested) โ†’ +2 per level
22
+ * - Deep union types (>4 members) โ†’ +1 per extra
23
+ * - Conditional type chains โ†’ +2 per level
24
+ */
25
+ export interface CheeseResult {
26
+ accessible: boolean;
27
+ reason: string;
28
+ violations: string[];
29
+ maxNesting: number;
30
+ adjustedNesting: number;
31
+ functions: FunctionInfo[];
32
+ hiddenDependencies: number;
33
+ stateAsyncRetry: StateAsyncRetry;
34
+ config: CognitiveConfig;
35
+ typeComplexity: TypeComplexity;
36
+ frameworkInfo: FrameworkInfo;
37
+ }
38
+ export interface FrameworkInfo {
39
+ detected: FrameworkType;
40
+ config: FrameworkConfig;
41
+ jsxNestingDepth: number;
42
+ logicNestingDepth: number;
43
+ hookCount: number;
44
+ chainCount: number;
45
+ adjustments: FrameworkAdjustment[];
46
+ }
47
+ export interface FrameworkAdjustment {
48
+ type: 'jsx_nesting' | 'hook' | 'chain' | 'props';
49
+ original: number;
50
+ adjusted: number;
51
+ reason: string;
52
+ }
53
+ export interface TypeComplexity {
54
+ generics: GenericComplexity;
55
+ unions: UnionComplexity;
56
+ conditionalTypes: number;
57
+ mappedTypes: number;
58
+ typeGuards: number;
59
+ decoratorStacks: number;
60
+ totalPenalty: number;
61
+ }
62
+ export interface GenericComplexity {
63
+ count: number;
64
+ maxParams: number;
65
+ maxDepth: number;
66
+ constrainedCount: number;
67
+ penalty: number;
68
+ }
69
+ export interface UnionComplexity {
70
+ count: number;
71
+ maxMembers: number;
72
+ intersectionCount: number;
73
+ penalty: number;
74
+ }
75
+ export interface FunctionInfo {
76
+ name: string;
77
+ line: number;
78
+ conceptCount: number;
79
+ rawConceptCount: number;
80
+ concepts: string[];
81
+ antiPatterns: AntiPatternPenalty[];
82
+ }
83
+ export interface StateAsyncRetry {
84
+ hasState: boolean;
85
+ hasAsync: boolean;
86
+ hasRetry: boolean;
87
+ axes: string[];
88
+ count: number;
89
+ violated: boolean;
90
+ }
91
+ export interface AntiPatternPenalty {
92
+ pattern: string;
93
+ penalty: number;
94
+ reason: string;
95
+ }
96
+ export interface CognitiveConfig {
97
+ nestingThreshold: number;
98
+ conceptsPerFunction: number;
99
+ hiddenDepThreshold: number;
100
+ framework?: FrameworkType;
101
+ }
102
+ export type FrameworkType = 'react' | 'vue' | 'angular' | 'svelte' | 'none';
103
+ export interface FrameworkConfig {
104
+ name: FrameworkType;
105
+ jsxNestingWeight: number;
106
+ hookConceptWeight: number;
107
+ chainMethodWeight: number;
108
+ propsDestructureWeight: number;
109
+ }
110
+ export declare function analyzeCheese(source: string, config?: CognitiveConfig): CheeseResult;
111
+ //# sourceMappingURL=cheese.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cheese.d.ts","sourceRoot":"","sources":["../../src/analyzers/cheese.ts"],"names":[],"mappings":"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"}