codeguardian-mcp 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 (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +348 -0
  3. package/dist/agent/agentTools.d.ts +26 -0
  4. package/dist/agent/agentTools.d.ts.map +1 -0
  5. package/dist/agent/agentTools.js +699 -0
  6. package/dist/agent/agentTools.js.map +1 -0
  7. package/dist/agent/autoValidator.d.ts +110 -0
  8. package/dist/agent/autoValidator.d.ts.map +1 -0
  9. package/dist/agent/autoValidator.js +964 -0
  10. package/dist/agent/autoValidator.js.map +1 -0
  11. package/dist/agent/fileWatcher.d.ts +28 -0
  12. package/dist/agent/fileWatcher.d.ts.map +1 -0
  13. package/dist/agent/fileWatcher.js +88 -0
  14. package/dist/agent/fileWatcher.js.map +1 -0
  15. package/dist/agent/guardianPersistence.d.ts +98 -0
  16. package/dist/agent/guardianPersistence.d.ts.map +1 -0
  17. package/dist/agent/guardianPersistence.js +296 -0
  18. package/dist/agent/guardianPersistence.js.map +1 -0
  19. package/dist/agent/mcpNotifications.d.ts +38 -0
  20. package/dist/agent/mcpNotifications.d.ts.map +1 -0
  21. package/dist/agent/mcpNotifications.js +81 -0
  22. package/dist/agent/mcpNotifications.js.map +1 -0
  23. package/dist/analyzers/aiPatterns.d.ts +16 -0
  24. package/dist/analyzers/aiPatterns.d.ts.map +1 -0
  25. package/dist/analyzers/aiPatterns.js +103 -0
  26. package/dist/analyzers/aiPatterns.js.map +1 -0
  27. package/dist/analyzers/antiPatterns.d.ts +60 -0
  28. package/dist/analyzers/antiPatterns.d.ts.map +1 -0
  29. package/dist/analyzers/antiPatterns.js +198 -0
  30. package/dist/analyzers/antiPatterns.js.map +1 -0
  31. package/dist/analyzers/builtinTypes.d.ts +18 -0
  32. package/dist/analyzers/builtinTypes.d.ts.map +1 -0
  33. package/dist/analyzers/builtinTypes.js +1275 -0
  34. package/dist/analyzers/builtinTypes.js.map +1 -0
  35. package/dist/analyzers/complexity.d.ts +14 -0
  36. package/dist/analyzers/complexity.d.ts.map +1 -0
  37. package/dist/analyzers/complexity.js +610 -0
  38. package/dist/analyzers/complexity.js.map +1 -0
  39. package/dist/analyzers/findingVerifier.d.ts +59 -0
  40. package/dist/analyzers/findingVerifier.d.ts.map +1 -0
  41. package/dist/analyzers/findingVerifier.js +1169 -0
  42. package/dist/analyzers/findingVerifier.js.map +1 -0
  43. package/dist/analyzers/impactAnalyzer.d.ts +53 -0
  44. package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
  45. package/dist/analyzers/impactAnalyzer.js +152 -0
  46. package/dist/analyzers/impactAnalyzer.js.map +1 -0
  47. package/dist/analyzers/languageDetector.d.ts +48 -0
  48. package/dist/analyzers/languageDetector.d.ts.map +1 -0
  49. package/dist/analyzers/languageDetector.js +404 -0
  50. package/dist/analyzers/languageDetector.js.map +1 -0
  51. package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
  52. package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
  53. package/dist/analyzers/parsers/incrementalParser.js +193 -0
  54. package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
  55. package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
  56. package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
  57. package/dist/analyzers/parsers/scopeResolver.js +324 -0
  58. package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
  59. package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
  60. package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
  61. package/dist/analyzers/parsers/semanticIndex.js +429 -0
  62. package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
  63. package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
  64. package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
  65. package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
  66. package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
  67. package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
  68. package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
  69. package/dist/analyzers/parsers/treeSitterParser.js +709 -0
  70. package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
  71. package/dist/analyzers/relevanceScorer.d.ts +43 -0
  72. package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
  73. package/dist/analyzers/relevanceScorer.js +200 -0
  74. package/dist/analyzers/relevanceScorer.js.map +1 -0
  75. package/dist/analyzers/standardLibrary.d.ts +22 -0
  76. package/dist/analyzers/standardLibrary.d.ts.map +1 -0
  77. package/dist/analyzers/standardLibrary.js +211 -0
  78. package/dist/analyzers/standardLibrary.js.map +1 -0
  79. package/dist/analyzers/symbolGraph.d.ts +30 -0
  80. package/dist/analyzers/symbolGraph.d.ts.map +1 -0
  81. package/dist/analyzers/symbolGraph.js +380 -0
  82. package/dist/analyzers/symbolGraph.js.map +1 -0
  83. package/dist/analyzers/symbolTable.d.ts +18 -0
  84. package/dist/analyzers/symbolTable.d.ts.map +1 -0
  85. package/dist/analyzers/symbolTable.js +176 -0
  86. package/dist/analyzers/symbolTable.js.map +1 -0
  87. package/dist/analyzers/typeChecker.d.ts +13 -0
  88. package/dist/analyzers/typeChecker.d.ts.map +1 -0
  89. package/dist/analyzers/typeChecker.js +580 -0
  90. package/dist/analyzers/typeChecker.js.map +1 -0
  91. package/dist/analyzers/usagePatterns.d.ts +42 -0
  92. package/dist/analyzers/usagePatterns.d.ts.map +1 -0
  93. package/dist/analyzers/usagePatterns.js +75 -0
  94. package/dist/analyzers/usagePatterns.js.map +1 -0
  95. package/dist/api-contract/context/backend.d.ts +19 -0
  96. package/dist/api-contract/context/backend.d.ts.map +1 -0
  97. package/dist/api-contract/context/backend.js +64 -0
  98. package/dist/api-contract/context/backend.js.map +1 -0
  99. package/dist/api-contract/context/contract.d.ts +34 -0
  100. package/dist/api-contract/context/contract.d.ts.map +1 -0
  101. package/dist/api-contract/context/contract.js +306 -0
  102. package/dist/api-contract/context/contract.js.map +1 -0
  103. package/dist/api-contract/context/frontend.d.ts +19 -0
  104. package/dist/api-contract/context/frontend.d.ts.map +1 -0
  105. package/dist/api-contract/context/frontend.js +64 -0
  106. package/dist/api-contract/context/frontend.js.map +1 -0
  107. package/dist/api-contract/detector.d.ts +28 -0
  108. package/dist/api-contract/detector.d.ts.map +1 -0
  109. package/dist/api-contract/detector.js +393 -0
  110. package/dist/api-contract/detector.js.map +1 -0
  111. package/dist/api-contract/extractors/python.d.ts +32 -0
  112. package/dist/api-contract/extractors/python.d.ts.map +1 -0
  113. package/dist/api-contract/extractors/python.js +521 -0
  114. package/dist/api-contract/extractors/python.js.map +1 -0
  115. package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
  116. package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
  117. package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
  118. package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
  119. package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
  120. package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
  121. package/dist/api-contract/extractors/tsAstUtils.js +173 -0
  122. package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
  123. package/dist/api-contract/extractors/typescript.d.ts +32 -0
  124. package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
  125. package/dist/api-contract/extractors/typescript.js +666 -0
  126. package/dist/api-contract/extractors/typescript.js.map +1 -0
  127. package/dist/api-contract/index.d.ts +104 -0
  128. package/dist/api-contract/index.d.ts.map +1 -0
  129. package/dist/api-contract/index.js +232 -0
  130. package/dist/api-contract/index.js.map +1 -0
  131. package/dist/api-contract/types.d.ts +151 -0
  132. package/dist/api-contract/types.d.ts.map +1 -0
  133. package/dist/api-contract/types.js +19 -0
  134. package/dist/api-contract/types.js.map +1 -0
  135. package/dist/api-contract/validators/endpoint.d.ts +21 -0
  136. package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
  137. package/dist/api-contract/validators/endpoint.js +224 -0
  138. package/dist/api-contract/validators/endpoint.js.map +1 -0
  139. package/dist/api-contract/validators/index.d.ts +40 -0
  140. package/dist/api-contract/validators/index.d.ts.map +1 -0
  141. package/dist/api-contract/validators/index.js +875 -0
  142. package/dist/api-contract/validators/index.js.map +1 -0
  143. package/dist/api-contract/validators/parameter.d.ts +17 -0
  144. package/dist/api-contract/validators/parameter.d.ts.map +1 -0
  145. package/dist/api-contract/validators/parameter.js +250 -0
  146. package/dist/api-contract/validators/parameter.js.map +1 -0
  147. package/dist/api-contract/validators/type.d.ts +38 -0
  148. package/dist/api-contract/validators/type.d.ts.map +1 -0
  149. package/dist/api-contract/validators/type.js +244 -0
  150. package/dist/api-contract/validators/type.js.map +1 -0
  151. package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
  152. package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
  153. package/dist/context/apiContract/complexTypeSupport.js +665 -0
  154. package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
  155. package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
  156. package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
  157. package/dist/context/apiContract/graphqlSupport.js +671 -0
  158. package/dist/context/apiContract/graphqlSupport.js.map +1 -0
  159. package/dist/context/apiContract/index.d.ts +14 -0
  160. package/dist/context/apiContract/index.d.ts.map +1 -0
  161. package/dist/context/apiContract/index.js +17 -0
  162. package/dist/context/apiContract/index.js.map +1 -0
  163. package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
  164. package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
  165. package/dist/context/apiContract/webSocketSupport.js +465 -0
  166. package/dist/context/apiContract/webSocketSupport.js.map +1 -0
  167. package/dist/context/apiContractContext.d.ts +15 -0
  168. package/dist/context/apiContractContext.d.ts.map +1 -0
  169. package/dist/context/apiContractContext.js +979 -0
  170. package/dist/context/apiContractContext.js.map +1 -0
  171. package/dist/context/apiContractExtraction.d.ts +52 -0
  172. package/dist/context/apiContractExtraction.d.ts.map +1 -0
  173. package/dist/context/apiContractExtraction.js +438 -0
  174. package/dist/context/apiContractExtraction.js.map +1 -0
  175. package/dist/context/contextLineage.d.ts +79 -0
  176. package/dist/context/contextLineage.d.ts.map +1 -0
  177. package/dist/context/contextLineage.js +259 -0
  178. package/dist/context/contextLineage.js.map +1 -0
  179. package/dist/context/contextOrchestrator.d.ts +57 -0
  180. package/dist/context/contextOrchestrator.d.ts.map +1 -0
  181. package/dist/context/contextOrchestrator.js +162 -0
  182. package/dist/context/contextOrchestrator.js.map +1 -0
  183. package/dist/context/intentTracker.d.ts +73 -0
  184. package/dist/context/intentTracker.d.ts.map +1 -0
  185. package/dist/context/intentTracker.js +168 -0
  186. package/dist/context/intentTracker.js.map +1 -0
  187. package/dist/context/projectContext.d.ts +219 -0
  188. package/dist/context/projectContext.d.ts.map +1 -0
  189. package/dist/context/projectContext.js +1984 -0
  190. package/dist/context/projectContext.js.map +1 -0
  191. package/dist/prompts/index.d.ts +17 -0
  192. package/dist/prompts/index.d.ts.map +1 -0
  193. package/dist/prompts/index.js +260 -0
  194. package/dist/prompts/index.js.map +1 -0
  195. package/dist/prompts/library.d.ts +51 -0
  196. package/dist/prompts/library.d.ts.map +1 -0
  197. package/dist/prompts/library.js +65 -0
  198. package/dist/prompts/library.js.map +1 -0
  199. package/dist/prompts/templates.d.ts +44 -0
  200. package/dist/prompts/templates.d.ts.map +1 -0
  201. package/dist/prompts/templates.js +97 -0
  202. package/dist/prompts/templates.js.map +1 -0
  203. package/dist/queue/jobPersistence.d.ts +46 -0
  204. package/dist/queue/jobPersistence.d.ts.map +1 -0
  205. package/dist/queue/jobPersistence.js +158 -0
  206. package/dist/queue/jobPersistence.js.map +1 -0
  207. package/dist/queue/jobQueue.d.ts +116 -0
  208. package/dist/queue/jobQueue.d.ts.map +1 -0
  209. package/dist/queue/jobQueue.js +275 -0
  210. package/dist/queue/jobQueue.js.map +1 -0
  211. package/dist/queue/validationJob.d.ts +69 -0
  212. package/dist/queue/validationJob.d.ts.map +1 -0
  213. package/dist/queue/validationJob.js +435 -0
  214. package/dist/queue/validationJob.js.map +1 -0
  215. package/dist/resources/index.d.ts +15 -0
  216. package/dist/resources/index.d.ts.map +1 -0
  217. package/dist/resources/index.js +328 -0
  218. package/dist/resources/index.js.map +1 -0
  219. package/dist/resources/validationReportStore.d.ts +170 -0
  220. package/dist/resources/validationReportStore.d.ts.map +1 -0
  221. package/dist/resources/validationReportStore.js +515 -0
  222. package/dist/resources/validationReportStore.js.map +1 -0
  223. package/dist/server.d.ts +12 -0
  224. package/dist/server.d.ts.map +1 -0
  225. package/dist/server.js +102 -0
  226. package/dist/server.js.map +1 -0
  227. package/dist/tools/asyncValidation.d.ts +19 -0
  228. package/dist/tools/asyncValidation.d.ts.map +1 -0
  229. package/dist/tools/asyncValidation.js +346 -0
  230. package/dist/tools/asyncValidation.js.map +1 -0
  231. package/dist/tools/buildContext.d.ts +17 -0
  232. package/dist/tools/buildContext.d.ts.map +1 -0
  233. package/dist/tools/buildContext.js +188 -0
  234. package/dist/tools/buildContext.js.map +1 -0
  235. package/dist/tools/getDependencyGraph.d.ts +16 -0
  236. package/dist/tools/getDependencyGraph.d.ts.map +1 -0
  237. package/dist/tools/getDependencyGraph.js +436 -0
  238. package/dist/tools/getDependencyGraph.js.map +1 -0
  239. package/dist/tools/incrementalValidation.d.ts +71 -0
  240. package/dist/tools/incrementalValidation.d.ts.map +1 -0
  241. package/dist/tools/incrementalValidation.js +203 -0
  242. package/dist/tools/incrementalValidation.js.map +1 -0
  243. package/dist/tools/index.d.ts +24 -0
  244. package/dist/tools/index.d.ts.map +1 -0
  245. package/dist/tools/index.js +106 -0
  246. package/dist/tools/index.js.map +1 -0
  247. package/dist/tools/validateCode.d.ts +17 -0
  248. package/dist/tools/validateCode.d.ts.map +1 -0
  249. package/dist/tools/validateCode.js +368 -0
  250. package/dist/tools/validateCode.js.map +1 -0
  251. package/dist/tools/validateCodeLite.d.ts +2 -0
  252. package/dist/tools/validateCodeLite.d.ts.map +1 -0
  253. package/dist/tools/validateCodeLite.js +2 -0
  254. package/dist/tools/validateCodeLite.js.map +1 -0
  255. package/dist/tools/validation/builtins.d.ts +92 -0
  256. package/dist/tools/validation/builtins.d.ts.map +1 -0
  257. package/dist/tools/validation/builtins.js +2184 -0
  258. package/dist/tools/validation/builtins.js.map +1 -0
  259. package/dist/tools/validation/contextualNaming.d.ts +99 -0
  260. package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
  261. package/dist/tools/validation/contextualNaming.js +959 -0
  262. package/dist/tools/validation/contextualNaming.js.map +1 -0
  263. package/dist/tools/validation/deadCode.d.ts +115 -0
  264. package/dist/tools/validation/deadCode.d.ts.map +1 -0
  265. package/dist/tools/validation/deadCode.js +861 -0
  266. package/dist/tools/validation/deadCode.js.map +1 -0
  267. package/dist/tools/validation/extractors/index.d.ts +131 -0
  268. package/dist/tools/validation/extractors/index.d.ts.map +1 -0
  269. package/dist/tools/validation/extractors/index.js +233 -0
  270. package/dist/tools/validation/extractors/index.js.map +1 -0
  271. package/dist/tools/validation/extractors/javascript.d.ts +73 -0
  272. package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
  273. package/dist/tools/validation/extractors/javascript.js +1841 -0
  274. package/dist/tools/validation/extractors/javascript.js.map +1 -0
  275. package/dist/tools/validation/extractors/python.d.ts +93 -0
  276. package/dist/tools/validation/extractors/python.d.ts.map +1 -0
  277. package/dist/tools/validation/extractors/python.js +799 -0
  278. package/dist/tools/validation/extractors/python.js.map +1 -0
  279. package/dist/tools/validation/manifest.d.ts +45 -0
  280. package/dist/tools/validation/manifest.d.ts.map +1 -0
  281. package/dist/tools/validation/manifest.js +719 -0
  282. package/dist/tools/validation/manifest.js.map +1 -0
  283. package/dist/tools/validation/parser.d.ts +58 -0
  284. package/dist/tools/validation/parser.d.ts.map +1 -0
  285. package/dist/tools/validation/parser.js +232 -0
  286. package/dist/tools/validation/parser.js.map +1 -0
  287. package/dist/tools/validation/registry.d.ts +15 -0
  288. package/dist/tools/validation/registry.d.ts.map +1 -0
  289. package/dist/tools/validation/registry.js +169 -0
  290. package/dist/tools/validation/registry.js.map +1 -0
  291. package/dist/tools/validation/scoring.d.ts +54 -0
  292. package/dist/tools/validation/scoring.d.ts.map +1 -0
  293. package/dist/tools/validation/scoring.js +242 -0
  294. package/dist/tools/validation/scoring.js.map +1 -0
  295. package/dist/tools/validation/types.d.ts +120 -0
  296. package/dist/tools/validation/types.d.ts.map +1 -0
  297. package/dist/tools/validation/types.js +11 -0
  298. package/dist/tools/validation/types.js.map +1 -0
  299. package/dist/tools/validation/unusedLocals.d.ts +36 -0
  300. package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
  301. package/dist/tools/validation/unusedLocals.js +333 -0
  302. package/dist/tools/validation/unusedLocals.js.map +1 -0
  303. package/dist/tools/validation/validation.d.ts +98 -0
  304. package/dist/tools/validation/validation.d.ts.map +1 -0
  305. package/dist/tools/validation/validation.js +1837 -0
  306. package/dist/tools/validation/validation.js.map +1 -0
  307. package/dist/types/codeGraph.d.ts +163 -0
  308. package/dist/types/codeGraph.d.ts.map +1 -0
  309. package/dist/types/codeGraph.js +9 -0
  310. package/dist/types/codeGraph.js.map +1 -0
  311. package/dist/types/symbolGraph.d.ts +68 -0
  312. package/dist/types/symbolGraph.d.ts.map +1 -0
  313. package/dist/types/symbolGraph.js +10 -0
  314. package/dist/types/symbolGraph.js.map +1 -0
  315. package/dist/types/tools.d.ts +43 -0
  316. package/dist/types/tools.d.ts.map +1 -0
  317. package/dist/types/tools.js +7 -0
  318. package/dist/types/tools.js.map +1 -0
  319. package/dist/utils/fileFilter.d.ts +37 -0
  320. package/dist/utils/fileFilter.d.ts.map +1 -0
  321. package/dist/utils/fileFilter.js +91 -0
  322. package/dist/utils/fileFilter.js.map +1 -0
  323. package/dist/utils/gitUtils.d.ts +28 -0
  324. package/dist/utils/gitUtils.d.ts.map +1 -0
  325. package/dist/utils/gitUtils.js +81 -0
  326. package/dist/utils/gitUtils.js.map +1 -0
  327. package/dist/utils/logger.d.ts +15 -0
  328. package/dist/utils/logger.d.ts.map +1 -0
  329. package/dist/utils/logger.js +38 -0
  330. package/dist/utils/logger.js.map +1 -0
  331. package/dist/utils/serialization.d.ts +25 -0
  332. package/dist/utils/serialization.d.ts.map +1 -0
  333. package/dist/utils/serialization.js +53 -0
  334. package/dist/utils/serialization.js.map +1 -0
  335. package/package.json +90 -0
@@ -0,0 +1,959 @@
1
+ /**
2
+ * Contextual Naming Heuristics Module
3
+ *
4
+ * This module implements "Trust but Verify" logic for common naming conventions.
5
+ * It recognizes intent-based variable names and auto-whitelists their expected methods.
6
+ *
7
+ * Key Features:
8
+ * - Event handler detection (e, event, evt variables)
9
+ * - Framework-specific patterns (React SyntheticEvent, DOM Event API)
10
+ * - Extensible pattern matching for team conventions
11
+ *
12
+ * @format
13
+ */
14
+ // ============================================================================
15
+ // Built-in Patterns
16
+ // ============================================================================
17
+ /**
18
+ * Event handler patterns - recognizes common event variable names
19
+ */
20
+ const EVENT_PATTERNS = [
21
+ {
22
+ variablePattern: /^(e|evt|event)$/i,
23
+ allowedMembers: new Set([
24
+ // Standard DOM Event API
25
+ "preventDefault",
26
+ "stopPropagation",
27
+ "stopImmediatePropagation",
28
+ "target",
29
+ "currentTarget",
30
+ "type",
31
+ "bubbles",
32
+ "cancelable",
33
+ "defaultPrevented",
34
+ "eventPhase",
35
+ "isTrusted",
36
+ "timeStamp",
37
+ // Mouse events
38
+ "clientX",
39
+ "clientY",
40
+ "pageX",
41
+ "pageY",
42
+ "screenX",
43
+ "screenY",
44
+ "button",
45
+ "buttons",
46
+ "relatedTarget",
47
+ // Keyboard events
48
+ "key",
49
+ "code",
50
+ "keyCode",
51
+ "charCode",
52
+ "altKey",
53
+ "ctrlKey",
54
+ "metaKey",
55
+ "shiftKey",
56
+ "repeat",
57
+ // React SyntheticEvent
58
+ "nativeEvent",
59
+ "persist",
60
+ "isPropagationStopped",
61
+ "isDefaultPrevented",
62
+ // Form events
63
+ "value",
64
+ "checked",
65
+ "files",
66
+ // Touch events
67
+ "touches",
68
+ "targetTouches",
69
+ "changedTouches",
70
+ // Wheel events
71
+ "deltaX",
72
+ "deltaY",
73
+ "deltaZ",
74
+ "deltaMode",
75
+ ]),
76
+ description: "Event handler variable (e, event, evt)",
77
+ context: "eventHandler",
78
+ },
79
+ ];
80
+ /**
81
+ * Request/Response patterns - recognizes HTTP request/response objects
82
+ */
83
+ const HTTP_PATTERNS = [
84
+ {
85
+ variablePattern: /^(req|request)$/i,
86
+ allowedMembers: new Set([
87
+ // Express/Node.js Request
88
+ "body",
89
+ "params",
90
+ "query",
91
+ "headers",
92
+ "method",
93
+ "url",
94
+ "path",
95
+ "cookies",
96
+ "session",
97
+ "user",
98
+ "get",
99
+ "header",
100
+ "accepts",
101
+ "is",
102
+ "ip",
103
+ "protocol",
104
+ "secure",
105
+ "xhr",
106
+ "baseUrl",
107
+ "originalUrl",
108
+ "hostname",
109
+ "subdomains",
110
+ // Fetch API Request
111
+ "json",
112
+ "text",
113
+ "blob",
114
+ "arrayBuffer",
115
+ "formData",
116
+ "clone",
117
+ "signal",
118
+ "cache",
119
+ "credentials",
120
+ "destination",
121
+ "integrity",
122
+ "mode",
123
+ "redirect",
124
+ "referrer",
125
+ "referrerPolicy",
126
+ ]),
127
+ description: "HTTP request object (req, request)",
128
+ context: "httpHandler",
129
+ },
130
+ {
131
+ variablePattern: /^(res|response)$/i,
132
+ allowedMembers: new Set([
133
+ // Express/Node.js Response
134
+ "status",
135
+ "send",
136
+ "json",
137
+ "redirect",
138
+ "render",
139
+ "end",
140
+ "set",
141
+ "header",
142
+ "get",
143
+ "cookie",
144
+ "clearCookie",
145
+ "type",
146
+ "sendFile",
147
+ "download",
148
+ "attachment",
149
+ "links",
150
+ "location",
151
+ "vary",
152
+ "append",
153
+ "locals",
154
+ "headersSent",
155
+ "statusCode",
156
+ "statusMessage",
157
+ // Fetch API Response
158
+ "ok",
159
+ "redirected",
160
+ "text",
161
+ "blob",
162
+ "arrayBuffer",
163
+ "formData",
164
+ "clone",
165
+ "body",
166
+ "bodyUsed",
167
+ "headers",
168
+ "url",
169
+ ]),
170
+ description: "HTTP response object (res, response)",
171
+ context: "httpHandler",
172
+ },
173
+ ];
174
+ /**
175
+ * Error handling patterns - recognizes error/exception variables
176
+ */
177
+ const ERROR_PATTERNS = [
178
+ {
179
+ variablePattern: /^(e|err|error|exception|ex)$/i,
180
+ allowedMembers: new Set([
181
+ // Standard Error properties
182
+ "message",
183
+ "name",
184
+ "stack",
185
+ "cause",
186
+ // Node.js Error extensions
187
+ "code",
188
+ "errno",
189
+ "syscall",
190
+ "path",
191
+ // Custom error properties (common patterns)
192
+ "statusCode",
193
+ "status",
194
+ "details",
195
+ "errors",
196
+ "data",
197
+ "response",
198
+ "request",
199
+ "config",
200
+ "isAxiosError",
201
+ "toJSON",
202
+ "toString",
203
+ // Python Exception methods/properties
204
+ "with_traceback",
205
+ "args",
206
+ ]),
207
+ description: "Error/exception object (err, error, exception, ex)",
208
+ context: "errorHandler",
209
+ },
210
+ ];
211
+ /**
212
+ * Context patterns - recognizes context objects (React, Vue, etc.)
213
+ */
214
+ const CONTEXT_PATTERNS = [
215
+ {
216
+ variablePattern: /^(ctx|context)$/i,
217
+ allowedMembers: new Set([
218
+ // React Context
219
+ "Provider",
220
+ "Consumer",
221
+ // Canvas Context
222
+ "fillRect",
223
+ "strokeRect",
224
+ "clearRect",
225
+ "fillText",
226
+ "strokeText",
227
+ "measureText",
228
+ "drawImage",
229
+ "createImageData",
230
+ "getImageData",
231
+ "putImageData",
232
+ "save",
233
+ "restore",
234
+ "scale",
235
+ "rotate",
236
+ "translate",
237
+ "transform",
238
+ "setTransform",
239
+ "resetTransform",
240
+ "beginPath",
241
+ "closePath",
242
+ "moveTo",
243
+ "lineTo",
244
+ "bezierCurveTo",
245
+ "quadraticCurveTo",
246
+ "arc",
247
+ "arcTo",
248
+ "ellipse",
249
+ "rect",
250
+ "fill",
251
+ "stroke",
252
+ "clip",
253
+ "isPointInPath",
254
+ "isPointInStroke",
255
+ "fillStyle",
256
+ "strokeStyle",
257
+ "lineWidth",
258
+ "lineCap",
259
+ "lineJoin",
260
+ "miterLimit",
261
+ "font",
262
+ "textAlign",
263
+ "textBaseline",
264
+ "direction",
265
+ "globalAlpha",
266
+ "globalCompositeOperation",
267
+ "shadowBlur",
268
+ "shadowColor",
269
+ "shadowOffsetX",
270
+ "shadowOffsetY",
271
+ // Koa/Express context
272
+ "request",
273
+ "response",
274
+ "req",
275
+ "res",
276
+ "app",
277
+ "state",
278
+ "throw",
279
+ "assert",
280
+ "redirect",
281
+ ]),
282
+ description: "Context object (ctx, context)",
283
+ context: "contextObject",
284
+ },
285
+ ];
286
+ /**
287
+ * Date/Time patterns - recognizes temporal variable names
288
+ * This is part of the "Common Sense Standard Library" - Vibe coders use intuitive names!
289
+ */
290
+ const DATE_PATTERNS = [
291
+ {
292
+ // Match: today, tomorrow, yesterday, date, startDate, endDate, createdAt, updatedAt, etc.
293
+ variablePattern: /^(today|tomorrow|yesterday|now|date|datetime|time|timestamp|(start|end|created|updated|deleted|modified|expires?|birth|due)(Date|Time|At)?|(date|time)(Start|End|From|To|Of|At)?)$/i,
294
+ allowedMembers: new Set([
295
+ // Date instance methods - the core ones that caused false positives!
296
+ "getDate",
297
+ "getDay",
298
+ "getFullYear",
299
+ "getHours",
300
+ "getMilliseconds",
301
+ "getMinutes",
302
+ "getMonth",
303
+ "getSeconds",
304
+ "getTime",
305
+ "getTimezoneOffset",
306
+ "getUTCDate",
307
+ "getUTCDay",
308
+ "getUTCFullYear",
309
+ "getUTCHours",
310
+ "getUTCMilliseconds",
311
+ "getUTCMinutes",
312
+ "getUTCMonth",
313
+ "getUTCSeconds",
314
+ "getYear",
315
+ "setDate",
316
+ "setFullYear",
317
+ "setHours",
318
+ "setMilliseconds",
319
+ "setMinutes",
320
+ "setMonth",
321
+ "setSeconds",
322
+ "setTime",
323
+ "setUTCDate",
324
+ "setUTCFullYear",
325
+ "setUTCHours",
326
+ "setUTCMilliseconds",
327
+ "setUTCMinutes",
328
+ "setUTCMonth",
329
+ "setUTCSeconds",
330
+ "setYear",
331
+ "toDateString",
332
+ "toISOString",
333
+ "toJSON",
334
+ "toLocaleDateString",
335
+ "toLocaleString",
336
+ "toLocaleTimeString",
337
+ "toString",
338
+ "toTimeString",
339
+ "toUTCString",
340
+ "valueOf",
341
+ // Dayjs/Moment.js methods (common in vibe coding)
342
+ "format",
343
+ "add",
344
+ "subtract",
345
+ "startOf",
346
+ "endOf",
347
+ "diff",
348
+ "isBefore",
349
+ "isAfter",
350
+ "isSame",
351
+ "isValid",
352
+ "clone",
353
+ "unix",
354
+ "utc",
355
+ "local",
356
+ "locale",
357
+ "year",
358
+ "month",
359
+ "day",
360
+ "hour",
361
+ "minute",
362
+ "second",
363
+ "millisecond",
364
+ "week",
365
+ "weekday",
366
+ "dayOfYear",
367
+ "quarter",
368
+ "daysInMonth",
369
+ "toDate",
370
+ "toArray",
371
+ "toObject",
372
+ // Python Date/Time methods
373
+ "strftime",
374
+ "strptime",
375
+ "isoformat",
376
+ "replace",
377
+ "astimezone",
378
+ "timestamp",
379
+ "weekday",
380
+ "isoweekday",
381
+ "now",
382
+ "today",
383
+ "fromtimestamp",
384
+ "utcfromtimestamp",
385
+ "combine",
386
+ "date",
387
+ "time",
388
+ "timetz",
389
+ "tzname",
390
+ "utcoffset",
391
+ "dst",
392
+ "fromisoformat",
393
+ ]),
394
+ description: "Date/time variable (today, tomorrow, date, createdAt, etc.)",
395
+ context: "dateTime",
396
+ },
397
+ ];
398
+ /**
399
+ * Array patterns - recognizes collection/array variable names
400
+ * This is part of the "Common Sense Standard Library"
401
+ * Variables named "items", "results", "list", etc. are almost always arrays!
402
+ */
403
+ const ARRAY_PATTERNS = [
404
+ {
405
+ // Match: items, results, list, data, users, todos, products, entries, records, rows, etc.
406
+ // Also catches plurals like "users", "todos", "products" which are nearly always arrays
407
+ variablePattern: /^(items?|results?|list|data|users?|todos?|products?|entries|records?|rows?|elements?|values?|keys?|options?|choices?|selections?|children|nodes?|files?|images?|documents?|messages?|comments?|posts?|articles?|orders?|transactions?|events?|tasks?|projects?|members?|participants?|attendees?|friends?|followers?|tags?|categories?|groups?|teams?|roles?|permissions?|settings?|preferences?|logs?|errors?|warnings?|notifications?|alerts?|updates?|changes?|diffs?|patches?|versions?|snapshots?|backups?|exports?|imports?|uploads?|downloads?|responses?|requests?|queries?|mutations?|subscriptions?|hooks?|callbacks?|handlers?|listeners?|observers?|watchers?|middlewares?|plugins?|extensions?|modules?|packages?|dependencies?|devDependencies?|peerDependencies?|scripts?|commands?|args?|argv|params?|arguments?|props?|attributes?|properties?|fields?|columns?|headers?|footers?|sections?|pages?|slides?|frames?|layers?|components?|widgets?|controls?|inputs?|outputs?|streams?|buffers?|chunks?|batches?|collections?|sets?|maps?|pairs?|tuples?|matches?|hits?|scores?|points?|coordinates?|positions?|locations?|addresses?|routes?|paths?|urls?|links?|refs?|references?|citations?|sources?|destinations?|targets?|origins?|endpoints?|apis?|services?|resources?|assets?|media|contents?|bodies?|payloads?|fragments?|segments?|parts?|pieces?|slices?|ranges?|intervals?|periods?|durations?|spans?|gaps?|spaces?|slots?|holes?|vacancies?|availabilities?|stocks?|inventories?|supplies?|demands?|offers?|bids?|asks?|prices?|costs?|fees?|taxes?|discounts?|coupons?|vouchers?|credits?|debits?|balances?|totals?|sums?|counts?|amounts?|quantities?|numbers?|digits?|integers?|floats?|decimals?|ratios?|percentages?|rates?|speeds?|velocities?|accelerations?|forces?|weights?|masses?|volumes?|areas?|lengths?|widths?|heights?|depths?|radii?|diameters?|circumferences?|perimeters?|angles?|degrees?|radians?|gradients?|slopes?|curves?|arcs?|lines?|rays?|vectors?|matrices?|tensors?|arrays?|queues?|stacks?|heaps?|trees?|graphs?|networks?|meshes?|grids?|tables?|charts?|plots?|diagrams?|drawings?|shapes?|figures?|symbols?|icons?|emojis?|avatars?|thumbnails?|previews?|galleries?|albums?|playlists?|tracks?|songs?|videos?|movies?|shows?|episodes?|seasons?|series?|franchises?|brands?|labels?|names?|titles?|descriptions?|summaries?|abstracts?|excerpts?|quotes?|captions?|subtitles?|transcripts?|translations?|languages?|locales?|currencies?|countries?|regions?|states?|cities?|towns?|villages?|neighborhoods?|districts?|zones?|areas?|sectors?|domains?|realms?|worlds?|universes?|dimensions?|levels?|tiers?|grades?|ranks?|ratings?|reviews?|feedback|testimonials?|recommendations?)$/i,
408
+ allowedMembers: new Set([
409
+ // Array instance methods - the most common ones
410
+ "push",
411
+ "pop",
412
+ "shift",
413
+ "unshift",
414
+ "splice",
415
+ "slice",
416
+ "concat",
417
+ "join",
418
+ "reverse",
419
+ "sort",
420
+ "filter",
421
+ "map",
422
+ "reduce",
423
+ "reduceRight",
424
+ "forEach",
425
+ "every",
426
+ "some",
427
+ "find",
428
+ "findIndex",
429
+ "findLast",
430
+ "findLastIndex",
431
+ "indexOf",
432
+ "lastIndexOf",
433
+ "includes",
434
+ "flat",
435
+ "flatMap",
436
+ "fill",
437
+ "copyWithin",
438
+ "entries",
439
+ "keys",
440
+ "values",
441
+ "at",
442
+ "with",
443
+ "toReversed",
444
+ "toSorted",
445
+ "toSpliced",
446
+ // Python List methods
447
+ "append",
448
+ "extend",
449
+ "insert",
450
+ "remove",
451
+ "count",
452
+ "index",
453
+ "clear",
454
+ "copy",
455
+ // Array properties
456
+ "length",
457
+ // Common array-like operations (lodash, underscore, etc.)
458
+ "first",
459
+ "last",
460
+ "head",
461
+ "tail",
462
+ "take",
463
+ "drop",
464
+ "chunk",
465
+ "compact",
466
+ "uniq",
467
+ "unique",
468
+ "union",
469
+ "intersection",
470
+ "difference",
471
+ "without",
472
+ "zip",
473
+ "unzip",
474
+ "flatten",
475
+ "groupBy",
476
+ "sortBy",
477
+ "orderBy",
478
+ "countBy",
479
+ "partition",
480
+ "sample",
481
+ "shuffle",
482
+ "size",
483
+ "isEmpty",
484
+ "isNotEmpty",
485
+ // Iteration (iterator protocol)
486
+ "next",
487
+ "done",
488
+ "value",
489
+ // Immutable.js / Immer patterns
490
+ "toJS",
491
+ "toArray",
492
+ "toList",
493
+ "toSet",
494
+ "toMap",
495
+ "get",
496
+ "set",
497
+ "update",
498
+ "delete",
499
+ "has",
500
+ "clear",
501
+ "merge",
502
+ ]),
503
+ description: "Array/collection variable (items, results, list, data, etc.)",
504
+ context: "collection",
505
+ },
506
+ ];
507
+ /**
508
+ * Promise/Async patterns - recognizes promise and async result variables
509
+ * Variables like "promise", "deferred", "pending" are almost always Promises
510
+ */
511
+ const PROMISE_PATTERNS = [
512
+ {
513
+ variablePattern: /^(promise|promises?|deferred|pending|awaited|async|future|futures?)$/i,
514
+ allowedMembers: new Set([
515
+ // Promise instance methods
516
+ "then",
517
+ "catch",
518
+ "finally",
519
+ // Promise properties
520
+ "resolve",
521
+ "reject",
522
+ // Bluebird/Q extensions
523
+ "spread",
524
+ "tap",
525
+ "delay",
526
+ "timeout",
527
+ "cancel",
528
+ "isFulfilled",
529
+ "isRejected",
530
+ "isPending",
531
+ "isCancelled",
532
+ "value",
533
+ "reason",
534
+ ]),
535
+ description: "Promise/async variable (promise, deferred, pending, etc.)",
536
+ context: "async",
537
+ },
538
+ ];
539
+ /**
540
+ * Map/Object patterns - recognizes dictionary/map variable names
541
+ */
542
+ const MAP_PATTERNS = [
543
+ {
544
+ variablePattern: /^(map|maps?|dictionary|dict|dicts?|hash|hashes?|cache|caches?|store|stores?|registry|registries?|lookup|lookups?|index|indexes?|indices?|data|config|configuration|payload|body|state|props|context|options|settings?|preferences?)$/i,
545
+ allowedMembers: new Set([
546
+ // Map instance methods
547
+ "get",
548
+ "set",
549
+ "has",
550
+ "delete",
551
+ "clear",
552
+ "forEach",
553
+ "entries",
554
+ "keys",
555
+ "values",
556
+ "size",
557
+ // Python Dict methods
558
+ "items",
559
+ "update",
560
+ "pop",
561
+ "popitem",
562
+ "setdefault",
563
+ "copy",
564
+ "fromkeys",
565
+ // WeakMap methods
566
+ "has",
567
+ // Object methods commonly used on maps
568
+ "assign",
569
+ "freeze",
570
+ "seal",
571
+ "isFrozen",
572
+ "isSealed",
573
+ // Common patterns
574
+ "toJSON",
575
+ "toString",
576
+ "valueOf",
577
+ ]),
578
+ description: "Map/dictionary variable (map, cache, store, lookup, etc.)",
579
+ context: "map",
580
+ },
581
+ ];
582
+ /**
583
+ * Set patterns - recognizes set/collection variable names
584
+ */
585
+ const SET_PATTERNS = [
586
+ {
587
+ variablePattern: /^(set|sets?|uniqueItems?|distinctValues?|visited|seen|processed|excluded|included|allowed|blocked|whitelist|blacklist|allowlist|denylist|permissions?Set|roleSet|tagSet|categorySet)$/i,
588
+ allowedMembers: new Set([
589
+ // Set instance methods
590
+ "add",
591
+ "delete",
592
+ "has",
593
+ "clear",
594
+ "forEach",
595
+ "entries",
596
+ "keys",
597
+ "values",
598
+ "size",
599
+ // Python Set methods
600
+ "remove",
601
+ "discard",
602
+ "pop",
603
+ "copy",
604
+ "update",
605
+ "union",
606
+ "intersection",
607
+ "difference",
608
+ "symmetric_difference",
609
+ "isdisjoint",
610
+ "issubset",
611
+ "issuperset",
612
+ // Set operations (proposed, polyfilled)
613
+ "union",
614
+ "intersection",
615
+ "difference",
616
+ "symmetricDifference",
617
+ "isSubsetOf",
618
+ "isSupersetOf",
619
+ "isDisjointFrom",
620
+ ]),
621
+ description: "Set variable (set, visited, seen, whitelist, etc.)",
622
+ context: "set",
623
+ },
624
+ ];
625
+ /**
626
+ * String patterns - recognizes string variable names that hint at string type
627
+ */
628
+ const STRING_PATTERNS = [
629
+ {
630
+ variablePattern: /^(str|string|text|content|message|msg|label|title|name|description|desc|body|subject|summary|excerpt|caption|alt|placeholder|hint|tooltip|prefix|suffix|delimiter|separator|pattern|regex|regexp|template|format|encoded|decoded|escaped|sanitized|trimmed|lowercased|uppercased|capitalized|slug|token|hash|digest|signature|checksum|uuid|guid|id|key|code|password|secret|salt|nonce|iv)$/i,
631
+ allowedMembers: new Set([
632
+ // String instance methods
633
+ "charAt",
634
+ "charCodeAt",
635
+ "codePointAt",
636
+ "concat",
637
+ "endsWith",
638
+ "includes",
639
+ "indexOf",
640
+ "lastIndexOf",
641
+ "localeCompare",
642
+ "match",
643
+ "matchAll",
644
+ "normalize",
645
+ "padEnd",
646
+ "padStart",
647
+ "repeat",
648
+ "replace",
649
+ "replaceAll",
650
+ "search",
651
+ "slice",
652
+ "split",
653
+ "startsWith",
654
+ "substring",
655
+ "toLocaleLowerCase",
656
+ "toLocaleUpperCase",
657
+ "toLowerCase",
658
+ "toUpperCase",
659
+ "toString",
660
+ "trim",
661
+ "trimEnd",
662
+ "trimStart",
663
+ "trimLeft",
664
+ "trimRight",
665
+ "valueOf",
666
+ "at",
667
+ // Python String methods
668
+ "capitalize",
669
+ "casefold",
670
+ "center",
671
+ "count",
672
+ "encode",
673
+ "endswith",
674
+ "expandtabs",
675
+ "find",
676
+ "format",
677
+ "format_map",
678
+ "index",
679
+ "isalnum",
680
+ "isalpha",
681
+ "isascii",
682
+ "isdecimal",
683
+ "isdigit",
684
+ "isidentifier",
685
+ "islower",
686
+ "isnumeric",
687
+ "isprintable",
688
+ "isspace",
689
+ "istitle",
690
+ "isupper",
691
+ "join",
692
+ "ljust",
693
+ "lower",
694
+ "lstrip",
695
+ "maketrans",
696
+ "partition",
697
+ "removeprefix",
698
+ "removesuffix",
699
+ "rfind",
700
+ "rindex",
701
+ "rjust",
702
+ "rpartition",
703
+ "rsplit",
704
+ "rstrip",
705
+ "splitlines",
706
+ "startswith",
707
+ "strip",
708
+ "swapcase",
709
+ "title",
710
+ "translate",
711
+ "upper",
712
+ "zfill",
713
+ // String properties
714
+ "length",
715
+ // Common string operations
716
+ "toJSON",
717
+ ]),
718
+ description: "String variable (str, text, message, label, etc.)",
719
+ context: "string",
720
+ },
721
+ ];
722
+ /**
723
+ * Number patterns - recognizes numeric variable names
724
+ */
725
+ const NUMBER_PATTERNS = [
726
+ {
727
+ variablePattern: /^(count|total|sum|amount|score|percent|percentage|index|offset|delta|ratio|progress|value|length|width|height|depth|radius|diameter|size|capacity|volume|mass|weight|price|cost|fee|tax|discount|balance|credit|debit)$/i,
728
+ allowedMembers: new Set([
729
+ "toFixed",
730
+ "toPrecision",
731
+ "toExponential",
732
+ "toString",
733
+ "valueOf",
734
+ "toLocaleString",
735
+ ]),
736
+ description: "Numeric variable (count, total, percent, etc.)",
737
+ context: "number",
738
+ },
739
+ ];
740
+ /**
741
+ * React Ref patterns - recognizes ref objects
742
+ */
743
+ const REF_PATTERNS = [
744
+ {
745
+ variablePattern: /^(ref|.+Ref)$/i,
746
+ allowedMembers: new Set([
747
+ "current",
748
+ ]),
749
+ description: "React Ref object (ref, inputRef, etc.)",
750
+ context: "reactRef",
751
+ },
752
+ ];
753
+ /**
754
+ * Router patterns - recognizes Next.js/React Router objects
755
+ */
756
+ const ROUTER_PATTERNS = [
757
+ {
758
+ variablePattern: /^(router|navigation)$/i,
759
+ allowedMembers: new Set([
760
+ "push",
761
+ "replace",
762
+ "back",
763
+ "forward",
764
+ "refresh",
765
+ "prefetch",
766
+ "replace",
767
+ "go",
768
+ "createHref",
769
+ "events",
770
+ ]),
771
+ description: "Router object (router, navigation)",
772
+ context: "router",
773
+ },
774
+ ];
775
+ /**
776
+ * Environment patterns - recognizes env objects
777
+ */
778
+ const ENV_PATTERNS = [
779
+ {
780
+ variablePattern: /^(env|environment|process\.env|import\.meta\.env)$/i,
781
+ allowedMembers: new Set([
782
+ "NODE_ENV",
783
+ "VERCEL",
784
+ "NEXT_PUBLIC_",
785
+ "VITE_",
786
+ ]),
787
+ description: "Environment variables",
788
+ context: "env",
789
+ },
790
+ ];
791
+ /**
792
+ * Form patterns - recognizes form handling objects (React Hook Form, Formik)
793
+ */
794
+ const FORM_PATTERNS = [
795
+ {
796
+ variablePattern: /^(form|methods?|useForm)$/i,
797
+ allowedMembers: new Set([
798
+ "register",
799
+ "control",
800
+ "handleSubmit",
801
+ "watch",
802
+ "getValues",
803
+ "setValue",
804
+ "reset",
805
+ "trigger",
806
+ "setError",
807
+ "clearErrors",
808
+ "formState",
809
+ "getFieldState",
810
+ ]),
811
+ description: "Form handler object",
812
+ context: "form",
813
+ },
814
+ ];
815
+ /**
816
+ * All built-in patterns combined
817
+ */
818
+ const ALL_PATTERNS = [
819
+ ...EVENT_PATTERNS,
820
+ ...HTTP_PATTERNS,
821
+ ...ERROR_PATTERNS,
822
+ ...CONTEXT_PATTERNS,
823
+ ...DATE_PATTERNS,
824
+ ...ARRAY_PATTERNS,
825
+ ...PROMISE_PATTERNS,
826
+ ...MAP_PATTERNS,
827
+ ...SET_PATTERNS,
828
+ ...STRING_PATTERNS,
829
+ ...NUMBER_PATTERNS,
830
+ ...REF_PATTERNS,
831
+ ...ROUTER_PATTERNS,
832
+ ...ENV_PATTERNS,
833
+ ...FORM_PATTERNS,
834
+ ];
835
+ // ============================================================================
836
+ // Pattern Matching Logic
837
+ // ============================================================================
838
+ /**
839
+ * Check if a method call should be whitelisted based on contextual naming patterns
840
+ *
841
+ * @param usage - The method call usage to check
842
+ * @param customPatterns - Optional custom patterns to check in addition to built-ins
843
+ * @returns true if the method call matches a trusted pattern, false otherwise
844
+ */
845
+ export function isContextuallyValid(usage, customPatterns = []) {
846
+ // Only check method calls
847
+ if (usage.type !== "methodCall" || !usage.object) {
848
+ return false;
849
+ }
850
+ const objectName = usage.object;
851
+ const methodName = usage.name;
852
+ // Check all patterns (built-in + custom)
853
+ const patterns = [...ALL_PATTERNS, ...customPatterns];
854
+ for (const pattern of patterns) {
855
+ // Check if the object name matches the pattern
856
+ if (pattern.variablePattern.test(objectName)) {
857
+ // Check if the method is in the allowed list
858
+ if (pattern.allowedMembers.has(methodName)) {
859
+ return true;
860
+ }
861
+ }
862
+ }
863
+ return false;
864
+ }
865
+ /**
866
+ * Get a description of why a method call is contextually valid
867
+ *
868
+ * @param usage - The method call usage
869
+ * @param customPatterns - Optional custom patterns
870
+ * @returns Description string or null if not contextually valid
871
+ */
872
+ export function getContextualReason(usage, customPatterns = []) {
873
+ if (usage.type !== "methodCall" || !usage.object) {
874
+ return null;
875
+ }
876
+ const objectName = usage.object;
877
+ const methodName = usage.name;
878
+ const patterns = [...ALL_PATTERNS, ...customPatterns];
879
+ for (const pattern of patterns) {
880
+ if (pattern.variablePattern.test(objectName)) {
881
+ if (pattern.allowedMembers.has(methodName)) {
882
+ return `${pattern.description} - '${methodName}' is a standard method`;
883
+ }
884
+ }
885
+ }
886
+ return null;
887
+ }
888
+ /**
889
+ * Filter out contextually valid usages from a list of usages
890
+ * This reduces false positives by removing method calls that match trusted patterns
891
+ *
892
+ * @param usages - Array of all usages
893
+ * @param customPatterns - Optional custom patterns
894
+ * @returns Filtered array with contextually valid usages removed
895
+ */
896
+ export function filterContextualUsages(usages, customPatterns = []) {
897
+ return usages.filter((usage) => !isContextuallyValid(usage, customPatterns));
898
+ }
899
+ /**
900
+ * Get statistics about contextual filtering
901
+ *
902
+ * @param originalUsages - Original usage array
903
+ * @param filteredUsages - Filtered usage array
904
+ * @returns Statistics object
905
+ */
906
+ export function getFilterStats(originalUsages, filteredUsages) {
907
+ const total = originalUsages.length;
908
+ const remaining = filteredUsages.length;
909
+ const filtered = total - remaining;
910
+ const filterRate = total > 0 ? (filtered / total) * 100 : 0;
911
+ return {
912
+ total,
913
+ filtered,
914
+ remaining,
915
+ filterRate: Math.round(filterRate * 10) / 10,
916
+ };
917
+ }
918
+ // ============================================================================
919
+ // Pattern Builder Utilities
920
+ // ============================================================================
921
+ /**
922
+ * Create a custom naming pattern
923
+ *
924
+ * @param config - Pattern configuration
925
+ * @returns NamingPattern object
926
+ */
927
+ export function createPattern(config) {
928
+ return {
929
+ variablePattern: typeof config.variablePattern === "string" ?
930
+ new RegExp(config.variablePattern)
931
+ : config.variablePattern,
932
+ allowedMembers: new Set(config.allowedMembers),
933
+ description: config.description,
934
+ context: config.context,
935
+ };
936
+ }
937
+ /**
938
+ * Export built-in patterns for inspection/extension
939
+ */
940
+ export const BUILTIN_PATTERNS = {
941
+ EVENT_PATTERNS,
942
+ HTTP_PATTERNS,
943
+ ERROR_PATTERNS,
944
+ CONTEXT_PATTERNS,
945
+ // "Common Sense" Standard Library patterns
946
+ DATE_PATTERNS,
947
+ ARRAY_PATTERNS,
948
+ PROMISE_PATTERNS,
949
+ MAP_PATTERNS,
950
+ SET_PATTERNS,
951
+ STRING_PATTERNS,
952
+ NUMBER_PATTERNS,
953
+ REF_PATTERNS,
954
+ ROUTER_PATTERNS,
955
+ ENV_PATTERNS,
956
+ FORM_PATTERNS,
957
+ ALL_PATTERNS,
958
+ };
959
+ //# sourceMappingURL=contextualNaming.js.map