@kevinrabun/judges 1.0.0

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 (167) hide show
  1. package/README.md +174 -0
  2. package/dist/evaluators/accessibility.d.ts +3 -0
  3. package/dist/evaluators/accessibility.d.ts.map +1 -0
  4. package/dist/evaluators/accessibility.js +306 -0
  5. package/dist/evaluators/accessibility.js.map +1 -0
  6. package/dist/evaluators/api-design.d.ts +3 -0
  7. package/dist/evaluators/api-design.d.ts.map +1 -0
  8. package/dist/evaluators/api-design.js +224 -0
  9. package/dist/evaluators/api-design.js.map +1 -0
  10. package/dist/evaluators/cloud-readiness.d.ts +3 -0
  11. package/dist/evaluators/cloud-readiness.d.ts.map +1 -0
  12. package/dist/evaluators/cloud-readiness.js +181 -0
  13. package/dist/evaluators/cloud-readiness.js.map +1 -0
  14. package/dist/evaluators/compliance.d.ts +3 -0
  15. package/dist/evaluators/compliance.d.ts.map +1 -0
  16. package/dist/evaluators/compliance.js +213 -0
  17. package/dist/evaluators/compliance.js.map +1 -0
  18. package/dist/evaluators/concurrency.d.ts +3 -0
  19. package/dist/evaluators/concurrency.d.ts.map +1 -0
  20. package/dist/evaluators/concurrency.js +220 -0
  21. package/dist/evaluators/concurrency.js.map +1 -0
  22. package/dist/evaluators/cost-effectiveness.d.ts +3 -0
  23. package/dist/evaluators/cost-effectiveness.d.ts.map +1 -0
  24. package/dist/evaluators/cost-effectiveness.js +206 -0
  25. package/dist/evaluators/cost-effectiveness.js.map +1 -0
  26. package/dist/evaluators/cybersecurity.d.ts +3 -0
  27. package/dist/evaluators/cybersecurity.d.ts.map +1 -0
  28. package/dist/evaluators/cybersecurity.js +282 -0
  29. package/dist/evaluators/cybersecurity.js.map +1 -0
  30. package/dist/evaluators/data-security.d.ts +3 -0
  31. package/dist/evaluators/data-security.d.ts.map +1 -0
  32. package/dist/evaluators/data-security.js +286 -0
  33. package/dist/evaluators/data-security.js.map +1 -0
  34. package/dist/evaluators/dependency-health.d.ts +3 -0
  35. package/dist/evaluators/dependency-health.d.ts.map +1 -0
  36. package/dist/evaluators/dependency-health.js +197 -0
  37. package/dist/evaluators/dependency-health.js.map +1 -0
  38. package/dist/evaluators/documentation.d.ts +3 -0
  39. package/dist/evaluators/documentation.d.ts.map +1 -0
  40. package/dist/evaluators/documentation.js +216 -0
  41. package/dist/evaluators/documentation.js.map +1 -0
  42. package/dist/evaluators/ethics-bias.d.ts +3 -0
  43. package/dist/evaluators/ethics-bias.d.ts.map +1 -0
  44. package/dist/evaluators/ethics-bias.js +205 -0
  45. package/dist/evaluators/ethics-bias.js.map +1 -0
  46. package/dist/evaluators/index.d.ts +12 -0
  47. package/dist/evaluators/index.d.ts.map +1 -0
  48. package/dist/evaluators/index.js +127 -0
  49. package/dist/evaluators/index.js.map +1 -0
  50. package/dist/evaluators/internationalization.d.ts +3 -0
  51. package/dist/evaluators/internationalization.d.ts.map +1 -0
  52. package/dist/evaluators/internationalization.js +176 -0
  53. package/dist/evaluators/internationalization.js.map +1 -0
  54. package/dist/evaluators/observability.d.ts +3 -0
  55. package/dist/evaluators/observability.d.ts.map +1 -0
  56. package/dist/evaluators/observability.js +171 -0
  57. package/dist/evaluators/observability.js.map +1 -0
  58. package/dist/evaluators/performance.d.ts +3 -0
  59. package/dist/evaluators/performance.d.ts.map +1 -0
  60. package/dist/evaluators/performance.js +306 -0
  61. package/dist/evaluators/performance.js.map +1 -0
  62. package/dist/evaluators/reliability.d.ts +3 -0
  63. package/dist/evaluators/reliability.d.ts.map +1 -0
  64. package/dist/evaluators/reliability.js +215 -0
  65. package/dist/evaluators/reliability.js.map +1 -0
  66. package/dist/evaluators/scalability.d.ts +3 -0
  67. package/dist/evaluators/scalability.d.ts.map +1 -0
  68. package/dist/evaluators/scalability.js +171 -0
  69. package/dist/evaluators/scalability.js.map +1 -0
  70. package/dist/evaluators/shared.d.ts +18 -0
  71. package/dist/evaluators/shared.d.ts.map +1 -0
  72. package/dist/evaluators/shared.js +147 -0
  73. package/dist/evaluators/shared.js.map +1 -0
  74. package/dist/evaluators/software-practices.d.ts +3 -0
  75. package/dist/evaluators/software-practices.d.ts.map +1 -0
  76. package/dist/evaluators/software-practices.js +272 -0
  77. package/dist/evaluators/software-practices.js.map +1 -0
  78. package/dist/evaluators/testing.d.ts +3 -0
  79. package/dist/evaluators/testing.d.ts.map +1 -0
  80. package/dist/evaluators/testing.js +185 -0
  81. package/dist/evaluators/testing.js.map +1 -0
  82. package/dist/index.d.ts +16 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +238 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/judges/accessibility.d.ts +3 -0
  87. package/dist/judges/accessibility.d.ts.map +1 -0
  88. package/dist/judges/accessibility.js +28 -0
  89. package/dist/judges/accessibility.js.map +1 -0
  90. package/dist/judges/api-design.d.ts +3 -0
  91. package/dist/judges/api-design.d.ts.map +1 -0
  92. package/dist/judges/api-design.js +30 -0
  93. package/dist/judges/api-design.js.map +1 -0
  94. package/dist/judges/cloud-readiness.d.ts +3 -0
  95. package/dist/judges/cloud-readiness.d.ts.map +1 -0
  96. package/dist/judges/cloud-readiness.js +28 -0
  97. package/dist/judges/cloud-readiness.js.map +1 -0
  98. package/dist/judges/compliance.d.ts +3 -0
  99. package/dist/judges/compliance.d.ts.map +1 -0
  100. package/dist/judges/compliance.js +28 -0
  101. package/dist/judges/compliance.js.map +1 -0
  102. package/dist/judges/concurrency.d.ts +3 -0
  103. package/dist/judges/concurrency.d.ts.map +1 -0
  104. package/dist/judges/concurrency.js +30 -0
  105. package/dist/judges/concurrency.js.map +1 -0
  106. package/dist/judges/cost-effectiveness.d.ts +3 -0
  107. package/dist/judges/cost-effectiveness.d.ts.map +1 -0
  108. package/dist/judges/cost-effectiveness.js +27 -0
  109. package/dist/judges/cost-effectiveness.js.map +1 -0
  110. package/dist/judges/cybersecurity.d.ts +3 -0
  111. package/dist/judges/cybersecurity.d.ts.map +1 -0
  112. package/dist/judges/cybersecurity.js +27 -0
  113. package/dist/judges/cybersecurity.js.map +1 -0
  114. package/dist/judges/data-security.d.ts +3 -0
  115. package/dist/judges/data-security.d.ts.map +1 -0
  116. package/dist/judges/data-security.js +25 -0
  117. package/dist/judges/data-security.js.map +1 -0
  118. package/dist/judges/dependency-health.d.ts +3 -0
  119. package/dist/judges/dependency-health.d.ts.map +1 -0
  120. package/dist/judges/dependency-health.js +30 -0
  121. package/dist/judges/dependency-health.js.map +1 -0
  122. package/dist/judges/documentation.d.ts +3 -0
  123. package/dist/judges/documentation.d.ts.map +1 -0
  124. package/dist/judges/documentation.js +30 -0
  125. package/dist/judges/documentation.js.map +1 -0
  126. package/dist/judges/ethics-bias.d.ts +3 -0
  127. package/dist/judges/ethics-bias.d.ts.map +1 -0
  128. package/dist/judges/ethics-bias.js +30 -0
  129. package/dist/judges/ethics-bias.js.map +1 -0
  130. package/dist/judges/index.d.ts +23 -0
  131. package/dist/judges/index.d.ts.map +1 -0
  132. package/dist/judges/index.js +63 -0
  133. package/dist/judges/index.js.map +1 -0
  134. package/dist/judges/internationalization.d.ts +3 -0
  135. package/dist/judges/internationalization.d.ts.map +1 -0
  136. package/dist/judges/internationalization.js +28 -0
  137. package/dist/judges/internationalization.js.map +1 -0
  138. package/dist/judges/observability.d.ts +3 -0
  139. package/dist/judges/observability.d.ts.map +1 -0
  140. package/dist/judges/observability.js +28 -0
  141. package/dist/judges/observability.js.map +1 -0
  142. package/dist/judges/performance.d.ts +3 -0
  143. package/dist/judges/performance.d.ts.map +1 -0
  144. package/dist/judges/performance.js +30 -0
  145. package/dist/judges/performance.js.map +1 -0
  146. package/dist/judges/reliability.d.ts +3 -0
  147. package/dist/judges/reliability.d.ts.map +1 -0
  148. package/dist/judges/reliability.js +30 -0
  149. package/dist/judges/reliability.js.map +1 -0
  150. package/dist/judges/scalability.d.ts +3 -0
  151. package/dist/judges/scalability.d.ts.map +1 -0
  152. package/dist/judges/scalability.js +28 -0
  153. package/dist/judges/scalability.js.map +1 -0
  154. package/dist/judges/software-practices.d.ts +3 -0
  155. package/dist/judges/software-practices.d.ts.map +1 -0
  156. package/dist/judges/software-practices.js +30 -0
  157. package/dist/judges/software-practices.js.map +1 -0
  158. package/dist/judges/testing.d.ts +3 -0
  159. package/dist/judges/testing.d.ts.map +1 -0
  160. package/dist/judges/testing.js +30 -0
  161. package/dist/judges/testing.js.map +1 -0
  162. package/dist/types.d.ts +80 -0
  163. package/dist/types.d.ts.map +1 -0
  164. package/dist/types.js +2 -0
  165. package/dist/types.js.map +1 -0
  166. package/package.json +53 -0
  167. package/server.json +21 -0
@@ -0,0 +1,206 @@
1
+ import { getLineNumbers } from "./shared.js";
2
+ export function analyzeCostEffectiveness(code, language) {
3
+ const findings = [];
4
+ let ruleNum = 1;
5
+ const prefix = "COST";
6
+ // Nested loops (potential O(n²))
7
+ const lines = code.split("\n");
8
+ let loopDepth = 0;
9
+ const nestedLoopLines = [];
10
+ for (let i = 0; i < lines.length; i++) {
11
+ if (/\b(?:for|while)\s*\(/.test(lines[i])) {
12
+ loopDepth++;
13
+ if (loopDepth >= 2) {
14
+ nestedLoopLines.push(i + 1);
15
+ }
16
+ }
17
+ if (/\}/.test(lines[i]) && loopDepth > 0) {
18
+ loopDepth--;
19
+ }
20
+ }
21
+ if (nestedLoopLines.length > 0) {
22
+ findings.push({
23
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
24
+ severity: "medium",
25
+ title: "Nested loops detected — potential O(n²) complexity",
26
+ description: "Nested loops can lead to quadratic or worse time complexity. At scale, this causes dramatically increased compute costs and response times.",
27
+ lineNumbers: nestedLoopLines,
28
+ recommendation: "Consider using hash maps for lookups (O(1)), sorting + binary search, or restructuring the algorithm. If the nested loop is necessary, ensure the inner dataset is bounded.",
29
+ reference: "Algorithm Efficiency Best Practices",
30
+ });
31
+ }
32
+ // N+1 query patterns (loop with await inside)
33
+ const awaitInLoopPattern = /(?:for|while|\.forEach|\.map)\s*\([\s\S]*?await\s/gi;
34
+ if (awaitInLoopPattern.test(code)) {
35
+ findings.push({
36
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
37
+ severity: "high",
38
+ title: "Potential N+1 query pattern (await in loop)",
39
+ description: "An await call inside a loop suggests sequential asynchronous operations that could be batched. This causes N+1 performance problems and increased latency/cost.",
40
+ recommendation: "Use Promise.all() to parallelize independent operations, or batch database queries (e.g., WHERE id IN (...) instead of per-ID queries).",
41
+ reference: "Database Performance Anti-Patterns",
42
+ });
43
+ }
44
+ // Unbounded data fetching
45
+ const unboundedPattern = /\.find\s*\(\s*\{\s*\}\s*\)|SELECT\s+\*\s+FROM(?!\s+.*(?:WHERE|LIMIT))|\.findAll\s*\(\s*\)|\.objects\.all\(\)|\.ToList\s*\(\s*\)/gi;
46
+ const unboundedLines = getLineNumbers(code, unboundedPattern);
47
+ if (unboundedLines.length > 0) {
48
+ findings.push({
49
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
50
+ severity: "medium",
51
+ title: "Unbounded data query",
52
+ description: "A query fetches all records without filtering or pagination. With growing data, this will consume excessive memory, bandwidth, and compute.",
53
+ lineNumbers: unboundedLines,
54
+ recommendation: "Add pagination (LIMIT/OFFSET or cursor-based), filtering (WHERE clauses), and projection (select only needed fields). Default to a reasonable page size.",
55
+ reference: "Database Query Optimization",
56
+ });
57
+ }
58
+ // Large synchronous file reads (multi-language)
59
+ const syncReadPattern = /readFileSync|readSync|fs\.readFile\s*\(\s*[^,]+\s*\)|open\s*\(.*\)\.read\(\)|File\.ReadAllText|File\.ReadAllLines|File\.ReadAllBytes|ioutil\.ReadFile/gi;
60
+ const syncReadLines = getLineNumbers(code, syncReadPattern);
61
+ if (syncReadLines.length > 0) {
62
+ findings.push({
63
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
64
+ severity: "low",
65
+ title: "Synchronous/blocking file I/O detected",
66
+ description: "Synchronous file operations block the event loop or thread, reducing throughput and wasting compute resources — especially costly in serverless environments billed per-ms.",
67
+ lineNumbers: syncReadLines,
68
+ recommendation: "Use asynchronous file operations (fs.promises.readFile, aiofiles, async File.ReadAllTextAsync) or streaming for large files.",
69
+ reference: "I/O Performance Best Practices",
70
+ });
71
+ }
72
+ // No caching hints
73
+ const hasCaching = /cache|redis|memcached|lru|memoize|Cache-Control|@Cacheable|functools\.lru_cache|@cache/gi.test(code);
74
+ if (!hasCaching && code.split("\n").length > 50) {
75
+ findings.push({
76
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
77
+ severity: "info",
78
+ title: "No caching strategy detected",
79
+ description: "The code has no apparent caching mechanism. For read-heavy workloads, caching can significantly reduce compute costs and latency.",
80
+ recommendation: "Consider adding caching at appropriate layers: in-memory (LRU), distributed (Redis/Memcached), or HTTP (Cache-Control headers).",
81
+ reference: "Caching Best Practices",
82
+ });
83
+ }
84
+ // String concatenation in loops (Java/C#/Python)
85
+ const strConcatLoopLines = [];
86
+ lines.forEach((line, i) => {
87
+ if (/\b(?:for|while)\s*[\s(]/.test(line)) {
88
+ const loopBody = lines.slice(i + 1, Math.min(lines.length, i + 10)).join("\n");
89
+ if (/\+=\s*["']|\+\s*=\s*str|\.concat\s*\(|String\s*\+/i.test(loopBody)) {
90
+ strConcatLoopLines.push(i + 1);
91
+ }
92
+ }
93
+ });
94
+ if (strConcatLoopLines.length > 0) {
95
+ findings.push({
96
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
97
+ severity: "medium",
98
+ title: "String concatenation inside loop",
99
+ description: "String concatenation in loops creates many intermediate string objects (especially in Java/C#/Python), leading to O(n²) memory allocation.",
100
+ lineNumbers: strConcatLoopLines,
101
+ recommendation: "Use StringBuilder (Java/C#), list with join (Python), or array with join (JavaScript) for building strings in loops.",
102
+ reference: "String Performance Optimization",
103
+ });
104
+ }
105
+ // Over-logging in production paths
106
+ const logLines = getLineNumbers(code, /console\.(log|info|debug|warn|trace)\s*\(|logger\.(log|info|debug|trace)\s*\(|print\s*\(|fmt\.Print/gi);
107
+ if (logLines.length > 15) {
108
+ findings.push({
109
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
110
+ severity: "low",
111
+ title: "Excessive logging may increase costs",
112
+ description: `Found ${logLines.length} log statements. Excessive logging in cloud environments increases storage and log ingestion costs (CloudWatch, Azure Monitor, Datadog).`,
113
+ lineNumbers: logLines.slice(0, 5),
114
+ recommendation: "Use appropriate log levels. Set DEBUG/TRACE only in development. Use sampling for high-frequency operations. Estimate log volume costs.",
115
+ reference: "Cloud Logging Cost Optimization",
116
+ });
117
+ }
118
+ // Unnecessary object creation / deep cloning
119
+ const deepCloneLines = getLineNumbers(code, /JSON\.parse\s*\(\s*JSON\.stringify|structuredClone|cloneDeep|\.deepCopy|copy\.deepcopy/gi);
120
+ if (deepCloneLines.length > 0) {
121
+ findings.push({
122
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
123
+ severity: "low",
124
+ title: "Deep cloning may be unnecessary",
125
+ description: "Deep cloning (JSON.parse(JSON.stringify(...)), structuredClone, cloneDeep) is expensive. Ensure it's necessary and not used on large objects in hot paths.",
126
+ lineNumbers: deepCloneLines,
127
+ recommendation: "Consider shallow copies (spread operator, Object.assign) when deep cloning isn't needed. Use immutable data structures if cloning is for safety.",
128
+ reference: "Memory Efficiency Patterns",
129
+ });
130
+ }
131
+ // Eager loading / over-fetching
132
+ const eagerLoadLines = getLineNumbers(code, /\.include\s*\(|\.populate\s*\(|\.eager\s*\(|\.prefetch_related|\.select_related|Include\s*\(|ThenInclude/gi);
133
+ if (eagerLoadLines.length > 3) {
134
+ findings.push({
135
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
136
+ severity: "medium",
137
+ title: "Excessive eager loading / data over-fetching",
138
+ description: `Found ${eagerLoadLines.length} eager-loading directives. Loading too many relations eagerly wastes memory and bandwidth when the data isn't always needed.`,
139
+ lineNumbers: eagerLoadLines.slice(0, 5),
140
+ recommendation: "Use lazy loading for optional relations. Load only what's needed for each use case. Consider GraphQL or sparse fieldsets for flexible fetching.",
141
+ reference: "ORM Performance Optimization",
142
+ });
143
+ }
144
+ // Uncompressed responses
145
+ const hasCompression = /compression|gzip|deflate|brotli|Content-Encoding|Accept-Encoding|UseResponseCompression/gi.test(code);
146
+ const hasServer = /app\.(listen|use)|createServer|express\(\)|Flask|Django|WebApplication/gi.test(code);
147
+ if (hasServer && !hasCompression) {
148
+ findings.push({
149
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
150
+ severity: "low",
151
+ title: "No response compression configured",
152
+ description: "HTTP server code without compression middleware. Compressed responses can reduce bandwidth costs by 60-80% for text-based payloads.",
153
+ recommendation: "Enable gzip/brotli compression (compression middleware for Express, GzipMiddleware for Django, UseResponseCompression in ASP.NET).",
154
+ reference: "HTTP Compression Best Practices",
155
+ });
156
+ }
157
+ // Missing connection pooling
158
+ const hasDbConnection = /createConnection|new\s+Client\s*\(|MongoClient|DriverManager\.getConnection|SqlConnection|psycopg2\.connect|mysql\.connector/gi.test(code);
159
+ const hasPooling = /Pool|pool|createPool|connection_pool|pooling|DataSource|HikariCP/gi.test(code);
160
+ if (hasDbConnection && !hasPooling) {
161
+ findings.push({
162
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
163
+ severity: "high",
164
+ title: "Database connections without pooling",
165
+ description: "Creating individual database connections per request is expensive. Connection establishment overhead can dominate query time in cloud environments.",
166
+ recommendation: "Use connection pooling (pg Pool, HikariCP, SqlAlchemy pool, ADO.NET connection pooling). Set appropriate min/max pool sizes.",
167
+ reference: "Database Connection Pooling Best Practices",
168
+ });
169
+ }
170
+ // Redundant data transformations
171
+ const multiMapLines = [];
172
+ lines.forEach((line, i) => {
173
+ if (/\.map\s*\(/.test(line)) {
174
+ const nextLines = lines.slice(i + 1, Math.min(lines.length, i + 3)).join("\n");
175
+ if (/\.map\s*\(|\.filter\s*\(/.test(nextLines)) {
176
+ multiMapLines.push(i + 1);
177
+ }
178
+ }
179
+ });
180
+ if (multiMapLines.length > 0) {
181
+ findings.push({
182
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
183
+ severity: "low",
184
+ title: "Chained array transformations",
185
+ description: "Multiple chained .map()/.filter() calls iterate the array multiple times. For large datasets, this wastes CPU and creates intermediate arrays.",
186
+ lineNumbers: multiMapLines,
187
+ recommendation: "Combine chained operations into a single reduce() or loop. Use lazy evaluation libraries (lodash/fp, RxJS) for large datasets.",
188
+ reference: "Functional Programming Performance",
189
+ });
190
+ }
191
+ // Serverless cold-start heavy imports
192
+ const heavyImportLines = getLineNumbers(code, /import\s+.*(?:aws-sdk|@aws-sdk|firebase-admin|googleapis|azure-storage|@azure\/storage)/gi);
193
+ if (heavyImportLines.length > 3) {
194
+ findings.push({
195
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
196
+ severity: "medium",
197
+ title: "Heavy SDK imports may increase cold-start costs",
198
+ description: `Found ${heavyImportLines.length} heavy SDK imports. In serverless environments, large imports increase cold-start duration and cost.`,
199
+ lineNumbers: heavyImportLines,
200
+ recommendation: "Import only specific modules (e.g., @aws-sdk/client-s3 instead of aws-sdk). Use tree-shakeable imports. Consider lazy loading for rarely-used SDKs.",
201
+ reference: "Serverless Performance Optimization",
202
+ });
203
+ }
204
+ return findings;
205
+ }
206
+ //# sourceMappingURL=cost-effectiveness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-effectiveness.js","sourceRoot":"","sources":["../../src/evaluators/cost-effectiveness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Finding } from "../types.js";
2
+ export declare function analyzeCybersecurity(code: string, language: string): Finding[];
3
+ //# sourceMappingURL=cybersecurity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cybersecurity.d.ts","sourceRoot":"","sources":["../../src/evaluators/cybersecurity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA2S9E"}
@@ -0,0 +1,282 @@
1
+ import { getLineNumbers } from "./shared.js";
2
+ export function analyzeCybersecurity(code, language) {
3
+ const findings = [];
4
+ let ruleNum = 1;
5
+ const prefix = "CYBER";
6
+ // eval() / exec() usage (multi-language)
7
+ const evalPattern = /\beval\s*\(|exec\s*\(.*(?:req\.|request\.|input|user)|Function\s*\(\s*["'`]|compile\s*\(\s*(?:req|input|user)/gi;
8
+ const evalLines = getLineNumbers(code, evalPattern);
9
+ if (evalLines.length > 0) {
10
+ findings.push({
11
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
12
+ severity: "critical",
13
+ title: "Dangerous eval()/exec() usage",
14
+ description: "eval(), exec(), or dynamic code compilation executes arbitrary code and is a primary vector for code injection attacks.",
15
+ lineNumbers: evalLines,
16
+ recommendation: "Remove eval() entirely. Use JSON.parse() for data parsing, or a proper expression parser if dynamic evaluation is truly needed.",
17
+ reference: "OWASP Code Injection — CWE-94",
18
+ });
19
+ }
20
+ // innerHTML / dangerouslySetInnerHTML / v-html / [innerHTML]
21
+ const innerHTMLPattern = /\.innerHTML\s*=|dangerouslySetInnerHTML|v-html\s*=|\[innerHTML\]\s*=/gi;
22
+ const innerHTMLLines = getLineNumbers(code, innerHTMLPattern);
23
+ if (innerHTMLLines.length > 0) {
24
+ findings.push({
25
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
26
+ severity: "high",
27
+ title: "Potential XSS via innerHTML",
28
+ description: "Setting innerHTML, dangerouslySetInnerHTML, v-html, or [innerHTML] can lead to Cross-Site Scripting (XSS) if the content includes unsanitized user input.",
29
+ lineNumbers: innerHTMLLines,
30
+ recommendation: "Use textContent for plain text, or use a sanitization library (DOMPurify) before inserting HTML. In React, avoid dangerouslySetInnerHTML unless content is sanitized.",
31
+ reference: "OWASP XSS Prevention — CWE-79",
32
+ });
33
+ }
34
+ // Command injection risk (multi-language)
35
+ const cmdPattern = /(?:exec|spawn|execSync|spawnSync|execFile|child_process|subprocess|os\.system|os\.popen|Runtime\.exec|ProcessBuilder|Process\.Start|system\s*\(|popen\s*\(|shell_exec|passthru|proc_open)\s*\(.*(?:\+|`|\$\{|%s|\.format)/gi;
36
+ const cmdLines = getLineNumbers(code, cmdPattern);
37
+ if (cmdLines.length > 0) {
38
+ findings.push({
39
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
40
+ severity: "critical",
41
+ title: "Potential command injection",
42
+ description: "Shell commands are constructed with string concatenation/interpolation, allowing an attacker to inject arbitrary OS commands if user input is included.",
43
+ lineNumbers: cmdLines,
44
+ recommendation: "Use execFile() with an argument array instead of exec(). Never concatenate user input into shell commands. Validate and sanitize all inputs.",
45
+ reference: "OWASP Command Injection — CWE-78",
46
+ });
47
+ }
48
+ // Disabled TLS / certificate validation
49
+ const tlsRejectPattern = /NODE_TLS_REJECT_UNAUTHORIZED\s*=\s*['"]?0|rejectUnauthorized\s*:\s*false|verify\s*=\s*False|InsecureSkipVerify\s*:\s*true|ssl_verify\s*=\s*false|ServerCertificateValidationCallback\s*=.*true|CURLOPT_SSL_VERIFYPEER.*false|verify_ssl\s*=\s*false/gi;
50
+ const tlsLines = getLineNumbers(code, tlsRejectPattern);
51
+ if (tlsLines.length > 0) {
52
+ findings.push({
53
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
54
+ severity: "critical",
55
+ title: "TLS certificate validation disabled",
56
+ description: "TLS certificate verification is explicitly disabled, making the application vulnerable to man-in-the-middle (MITM) attacks.",
57
+ lineNumbers: tlsLines,
58
+ recommendation: "Never disable TLS certificate validation in production. Use proper CA certificates. If using self-signed certs in development, use a CA bundle instead.",
59
+ reference: "CWE-295: Improper Certificate Validation",
60
+ });
61
+ }
62
+ // Insecure CORS
63
+ const corsPattern = /(?:Access-Control-Allow-Origin|cors)\s*[:({]\s*['"]\*/gi;
64
+ const corsLines = getLineNumbers(code, corsPattern);
65
+ if (corsLines.length > 0) {
66
+ findings.push({
67
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
68
+ severity: "medium",
69
+ title: "Overly permissive CORS configuration",
70
+ description: "CORS is configured to allow all origins ('*'), which may allow malicious websites to make cross-origin requests to your API.",
71
+ lineNumbers: corsLines,
72
+ recommendation: "Restrict CORS to specific trusted origins. If credentials are used, '*' is not allowed by browsers anyway — be explicit about allowed origins.",
73
+ reference: "OWASP CORS Misconfiguration — CWE-942",
74
+ });
75
+ }
76
+ // Prototype pollution risk
77
+ const protoPattern = /\.__proto__|Object\.assign\s*\(\s*\{\}|lodash\.merge|_\.merge|deepmerge|Object\.keys.*forEach.*\[/gi;
78
+ const protoLines = getLineNumbers(code, protoPattern);
79
+ if (protoLines.length > 0) {
80
+ findings.push({
81
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
82
+ severity: "medium",
83
+ title: "Potential prototype pollution risk",
84
+ description: "Direct __proto__ access or unchecked Object.assign/deep merge with user-controlled data can lead to prototype pollution attacks.",
85
+ lineNumbers: protoLines,
86
+ recommendation: "Use Object.create(null) for map-like objects, validate keys against a whitelist, and use Map instead of plain objects for dynamic keys.",
87
+ reference: "CWE-1321: Improperly Controlled Modification of Object Prototype Attributes",
88
+ });
89
+ }
90
+ // Disabled linter/type-checker rules
91
+ const disablePattern = /(?:eslint-disable|tslint:disable|@ts-ignore|@ts-nocheck|nosec|noinspection|noqa|type:\s*ignore|#\s*pragma\s+no\s+cover)/gi;
92
+ const disableLines = getLineNumbers(code, disablePattern);
93
+ if (disableLines.length > 0) {
94
+ findings.push({
95
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
96
+ severity: "low",
97
+ title: "Linter/type-checker suppression directives found",
98
+ description: "Code contains directives to suppress linter or type-checker warnings. While sometimes necessary, these can mask real security or quality issues.",
99
+ lineNumbers: disableLines,
100
+ recommendation: "Review each suppression directive to ensure it's justified. Add a comment explaining why the suppression is necessary. Remove any that were added simply to silence warnings.",
101
+ reference: "Secure Coding Best Practices",
102
+ });
103
+ }
104
+ // XML External Entity (XXE) injection
105
+ const xxePatterns = /DocumentBuilder|SAXParser|XMLReader|DOMParser|etree\.parse|xml\.sax|parseXML|lxml\.etree|XmlReader|XmlDocument|LIBXML_NOENT/gi;
106
+ const xxeLines = getLineNumbers(code, xxePatterns);
107
+ if (xxeLines.length > 0) {
108
+ const hasProtection = /disallow-doctype-decl|FEATURE_SECURE_PROCESSING|resolve_entities\s*=\s*False|DtdProcessing\.Prohibit|LIBXML_NONET/gi.test(code);
109
+ if (!hasProtection) {
110
+ findings.push({
111
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
112
+ severity: "high",
113
+ title: "XML parsing without XXE protection",
114
+ description: "XML is parsed without visible protection against XML External Entity (XXE) injection, which can lead to file disclosure, SSRF, or denial of service.",
115
+ lineNumbers: xxeLines,
116
+ recommendation: "Disable external entity resolution and DTD processing in your XML parser. Use defusedxml in Python. Set FEATURE_SECURE_PROCESSING in Java.",
117
+ reference: "OWASP XXE — CWE-611",
118
+ });
119
+ }
120
+ }
121
+ // LDAP injection
122
+ const ldapPatterns = /ldap\.search|ldap_search|DirectorySearcher|LdapTemplate|ldap\.bind/gi;
123
+ const ldapLines = getLineNumbers(code, ldapPatterns);
124
+ if (ldapLines.length > 0) {
125
+ const hasLdapSanitation = /escape|sanitize|ldap_escape|filter_format/gi.test(code);
126
+ if (!hasLdapSanitation) {
127
+ findings.push({
128
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
129
+ severity: "high",
130
+ title: "Potential LDAP injection",
131
+ description: "LDAP queries are constructed without visible input sanitization, potentially allowing LDAP injection attacks.",
132
+ lineNumbers: ldapLines,
133
+ recommendation: "Escape special LDAP characters in user input. Use parameterized LDAP queries or the ldap_escape function.",
134
+ reference: "OWASP LDAP Injection — CWE-90",
135
+ });
136
+ }
137
+ }
138
+ // Server-Side Request Forgery (SSRF)
139
+ const ssrfPatterns = /(?:fetch|axios|http\.get|requests\.get|urllib|HttpClient|WebClient|curl)\s*\(.*(?:req\.|request\.|params\.|query\.|body\.|input|url\s*=)/gi;
140
+ const ssrfLines = getLineNumbers(code, ssrfPatterns);
141
+ if (ssrfLines.length > 0) {
142
+ findings.push({
143
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
144
+ severity: "high",
145
+ title: "Potential Server-Side Request Forgery (SSRF)",
146
+ description: "User input is used to construct a URL for server-side requests, allowing attackers to access internal services, cloud metadata endpoints, or arbitrary external resources.",
147
+ lineNumbers: ssrfLines,
148
+ recommendation: "Validate and whitelist allowed URLs/domains. Block access to internal IP ranges (10.x, 172.16-31.x, 192.168.x, 169.254.169.254). Use a URL parser to verify the host.",
149
+ reference: "OWASP SSRF — CWE-918",
150
+ });
151
+ }
152
+ // Open redirect
153
+ const redirectPatterns = /(?:res\.redirect|Response\.Redirect|redirect|HttpResponseRedirect|header\s*\(\s*["']Location)\s*\(.*(?:req\.|request\.|params\.|query\.|body\.|input|url\s*=)/gi;
154
+ const redirectLines = getLineNumbers(code, redirectPatterns);
155
+ if (redirectLines.length > 0) {
156
+ findings.push({
157
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
158
+ severity: "medium",
159
+ title: "Potential open redirect",
160
+ description: "User-controlled input is used in a redirect URL, which can be exploited for phishing attacks by redirecting users to malicious sites.",
161
+ lineNumbers: redirectLines,
162
+ recommendation: "Validate redirect URLs against a whitelist of allowed domains. Use relative paths or map redirect targets to predefined safe URLs.",
163
+ reference: "OWASP Open Redirect — CWE-601",
164
+ });
165
+ }
166
+ // ReDoS (Regular Expression Denial of Service)
167
+ const regexPatterns = /new\s+RegExp\s*\(.*(?:req\.|request\.|params\.|query\.|body\.|input|user)/gi;
168
+ const regexLines = getLineNumbers(code, regexPatterns);
169
+ if (regexLines.length > 0) {
170
+ findings.push({
171
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
172
+ severity: "high",
173
+ title: "User input in RegExp — ReDoS risk",
174
+ description: "User input is used to construct a regular expression, which can cause catastrophic backtracking (ReDoS) with crafted input, hanging the server.",
175
+ lineNumbers: regexLines,
176
+ recommendation: "Never use user input in RegExp without escaping. Use safe-regex or re2 for untrusted patterns. Set timeouts on regex operations.",
177
+ reference: "CWE-1333: Inefficient Regular Expression Complexity",
178
+ });
179
+ }
180
+ // Template injection (SSTI)
181
+ const templatePatterns = /render_template_string|Template\(.*(?:req|request|input|user)|Jinja2|nunjucks\.renderString|Handlebars\.compile\s*\(.*(?:req|input)|ERB\.new\s*\(.*(?:params|request)/gi;
182
+ const templateLines = getLineNumbers(code, templatePatterns);
183
+ if (templateLines.length > 0) {
184
+ findings.push({
185
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
186
+ severity: "critical",
187
+ title: "Potential Server-Side Template Injection (SSTI)",
188
+ description: "User input appears to be passed directly to template rendering, allowing attackers to execute arbitrary code via template syntax.",
189
+ lineNumbers: templateLines,
190
+ recommendation: "Never pass user input as template source. Use templates only from trusted files with parameterized data. Enable sandboxing if available.",
191
+ reference: "OWASP SSTI — CWE-1336",
192
+ });
193
+ }
194
+ // CRLF injection / HTTP header injection
195
+ const crlfPatterns = /(?:setHeader|writeHead|res\.set|response\.header|header\s*\()\s*\(.*(?:req\.|request\.|params\.|query\.|body\.|input)/gi;
196
+ const crlfLines = getLineNumbers(code, crlfPatterns);
197
+ if (crlfLines.length > 0) {
198
+ findings.push({
199
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
200
+ severity: "medium",
201
+ title: "Potential HTTP header injection",
202
+ description: "User input may be used in HTTP response headers, allowing CRLF injection to set arbitrary headers or split responses.",
203
+ lineNumbers: crlfLines,
204
+ recommendation: "Strip \\r\\n characters from any user input used in headers. Validate and encode header values.",
205
+ reference: "CWE-113: Improper Neutralization of CRLF Sequences",
206
+ });
207
+ }
208
+ // Missing security headers
209
+ const hasHelmet = /helmet|X-Content-Type-Options|Content-Security-Policy|X-Frame-Options|Strict-Transport-Security|X-XSS-Protection/gi.test(code);
210
+ const hasServer = /app\.(listen|use)|createServer|express\(\)|Flask\(|Django|WebApplication|Startup/gi.test(code);
211
+ if (hasServer && !hasHelmet) {
212
+ findings.push({
213
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
214
+ severity: "medium",
215
+ title: "No security headers configured",
216
+ description: "HTTP server code does not configure security headers (CSP, X-Frame-Options, HSTS, etc.), leaving it vulnerable to clickjacking, XSS, and other attacks.",
217
+ recommendation: "Use helmet (Express), django-security middleware, or manually set: Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Strict-Transport-Security.",
218
+ reference: "OWASP Security Headers — CWE-693",
219
+ });
220
+ }
221
+ // Insecure session configuration
222
+ const sessionPatterns = /session\s*\(\s*\{|express-session|SessionMiddleware|session_config/gi;
223
+ const sessionLines = getLineNumbers(code, sessionPatterns);
224
+ if (sessionLines.length > 0) {
225
+ const hasSecureSession = /secure\s*:\s*true|HttpOnly|sameSite/gi.test(code);
226
+ if (!hasSecureSession) {
227
+ findings.push({
228
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
229
+ severity: "high",
230
+ title: "Insecure session configuration",
231
+ description: "Session middleware is configured without secure cookie settings, making sessions vulnerable to hijacking.",
232
+ lineNumbers: sessionLines,
233
+ recommendation: "Configure sessions with secure: true, httpOnly: true, sameSite: 'strict', and a reasonable maxAge. Use a server-side session store.",
234
+ reference: "OWASP Session Management — CWE-614",
235
+ });
236
+ }
237
+ }
238
+ // Weak password requirements
239
+ const passwordValidation = /password.*(?:length|min|max|regex|pattern|require)/gi;
240
+ const hasPasswordInput = /password|passwd|pwd/gi.test(code);
241
+ const hasAuthRoutes = /(?:register|signup|sign-up|createUser|changePassword|resetPassword)/gi.test(code);
242
+ if (hasAuthRoutes && hasPasswordInput && !passwordValidation.test(code)) {
243
+ findings.push({
244
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
245
+ severity: "medium",
246
+ title: "No password complexity validation",
247
+ description: "Authentication endpoints handle passwords but no password complexity rules (minimum length, character requirements) are visible.",
248
+ recommendation: "Enforce minimum 8-character passwords with complexity requirements. Use NIST SP 800-63B guidelines. Check against breached password databases (Have I Been Pwned).",
249
+ reference: "NIST SP 800-63B — CWE-521",
250
+ });
251
+ }
252
+ // Hardcoded admin/backdoor accounts
253
+ const backdoorPatterns = /(?:admin|root|superuser|backdoor)\s*[:=]\s*["'][^"']+["'].*(?:password|passwd|pwd)|(?:password|passwd|pwd)\s*[:=]\s*["'][^"']+["'].*(?:admin|root|superuser)/gi;
254
+ const backdoorLines = getLineNumbers(code, backdoorPatterns);
255
+ if (backdoorLines.length > 0) {
256
+ findings.push({
257
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
258
+ severity: "critical",
259
+ title: "Hardcoded admin/backdoor credentials",
260
+ description: "Hardcoded admin or superuser credentials create a permanent backdoor. These are trivially discovered by examining the source code.",
261
+ lineNumbers: backdoorLines,
262
+ recommendation: "Remove hardcoded credentials. Use environment-based configuration and initial setup scripts for admin accounts.",
263
+ reference: "CWE-798: Use of Hard-coded Credentials",
264
+ });
265
+ }
266
+ // Missing rate limiting on auth endpoints
267
+ const authEndpoints = getLineNumbers(code, /(?:login|signin|sign-in|authenticate|auth|password|token)\s*['",:]/gi);
268
+ const hasRateLimit = /rate.?limit|throttle|limiter|brute/gi.test(code);
269
+ if (authEndpoints.length > 0 && !hasRateLimit) {
270
+ findings.push({
271
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
272
+ severity: "high",
273
+ title: "Authentication endpoints without rate limiting",
274
+ description: "Authentication-related code exists without visible rate limiting, making it vulnerable to brute-force and credential stuffing attacks.",
275
+ lineNumbers: authEndpoints.slice(0, 5),
276
+ recommendation: "Implement rate limiting on login/auth endpoints. Use progressive delays, account lockouts, or CAPTCHA after failed attempts.",
277
+ reference: "OWASP Brute Force — CWE-307",
278
+ });
279
+ }
280
+ return findings;
281
+ }
282
+ //# sourceMappingURL=cybersecurity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cybersecurity.js","sourceRoot":"","sources":["../../src/evaluators/cybersecurity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Finding } from "../types.js";
2
+ export declare function analyzeDataSecurity(code: string, language: string): Finding[];
3
+ //# sourceMappingURL=data-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-security.d.ts","sourceRoot":"","sources":["../../src/evaluators/data-security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA8S7E"}