@gulibs/safe-coder 0.0.26 → 0.0.27

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 (192) hide show
  1. package/README.md +678 -994
  2. package/dist/cache/cache-manager.d.ts +71 -0
  3. package/dist/cache/cache-manager.d.ts.map +1 -0
  4. package/dist/cache/cache-manager.js +244 -0
  5. package/dist/cache/cache-manager.js.map +1 -0
  6. package/dist/executor/cli-executor.d.ts +106 -0
  7. package/dist/executor/cli-executor.d.ts.map +1 -0
  8. package/dist/executor/cli-executor.js +133 -0
  9. package/dist/executor/cli-executor.js.map +1 -0
  10. package/dist/executor/dependency-checker.d.ts +23 -0
  11. package/dist/executor/dependency-checker.d.ts.map +1 -0
  12. package/dist/executor/dependency-checker.js +62 -0
  13. package/dist/executor/dependency-checker.js.map +1 -0
  14. package/dist/index.js +3 -4
  15. package/dist/index.js.map +1 -1
  16. package/dist/processor/content-processor.d.ts +76 -0
  17. package/dist/processor/content-processor.d.ts.map +1 -0
  18. package/dist/processor/content-processor.js +182 -0
  19. package/dist/processor/content-processor.js.map +1 -0
  20. package/dist/processor/guide-generator.d.ts +68 -0
  21. package/dist/processor/guide-generator.d.ts.map +1 -0
  22. package/dist/processor/guide-generator.js +189 -0
  23. package/dist/processor/guide-generator.js.map +1 -0
  24. package/dist/server/safe-coder-mcp.d.ts +18 -0
  25. package/dist/server/safe-coder-mcp.d.ts.map +1 -0
  26. package/dist/server/safe-coder-mcp.js +164 -0
  27. package/dist/server/safe-coder-mcp.js.map +1 -0
  28. package/dist/tools/cache-tools.d.ts +42 -0
  29. package/dist/tools/cache-tools.d.ts.map +1 -0
  30. package/dist/tools/cache-tools.js +70 -0
  31. package/dist/tools/cache-tools.js.map +1 -0
  32. package/dist/tools/crawl-documentation.d.ts +57 -0
  33. package/dist/tools/crawl-documentation.d.ts.map +1 -0
  34. package/dist/tools/crawl-documentation.js +96 -0
  35. package/dist/tools/crawl-documentation.js.map +1 -0
  36. package/dist/tools/index.d.ts +4 -0
  37. package/dist/tools/index.d.ts.map +1 -0
  38. package/dist/tools/index.js +4 -0
  39. package/dist/tools/index.js.map +1 -0
  40. package/dist/tools/save-skill.d.ts +49 -0
  41. package/dist/tools/save-skill.d.ts.map +1 -0
  42. package/dist/tools/save-skill.js +207 -0
  43. package/dist/tools/save-skill.js.map +1 -0
  44. package/package.json +18 -28
  45. package/dist/documentation/browser-doc-browser.d.ts +0 -41
  46. package/dist/documentation/browser-doc-browser.d.ts.map +0 -1
  47. package/dist/documentation/browser-doc-browser.js +0 -357
  48. package/dist/documentation/browser-doc-browser.js.map +0 -1
  49. package/dist/documentation/browser-manager.d.ts +0 -51
  50. package/dist/documentation/browser-manager.d.ts.map +0 -1
  51. package/dist/documentation/browser-manager.js +0 -260
  52. package/dist/documentation/browser-manager.js.map +0 -1
  53. package/dist/documentation/cache.d.ts +0 -13
  54. package/dist/documentation/cache.d.ts.map +0 -1
  55. package/dist/documentation/cache.js +0 -48
  56. package/dist/documentation/cache.js.map +0 -1
  57. package/dist/documentation/checkpoint-manager.d.ts +0 -38
  58. package/dist/documentation/checkpoint-manager.d.ts.map +0 -1
  59. package/dist/documentation/checkpoint-manager.js +0 -101
  60. package/dist/documentation/checkpoint-manager.js.map +0 -1
  61. package/dist/documentation/doc-crawler.d.ts +0 -221
  62. package/dist/documentation/doc-crawler.d.ts.map +0 -1
  63. package/dist/documentation/doc-crawler.js +0 -1415
  64. package/dist/documentation/doc-crawler.js.map +0 -1
  65. package/dist/documentation/github-client.d.ts +0 -13
  66. package/dist/documentation/github-client.d.ts.map +0 -1
  67. package/dist/documentation/github-client.js +0 -90
  68. package/dist/documentation/github-client.js.map +0 -1
  69. package/dist/documentation/http-fetcher.d.ts +0 -8
  70. package/dist/documentation/http-fetcher.d.ts.map +0 -1
  71. package/dist/documentation/http-fetcher.js +0 -31
  72. package/dist/documentation/http-fetcher.js.map +0 -1
  73. package/dist/documentation/index.d.ts +0 -16
  74. package/dist/documentation/index.d.ts.map +0 -1
  75. package/dist/documentation/index.js +0 -159
  76. package/dist/documentation/index.js.map +0 -1
  77. package/dist/documentation/llms-txt/detector.d.ts +0 -31
  78. package/dist/documentation/llms-txt/detector.d.ts.map +0 -1
  79. package/dist/documentation/llms-txt/detector.js +0 -77
  80. package/dist/documentation/llms-txt/detector.js.map +0 -1
  81. package/dist/documentation/llms-txt/downloader.d.ts +0 -30
  82. package/dist/documentation/llms-txt/downloader.d.ts.map +0 -1
  83. package/dist/documentation/llms-txt/downloader.js +0 -84
  84. package/dist/documentation/llms-txt/downloader.js.map +0 -1
  85. package/dist/documentation/llms-txt/index.d.ts +0 -4
  86. package/dist/documentation/llms-txt/index.d.ts.map +0 -1
  87. package/dist/documentation/llms-txt/index.js +0 -4
  88. package/dist/documentation/llms-txt/index.js.map +0 -1
  89. package/dist/documentation/llms-txt/parser.d.ts +0 -43
  90. package/dist/documentation/llms-txt/parser.d.ts.map +0 -1
  91. package/dist/documentation/llms-txt/parser.js +0 -177
  92. package/dist/documentation/llms-txt/parser.js.map +0 -1
  93. package/dist/documentation/normalizer.d.ts +0 -6
  94. package/dist/documentation/normalizer.d.ts.map +0 -1
  95. package/dist/documentation/normalizer.js +0 -38
  96. package/dist/documentation/normalizer.js.map +0 -1
  97. package/dist/documentation/npm-client.d.ts +0 -19
  98. package/dist/documentation/npm-client.d.ts.map +0 -1
  99. package/dist/documentation/npm-client.js +0 -182
  100. package/dist/documentation/npm-client.js.map +0 -1
  101. package/dist/documentation/skill-generator.d.ts +0 -108
  102. package/dist/documentation/skill-generator.d.ts.map +0 -1
  103. package/dist/documentation/skill-generator.js +0 -642
  104. package/dist/documentation/skill-generator.js.map +0 -1
  105. package/dist/documentation/web-doc-browser.d.ts +0 -67
  106. package/dist/documentation/web-doc-browser.d.ts.map +0 -1
  107. package/dist/documentation/web-doc-browser.js +0 -555
  108. package/dist/documentation/web-doc-browser.js.map +0 -1
  109. package/dist/errors/api-validator.d.ts +0 -9
  110. package/dist/errors/api-validator.d.ts.map +0 -1
  111. package/dist/errors/api-validator.js +0 -57
  112. package/dist/errors/api-validator.js.map +0 -1
  113. package/dist/errors/contextual-analysis.d.ts +0 -14
  114. package/dist/errors/contextual-analysis.d.ts.map +0 -1
  115. package/dist/errors/contextual-analysis.js +0 -173
  116. package/dist/errors/contextual-analysis.js.map +0 -1
  117. package/dist/errors/cross-file-analyzer.d.ts +0 -16
  118. package/dist/errors/cross-file-analyzer.d.ts.map +0 -1
  119. package/dist/errors/cross-file-analyzer.js +0 -172
  120. package/dist/errors/cross-file-analyzer.js.map +0 -1
  121. package/dist/errors/eslint-integration.d.ts +0 -9
  122. package/dist/errors/eslint-integration.d.ts.map +0 -1
  123. package/dist/errors/eslint-integration.js +0 -131
  124. package/dist/errors/eslint-integration.js.map +0 -1
  125. package/dist/errors/framework-detector.d.ts +0 -10
  126. package/dist/errors/framework-detector.d.ts.map +0 -1
  127. package/dist/errors/framework-detector.js +0 -126
  128. package/dist/errors/framework-detector.js.map +0 -1
  129. package/dist/errors/index.d.ts +0 -18
  130. package/dist/errors/index.d.ts.map +0 -1
  131. package/dist/errors/index.js +0 -134
  132. package/dist/errors/index.js.map +0 -1
  133. package/dist/errors/pattern-matcher.d.ts +0 -25
  134. package/dist/errors/pattern-matcher.d.ts.map +0 -1
  135. package/dist/errors/pattern-matcher.js +0 -44
  136. package/dist/errors/pattern-matcher.js.map +0 -1
  137. package/dist/errors/patterns.d.ts +0 -11
  138. package/dist/errors/patterns.d.ts.map +0 -1
  139. package/dist/errors/patterns.js +0 -351
  140. package/dist/errors/patterns.js.map +0 -1
  141. package/dist/errors/performance-detector.d.ts +0 -11
  142. package/dist/errors/performance-detector.d.ts.map +0 -1
  143. package/dist/errors/performance-detector.js +0 -119
  144. package/dist/errors/performance-detector.js.map +0 -1
  145. package/dist/errors/runtime-detector.d.ts +0 -7
  146. package/dist/errors/runtime-detector.d.ts.map +0 -1
  147. package/dist/errors/runtime-detector.js +0 -86
  148. package/dist/errors/runtime-detector.js.map +0 -1
  149. package/dist/errors/security-detector.d.ts +0 -6
  150. package/dist/errors/security-detector.d.ts.map +0 -1
  151. package/dist/errors/security-detector.js +0 -75
  152. package/dist/errors/security-detector.js.map +0 -1
  153. package/dist/errors/typescript-integration.d.ts +0 -6
  154. package/dist/errors/typescript-integration.d.ts.map +0 -1
  155. package/dist/errors/typescript-integration.js +0 -46
  156. package/dist/errors/typescript-integration.js.map +0 -1
  157. package/dist/server/mcp-server.d.ts +0 -14
  158. package/dist/server/mcp-server.d.ts.map +0 -1
  159. package/dist/server/mcp-server.js +0 -793
  160. package/dist/server/mcp-server.js.map +0 -1
  161. package/dist/types/documentation.d.ts +0 -26
  162. package/dist/types/documentation.d.ts.map +0 -1
  163. package/dist/types/documentation.js +0 -2
  164. package/dist/types/documentation.js.map +0 -1
  165. package/dist/utils/config.d.ts +0 -21
  166. package/dist/utils/config.d.ts.map +0 -1
  167. package/dist/utils/config.js +0 -34
  168. package/dist/utils/config.js.map +0 -1
  169. package/dist/utils/http-client.d.ts +0 -17
  170. package/dist/utils/http-client.d.ts.map +0 -1
  171. package/dist/utils/http-client.js +0 -62
  172. package/dist/utils/http-client.js.map +0 -1
  173. package/dist/utils/logger.d.ts +0 -36
  174. package/dist/utils/logger.d.ts.map +0 -1
  175. package/dist/utils/logger.js +0 -128
  176. package/dist/utils/logger.js.map +0 -1
  177. package/dist/utils/rate-limiter.d.ts +0 -9
  178. package/dist/utils/rate-limiter.d.ts.map +0 -1
  179. package/dist/utils/rate-limiter.js +0 -26
  180. package/dist/utils/rate-limiter.js.map +0 -1
  181. package/dist/validation/auto-fix.d.ts +0 -15
  182. package/dist/validation/auto-fix.d.ts.map +0 -1
  183. package/dist/validation/auto-fix.js +0 -49
  184. package/dist/validation/auto-fix.js.map +0 -1
  185. package/dist/validation/index.d.ts +0 -21
  186. package/dist/validation/index.d.ts.map +0 -1
  187. package/dist/validation/index.js +0 -45
  188. package/dist/validation/index.js.map +0 -1
  189. package/dist/validation/resolution-db.d.ts +0 -15
  190. package/dist/validation/resolution-db.d.ts.map +0 -1
  191. package/dist/validation/resolution-db.js +0 -62
  192. package/dist/validation/resolution-db.js.map +0 -1
@@ -1,351 +0,0 @@
1
- export const patterns = {
2
- patterns: [
3
- // Existing patterns
4
- {
5
- id: 'undefined-variable',
6
- name: 'Undefined Variable',
7
- priority: 3,
8
- pattern: '\\b(\\w+)\\s*\\?\\.',
9
- description: 'Variable may be undefined before optional chaining',
10
- fix: 'Ensure variable is defined before use or use optional chaining',
11
- },
12
- {
13
- id: 'missing-import',
14
- name: 'Missing Import',
15
- priority: 2,
16
- pattern: "import\\s+.*from\\s+['\"]([^'\"]+)['\"]",
17
- description: 'Import statement may be missing or incorrect',
18
- fix: 'Add missing import statement',
19
- },
20
- {
21
- id: 'async-await',
22
- name: 'Missing Await',
23
- priority: 2,
24
- pattern: '(async\\s+)?function.*\\{[^}]*\\b(\\w+)\\([^)]*\\)(?!\\s*await)',
25
- description: 'Async function call missing await',
26
- fix: 'Add await keyword before async function call',
27
- },
28
- {
29
- id: 'null-check',
30
- name: 'Missing Null Check',
31
- priority: 3,
32
- pattern: '\\b(\\w+)\\.(\\w+)(?!\\s*\\?)',
33
- description: 'Property access without null/undefined check',
34
- fix: 'Add null/undefined check before property access',
35
- },
36
- // Runtime error patterns (20+ patterns)
37
- {
38
- id: 'array-bounds-negative',
39
- name: 'Negative Array Index',
40
- priority: 2,
41
- pattern: '\\[\\s*-\\d+\\s*\\]',
42
- description: 'Array access with negative index may cause runtime error',
43
- fix: 'Ensure array index is non-negative',
44
- },
45
- {
46
- id: 'array-bounds-unknown',
47
- name: 'Potential Array Out of Bounds',
48
- priority: 2,
49
- pattern: '\\[\\s*(\\w+)\\s*\\]',
50
- description: 'Array access with variable index may be out of bounds',
51
- fix: 'Add bounds checking before array access',
52
- },
53
- {
54
- id: 'division-by-zero',
55
- name: 'Division by Zero',
56
- priority: 2,
57
- pattern: '\\/\\s*(0|\\w+\\s*\\*\\s*0|\\w+\\s*-\\s*\\w+)',
58
- description: 'Potential division by zero',
59
- fix: 'Add zero check before division',
60
- },
61
- {
62
- id: 'null-dereference',
63
- name: 'Null Dereference',
64
- priority: 2,
65
- pattern: '(null|undefined)\\s*\\.',
66
- description: 'Direct null/undefined property access',
67
- fix: 'Use optional chaining (?.) or null check',
68
- },
69
- {
70
- id: 'unhandled-promise',
71
- name: 'Unhandled Promise',
72
- priority: 2,
73
- pattern: '\\b(\\w+)\\([^)]*\\)(?!\\s*\\.(then|catch|await))',
74
- description: 'Promise may be unhandled',
75
- fix: 'Add .catch() or await the promise',
76
- },
77
- {
78
- id: 'race-condition',
79
- name: 'Potential Race Condition',
80
- priority: 2,
81
- pattern: 'Promise\\.(all|race|allSettled)\\s*\\([^)]*\\)(?!\\s*await)',
82
- description: 'Promise.all/race without await may cause race condition',
83
- fix: 'Await Promise.all/race to handle all promises',
84
- },
85
- // Performance anti-patterns (15+ patterns)
86
- {
87
- id: 'memory-leak-listener',
88
- name: 'Memory Leak: Event Listener',
89
- priority: 4,
90
- pattern: '(addEventListener|on)\\s*\\([^)]+\\)(?!.*removeEventListener|off)',
91
- description: 'Event listener may not be removed, causing memory leak',
92
- fix: 'Remove event listener in cleanup function',
93
- },
94
- {
95
- id: 'memory-leak-interval',
96
- name: 'Memory Leak: Interval',
97
- priority: 4,
98
- pattern: '(setInterval|setTimeout)\\s*\\([^)]+\\)(?!.*clearInterval|clearTimeout)',
99
- description: 'Interval/timeout may not be cleared',
100
- fix: 'Clear interval/timeout in cleanup',
101
- },
102
- {
103
- id: 'infinite-loop-constant',
104
- name: 'Infinite Loop: Constant Condition',
105
- priority: 4,
106
- pattern: 'while\\s*\\(\\s*(true|1|\\d+)\\s*\\)',
107
- description: 'Loop with constant true condition may be infinite',
108
- fix: 'Add break condition or timeout',
109
- },
110
- {
111
- id: 'n-plus-one-query',
112
- name: 'N+1 Query Pattern',
113
- priority: 4,
114
- pattern: '(for|while|forEach|map)\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(query|find|get)\\s*\\([^)]*\\)',
115
- description: 'Database query inside loop causes N+1 problem',
116
- fix: 'Use batch query or join instead',
117
- },
118
- {
119
- id: 'expensive-operation-loop',
120
- name: 'Expensive Operation in Loop',
121
- priority: 4,
122
- pattern: '(for|while|forEach|map)\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(JSON\\.parse|JSON\\.stringify|eval|new Date)',
123
- description: 'Expensive operation inside loop',
124
- fix: 'Move expensive operation outside loop',
125
- },
126
- {
127
- id: 'circular-reference',
128
- name: 'Circular Reference',
129
- priority: 4,
130
- pattern: '(\\w+)\\s*\\.\\s*\\1',
131
- description: 'Potential circular reference',
132
- fix: 'Check for circular references in object structure',
133
- },
134
- // Security patterns (10+ patterns)
135
- {
136
- id: 'sql-injection',
137
- name: 'SQL Injection',
138
- priority: 1,
139
- pattern: '(query|execute|exec)\\s*\\([^)]*\\+\\s*\\w+',
140
- description: 'SQL query with string concatenation may be vulnerable to injection',
141
- fix: 'Use parameterized queries or prepared statements',
142
- },
143
- {
144
- id: 'xss-innerhtml',
145
- name: 'XSS: innerHTML',
146
- priority: 1,
147
- pattern: '\\.innerHTML\\s*=\\s*[^;]+',
148
- description: 'Setting innerHTML with user input may cause XSS',
149
- fix: 'Use textContent or sanitize input',
150
- },
151
- {
152
- id: 'xss-eval',
153
- name: 'XSS: eval()',
154
- priority: 1,
155
- pattern: '\\beval\\s*\\(',
156
- description: 'Using eval() with user input is dangerous',
157
- fix: 'Avoid eval(), use safer alternatives',
158
- },
159
- {
160
- id: 'hardcoded-secret',
161
- name: 'Hardcoded Secret',
162
- priority: 1,
163
- pattern: '(password|secret|key|token|api[_-]?key)\\s*[:=]\\s*[\'"][^\'"]+[\'"]',
164
- description: 'Hardcoded secret in code',
165
- fix: 'Use environment variables or secure storage',
166
- },
167
- {
168
- id: 'sensitive-data-log',
169
- name: 'Sensitive Data in Log',
170
- priority: 1,
171
- pattern: '(console\\.(log|warn|error)|logger\\.(info|debug))\\s*\\([^)]*\\b(password|secret|token|ssn|credit[_-]?card)',
172
- description: 'Sensitive data may be logged',
173
- fix: 'Remove sensitive data from logs',
174
- },
175
- // Framework-specific patterns (10+ patterns)
176
- {
177
- id: 'react-hooks-condition',
178
- name: 'React Hooks: Conditional Hook',
179
- priority: 1,
180
- pattern: '(if|for|while|switch)\\s*\\([^)]*\\)\\s*\\{[^}]*\\b(use[A-Z]\\w+)\\s*\\(',
181
- description: 'React Hook called conditionally violates Rules of Hooks',
182
- fix: 'Move hook outside conditional or use early return',
183
- },
184
- {
185
- id: 'react-missing-key',
186
- name: 'React: Missing Key Prop',
187
- priority: 3,
188
- pattern: '\\{.*\\.map\\s*\\([^)]*\\)\\s*=>\\s*<[^>]+(?!key=)',
189
- description: 'List item missing key prop',
190
- fix: 'Add unique key prop to list items',
191
- },
192
- {
193
- id: 'react-setstate-loop',
194
- name: 'React: setState in Render',
195
- priority: 2,
196
- pattern: '(function|const|let)\\s+\\w+\\s*=\\s*\\([^)]*\\)\\s*=>\\s*\\{[^}]*setState',
197
- description: 'setState called during render may cause infinite loop',
198
- fix: 'Move setState to useEffect or event handler',
199
- },
200
- {
201
- id: 'nextjs-server-client',
202
- name: 'Next.js: Server/Client Mismatch',
203
- priority: 2,
204
- pattern: "'use client'[^]*\\\\b(getServerSideProps|getStaticProps)",
205
- description: 'Client component using server-only functions',
206
- fix: 'Remove server functions from client component',
207
- },
208
- // Additional runtime error patterns
209
- {
210
- id: 'type-coercion',
211
- name: 'Type Coercion Issue',
212
- priority: 3,
213
- pattern: '==\\s*(null|undefined|0|""|\'\')',
214
- description: 'Using == instead of === may cause type coercion issues',
215
- fix: 'Use === for strict equality comparison',
216
- },
217
- {
218
- id: 'undefined-property',
219
- name: 'Undefined Property Access',
220
- priority: 2,
221
- pattern: '\\w+\\.\\w+\\.\\w+',
222
- description: 'Chained property access may fail if intermediate property is undefined',
223
- fix: 'Use optional chaining (?.) or add null checks',
224
- },
225
- {
226
- id: 'parse-int-base',
227
- name: 'parseInt Missing Radix',
228
- priority: 3,
229
- pattern: 'parseInt\\s*\\([^,)]+\\)(?!\\s*,\\s*\\d+)',
230
- description: 'parseInt without radix may cause unexpected results',
231
- fix: 'Always specify radix: parseInt(value, 10)',
232
- },
233
- {
234
- id: 'string-concat-number',
235
- name: 'String Concatenation with Number',
236
- priority: 4,
237
- pattern: '["\']\\s*\\+\\s*\\d+|\\d+\\s*\\+\\s*["\']',
238
- description: 'String concatenation with number may cause unexpected type coercion',
239
- fix: 'Use template literals or explicit String() conversion',
240
- },
241
- // Additional performance patterns
242
- {
243
- id: 'regex-in-loop',
244
- name: 'Regex in Loop',
245
- priority: 4,
246
- pattern: '(for|while|forEach|map)\\s*\\([^)]*\\)\\s*\\{[^}]*new RegExp',
247
- description: 'Creating regex in loop is inefficient',
248
- fix: 'Create regex outside loop',
249
- },
250
- {
251
- id: 'object-assign-spread',
252
- name: 'Object Spread in Loop',
253
- priority: 4,
254
- pattern: '(for|while|forEach|map)\\s*\\([^)]*\\)\\s*\\{[^}]*\\.\\.\\.',
255
- description: 'Object spread in loop creates new objects repeatedly',
256
- fix: 'Use Object.assign or build object outside loop',
257
- },
258
- {
259
- id: 'array-push-concat',
260
- name: 'Array Push in Loop',
261
- priority: 4,
262
- pattern: '(for|while|forEach|map)\\s*\\([^)]*\\)\\s*\\{[^}]*\\.push\\s*\\(',
263
- description: 'Repeated push in loop may be inefficient',
264
- fix: 'Consider using map() or pre-allocate array',
265
- },
266
- // Additional security patterns
267
- {
268
- id: 'dangerous-eval',
269
- name: 'Dangerous eval() Usage',
270
- priority: 1,
271
- pattern: 'eval\\s*\\([^)]*\\+',
272
- description: 'eval() with string concatenation is extremely dangerous',
273
- fix: 'Never use eval() with user input, use safer alternatives',
274
- },
275
- {
276
- id: 'unsafe-innerhtml',
277
- name: 'Unsafe innerHTML',
278
- priority: 1,
279
- pattern: '\\.innerHTML\\s*=\\s*[^;]*\\+',
280
- description: 'Setting innerHTML with concatenated strings is XSS risk',
281
- fix: 'Use textContent or sanitize input',
282
- },
283
- {
284
- id: 'password-in-code',
285
- name: 'Password in Code',
286
- priority: 1,
287
- pattern: '(password|pwd|passwd)\\s*[:=]\\s*["\'][^"\']+["\']',
288
- description: 'Password hardcoded in source code',
289
- fix: 'Use environment variables or secure storage',
290
- },
291
- // Additional framework patterns
292
- {
293
- id: 'react-missing-deps',
294
- name: 'React: Missing useEffect Dependencies',
295
- priority: 3,
296
- pattern: 'useEffect\\s*\\([^)]*\\)(?!.*\\[.*\\])',
297
- description: 'useEffect may be missing dependency array',
298
- fix: 'Add dependency array to useEffect',
299
- },
300
- {
301
- id: 'react-direct-dom',
302
- name: 'React: Direct DOM Manipulation',
303
- priority: 3,
304
- pattern: '(document\\.getElementById|document\\.querySelector)\\s*\\(',
305
- description: 'Direct DOM manipulation in React component',
306
- fix: 'Use React refs and state instead',
307
- },
308
- {
309
- id: 'react-props-spread',
310
- name: 'React: Props Spread',
311
- priority: 4,
312
- pattern: '<\\w+\\s+\\.\\.\\.\\w+',
313
- description: 'Spreading props may pass unintended props',
314
- fix: 'Explicitly pass only needed props',
315
- },
316
- {
317
- id: 'nextjs-dynamic-import',
318
- name: 'Next.js: Dynamic Import',
319
- priority: 3,
320
- pattern: "import\\s+.*from\\s+['\"]next/dynamic['\"]",
321
- description: 'Consider using dynamic import for code splitting',
322
- fix: 'Use dynamic import for large components',
323
- },
324
- // Additional contextual patterns
325
- {
326
- id: 'unreachable-code',
327
- name: 'Unreachable Code',
328
- priority: 3,
329
- pattern: 'return[^;]*;\\s*\\w+',
330
- description: 'Code after return statement is unreachable',
331
- fix: 'Remove unreachable code or move before return',
332
- },
333
- {
334
- id: 'duplicate-var',
335
- name: 'Duplicate Variable Declaration',
336
- priority: 3,
337
- pattern: '(const|let|var)\\s+(\\w+)[^;]*;.*(const|let|var)\\s+\\2',
338
- description: 'Variable declared multiple times',
339
- fix: 'Remove duplicate declaration',
340
- },
341
- {
342
- id: 'missing-return',
343
- name: 'Missing Return Statement',
344
- priority: 3,
345
- pattern: 'function\\s+\\w+\\s*\\([^)]*\\)\\s*\\{[^}]*\\}',
346
- description: 'Function may be missing return statement',
347
- fix: 'Add return statement if function should return value',
348
- },
349
- ],
350
- };
351
- //# sourceMappingURL=patterns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/errors/patterns.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { DetectedError } from './pattern-matcher.js';
2
- export declare class PerformanceDetector {
3
- detectErrors(code: string): DetectedError[];
4
- private hasRemovalPattern;
5
- private hasClearPattern;
6
- private findLoopEnd;
7
- private hasQueryInLoop;
8
- private hasExpensiveOperation;
9
- private prioritize;
10
- }
11
- //# sourceMappingURL=performance-detector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"performance-detector.d.ts","sourceRoot":"","sources":["../../src/errors/performance-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,mBAAmB;IAC9B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAwF3C,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,UAAU;CAGnB"}
@@ -1,119 +0,0 @@
1
- export class PerformanceDetector {
2
- detectErrors(code) {
3
- const errors = [];
4
- const lines = code.split('\n');
5
- for (let i = 0; i < lines.length; i++) {
6
- const line = lines[i];
7
- const lineNumber = i + 1;
8
- // Detect memory leaks: event listeners
9
- const listenerMatch = line.match(/(addEventListener|on)\s*\([^)]+\)/);
10
- if (listenerMatch && !this.hasRemovalPattern(code, i)) {
11
- errors.push({
12
- type: 'performance',
13
- message: 'Event listener may not be removed, causing memory leak',
14
- line: lineNumber,
15
- column: line.indexOf(listenerMatch[0]) + 1,
16
- priority: 4,
17
- fix: 'Remove event listener in cleanup function',
18
- });
19
- }
20
- // Detect memory leaks: intervals/timeouts
21
- const intervalMatch = line.match(/(setInterval|setTimeout)\s*\([^)]+\)/);
22
- if (intervalMatch && !this.hasClearPattern(code, i)) {
23
- errors.push({
24
- type: 'performance',
25
- message: `${intervalMatch[1]} may not be cleared`,
26
- line: lineNumber,
27
- column: line.indexOf(intervalMatch[0]) + 1,
28
- priority: 4,
29
- fix: `Clear ${intervalMatch[1]} in cleanup`,
30
- });
31
- }
32
- // Detect infinite loops
33
- const infiniteLoopMatch = line.match(/while\s*\(\s*(true|1|\d+)\s*\)/);
34
- if (infiniteLoopMatch) {
35
- errors.push({
36
- type: 'performance',
37
- message: 'Loop with constant true condition may be infinite',
38
- line: lineNumber,
39
- column: line.indexOf(infiniteLoopMatch[0]) + 1,
40
- priority: 4,
41
- fix: 'Add break condition or timeout',
42
- });
43
- }
44
- // Detect N+1 query pattern
45
- const loopMatch = line.match(/(for|while|forEach|map)\s*\([^)]*\)/);
46
- if (loopMatch) {
47
- const loopStart = i;
48
- const loopEnd = this.findLoopEnd(code, loopStart);
49
- const loopBody = code.split('\n').slice(loopStart, loopEnd + 1).join('\n');
50
- if (this.hasQueryInLoop(loopBody)) {
51
- errors.push({
52
- type: 'performance',
53
- message: 'Database query inside loop causes N+1 problem',
54
- line: lineNumber,
55
- column: line.indexOf(loopMatch[0]) + 1,
56
- priority: 4,
57
- fix: 'Use batch query or join instead',
58
- });
59
- }
60
- }
61
- // Detect expensive operations in loops
62
- if (loopMatch) {
63
- const loopStart = i;
64
- const loopEnd = this.findLoopEnd(code, loopStart);
65
- const loopBody = code.split('\n').slice(loopStart, loopEnd + 1).join('\n');
66
- if (this.hasExpensiveOperation(loopBody)) {
67
- errors.push({
68
- type: 'performance',
69
- message: 'Expensive operation inside loop',
70
- line: lineNumber,
71
- column: line.indexOf(loopMatch[0]) + 1,
72
- priority: 4,
73
- fix: 'Move expensive operation outside loop',
74
- });
75
- }
76
- }
77
- }
78
- return this.prioritize(errors);
79
- }
80
- hasRemovalPattern(code, lineIndex) {
81
- const context = code.split('\n').slice(Math.max(0, lineIndex - 10), lineIndex + 20).join('\n');
82
- return /removeEventListener|off|cleanup|unmount/.test(context);
83
- }
84
- hasClearPattern(code, lineIndex) {
85
- const context = code.split('\n').slice(Math.max(0, lineIndex - 10), lineIndex + 20).join('\n');
86
- return /clearInterval|clearTimeout|cleanup/.test(context);
87
- }
88
- findLoopEnd(code, startLine) {
89
- const lines = code.split('\n');
90
- let braceCount = 0;
91
- let foundOpen = false;
92
- for (let i = startLine; i < lines.length; i++) {
93
- const line = lines[i];
94
- for (const char of line) {
95
- if (char === '{') {
96
- braceCount++;
97
- foundOpen = true;
98
- }
99
- else if (char === '}') {
100
- braceCount--;
101
- if (foundOpen && braceCount === 0) {
102
- return i;
103
- }
104
- }
105
- }
106
- }
107
- return lines.length - 1;
108
- }
109
- hasQueryInLoop(loopBody) {
110
- return /\.(query|find|get|fetch)\s*\([^)]*\)/.test(loopBody);
111
- }
112
- hasExpensiveOperation(loopBody) {
113
- return /JSON\.(parse|stringify)|eval|new Date\(\)|Math\.(random|sqrt)/.test(loopBody);
114
- }
115
- prioritize(errors) {
116
- return errors.sort((a, b) => a.priority - b.priority);
117
- }
118
- }
119
- //# sourceMappingURL=performance-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"performance-detector.js","sourceRoot":"","sources":["../../src/errors/performance-detector.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { DetectedError } from './pattern-matcher.js';
2
- export declare class RuntimeDetector {
3
- detectErrors(code: string): DetectedError[];
4
- private looksLikeAsyncFunction;
5
- private prioritize;
6
- }
7
- //# sourceMappingURL=runtime-detector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-detector.d.ts","sourceRoot":"","sources":["../../src/errors/runtime-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,eAAe;IAC1B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAoF3C,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,UAAU;CAGnB"}
@@ -1,86 +0,0 @@
1
- export class RuntimeDetector {
2
- detectErrors(code) {
3
- const errors = [];
4
- const lines = code.split('\n');
5
- for (let i = 0; i < lines.length; i++) {
6
- const line = lines[i];
7
- const lineNumber = i + 1;
8
- // Detect array bounds violations
9
- const arrayAccessMatch = line.match(/(\w+)\s*\[\s*([^\]]+)\s*\]/g);
10
- if (arrayAccessMatch) {
11
- for (const match of arrayAccessMatch) {
12
- const indexMatch = match.match(/\[\s*([^\]]+)\s*\]/);
13
- if (indexMatch) {
14
- const index = indexMatch[1].trim();
15
- // Check for negative index
16
- if (index.startsWith('-')) {
17
- errors.push({
18
- type: 'runtime',
19
- message: `Array access with negative index: ${index}`,
20
- line: lineNumber,
21
- column: line.indexOf(match) + 1,
22
- priority: 2,
23
- fix: 'Ensure array index is non-negative',
24
- });
25
- }
26
- // Check for variable index (potential out of bounds)
27
- else if (!/^\d+$/.test(index) && !index.includes('length')) {
28
- errors.push({
29
- type: 'runtime',
30
- message: `Array access with variable index may be out of bounds: ${index}`,
31
- line: lineNumber,
32
- column: line.indexOf(match) + 1,
33
- priority: 2,
34
- fix: 'Add bounds checking before array access',
35
- });
36
- }
37
- }
38
- }
39
- }
40
- // Detect division by zero
41
- const divisionMatch = line.match(/\/(\s*0\s*|[\w\s]+\s*-\s*[\w\s]+)/);
42
- if (divisionMatch) {
43
- errors.push({
44
- type: 'runtime',
45
- message: 'Potential division by zero',
46
- line: lineNumber,
47
- column: line.indexOf('/') + 1,
48
- priority: 2,
49
- fix: 'Add zero check before division',
50
- });
51
- }
52
- // Detect null/undefined dereference
53
- const nullDerefMatch = line.match(/(null|undefined)\s*\./);
54
- if (nullDerefMatch) {
55
- errors.push({
56
- type: 'runtime',
57
- message: `Direct ${nullDerefMatch[1]} property access`,
58
- line: lineNumber,
59
- column: line.indexOf(nullDerefMatch[0]) + 1,
60
- priority: 2,
61
- fix: 'Use optional chaining (?.) or null check',
62
- });
63
- }
64
- // Detect unhandled promises
65
- const promiseMatch = line.match(/\b(\w+)\s*\([^)]*\)(?!\s*\.(then|catch|await))/);
66
- if (promiseMatch && this.looksLikeAsyncFunction(line)) {
67
- errors.push({
68
- type: 'runtime',
69
- message: `Promise may be unhandled: ${promiseMatch[1]}`,
70
- line: lineNumber,
71
- column: line.indexOf(promiseMatch[0]) + 1,
72
- priority: 2,
73
- fix: 'Add .catch() or await the promise',
74
- });
75
- }
76
- }
77
- return this.prioritize(errors);
78
- }
79
- looksLikeAsyncFunction(line) {
80
- return /async|Promise|fetch|axios|request/.test(line);
81
- }
82
- prioritize(errors) {
83
- return errors.sort((a, b) => a.priority - b.priority);
84
- }
85
- }
86
- //# sourceMappingURL=runtime-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-detector.js","sourceRoot":"","sources":["../../src/errors/runtime-detector.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import type { DetectedError } from './pattern-matcher.js';
2
- export declare class SecurityDetector {
3
- detectErrors(code: string): DetectedError[];
4
- private prioritize;
5
- }
6
- //# sourceMappingURL=security-detector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-detector.d.ts","sourceRoot":"","sources":["../../src/errors/security-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,gBAAgB;IAC3B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IA6E3C,OAAO,CAAC,UAAU;CAGnB"}