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.
- package/LICENSE +21 -0
- package/README.md +348 -0
- package/dist/agent/agentTools.d.ts +26 -0
- package/dist/agent/agentTools.d.ts.map +1 -0
- package/dist/agent/agentTools.js +699 -0
- package/dist/agent/agentTools.js.map +1 -0
- package/dist/agent/autoValidator.d.ts +110 -0
- package/dist/agent/autoValidator.d.ts.map +1 -0
- package/dist/agent/autoValidator.js +964 -0
- package/dist/agent/autoValidator.js.map +1 -0
- package/dist/agent/fileWatcher.d.ts +28 -0
- package/dist/agent/fileWatcher.d.ts.map +1 -0
- package/dist/agent/fileWatcher.js +88 -0
- package/dist/agent/fileWatcher.js.map +1 -0
- package/dist/agent/guardianPersistence.d.ts +98 -0
- package/dist/agent/guardianPersistence.d.ts.map +1 -0
- package/dist/agent/guardianPersistence.js +296 -0
- package/dist/agent/guardianPersistence.js.map +1 -0
- package/dist/agent/mcpNotifications.d.ts +38 -0
- package/dist/agent/mcpNotifications.d.ts.map +1 -0
- package/dist/agent/mcpNotifications.js +81 -0
- package/dist/agent/mcpNotifications.js.map +1 -0
- package/dist/analyzers/aiPatterns.d.ts +16 -0
- package/dist/analyzers/aiPatterns.d.ts.map +1 -0
- package/dist/analyzers/aiPatterns.js +103 -0
- package/dist/analyzers/aiPatterns.js.map +1 -0
- package/dist/analyzers/antiPatterns.d.ts +60 -0
- package/dist/analyzers/antiPatterns.d.ts.map +1 -0
- package/dist/analyzers/antiPatterns.js +198 -0
- package/dist/analyzers/antiPatterns.js.map +1 -0
- package/dist/analyzers/builtinTypes.d.ts +18 -0
- package/dist/analyzers/builtinTypes.d.ts.map +1 -0
- package/dist/analyzers/builtinTypes.js +1275 -0
- package/dist/analyzers/builtinTypes.js.map +1 -0
- package/dist/analyzers/complexity.d.ts +14 -0
- package/dist/analyzers/complexity.d.ts.map +1 -0
- package/dist/analyzers/complexity.js +610 -0
- package/dist/analyzers/complexity.js.map +1 -0
- package/dist/analyzers/findingVerifier.d.ts +59 -0
- package/dist/analyzers/findingVerifier.d.ts.map +1 -0
- package/dist/analyzers/findingVerifier.js +1169 -0
- package/dist/analyzers/findingVerifier.js.map +1 -0
- package/dist/analyzers/impactAnalyzer.d.ts +53 -0
- package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/impactAnalyzer.js +152 -0
- package/dist/analyzers/impactAnalyzer.js.map +1 -0
- package/dist/analyzers/languageDetector.d.ts +48 -0
- package/dist/analyzers/languageDetector.d.ts.map +1 -0
- package/dist/analyzers/languageDetector.js +404 -0
- package/dist/analyzers/languageDetector.js.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.js +193 -0
- package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.js +324 -0
- package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.js +429 -0
- package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.js +709 -0
- package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
- package/dist/analyzers/relevanceScorer.d.ts +43 -0
- package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
- package/dist/analyzers/relevanceScorer.js +200 -0
- package/dist/analyzers/relevanceScorer.js.map +1 -0
- package/dist/analyzers/standardLibrary.d.ts +22 -0
- package/dist/analyzers/standardLibrary.d.ts.map +1 -0
- package/dist/analyzers/standardLibrary.js +211 -0
- package/dist/analyzers/standardLibrary.js.map +1 -0
- package/dist/analyzers/symbolGraph.d.ts +30 -0
- package/dist/analyzers/symbolGraph.d.ts.map +1 -0
- package/dist/analyzers/symbolGraph.js +380 -0
- package/dist/analyzers/symbolGraph.js.map +1 -0
- package/dist/analyzers/symbolTable.d.ts +18 -0
- package/dist/analyzers/symbolTable.d.ts.map +1 -0
- package/dist/analyzers/symbolTable.js +176 -0
- package/dist/analyzers/symbolTable.js.map +1 -0
- package/dist/analyzers/typeChecker.d.ts +13 -0
- package/dist/analyzers/typeChecker.d.ts.map +1 -0
- package/dist/analyzers/typeChecker.js +580 -0
- package/dist/analyzers/typeChecker.js.map +1 -0
- package/dist/analyzers/usagePatterns.d.ts +42 -0
- package/dist/analyzers/usagePatterns.d.ts.map +1 -0
- package/dist/analyzers/usagePatterns.js +75 -0
- package/dist/analyzers/usagePatterns.js.map +1 -0
- package/dist/api-contract/context/backend.d.ts +19 -0
- package/dist/api-contract/context/backend.d.ts.map +1 -0
- package/dist/api-contract/context/backend.js +64 -0
- package/dist/api-contract/context/backend.js.map +1 -0
- package/dist/api-contract/context/contract.d.ts +34 -0
- package/dist/api-contract/context/contract.d.ts.map +1 -0
- package/dist/api-contract/context/contract.js +306 -0
- package/dist/api-contract/context/contract.js.map +1 -0
- package/dist/api-contract/context/frontend.d.ts +19 -0
- package/dist/api-contract/context/frontend.d.ts.map +1 -0
- package/dist/api-contract/context/frontend.js +64 -0
- package/dist/api-contract/context/frontend.js.map +1 -0
- package/dist/api-contract/detector.d.ts +28 -0
- package/dist/api-contract/detector.d.ts.map +1 -0
- package/dist/api-contract/detector.js +393 -0
- package/dist/api-contract/detector.js.map +1 -0
- package/dist/api-contract/extractors/python.d.ts +32 -0
- package/dist/api-contract/extractors/python.d.ts.map +1 -0
- package/dist/api-contract/extractors/python.js +521 -0
- package/dist/api-contract/extractors/python.js.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
- package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.js +173 -0
- package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/typescript.d.ts +32 -0
- package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
- package/dist/api-contract/extractors/typescript.js +666 -0
- package/dist/api-contract/extractors/typescript.js.map +1 -0
- package/dist/api-contract/index.d.ts +104 -0
- package/dist/api-contract/index.d.ts.map +1 -0
- package/dist/api-contract/index.js +232 -0
- package/dist/api-contract/index.js.map +1 -0
- package/dist/api-contract/types.d.ts +151 -0
- package/dist/api-contract/types.d.ts.map +1 -0
- package/dist/api-contract/types.js +19 -0
- package/dist/api-contract/types.js.map +1 -0
- package/dist/api-contract/validators/endpoint.d.ts +21 -0
- package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
- package/dist/api-contract/validators/endpoint.js +224 -0
- package/dist/api-contract/validators/endpoint.js.map +1 -0
- package/dist/api-contract/validators/index.d.ts +40 -0
- package/dist/api-contract/validators/index.d.ts.map +1 -0
- package/dist/api-contract/validators/index.js +875 -0
- package/dist/api-contract/validators/index.js.map +1 -0
- package/dist/api-contract/validators/parameter.d.ts +17 -0
- package/dist/api-contract/validators/parameter.d.ts.map +1 -0
- package/dist/api-contract/validators/parameter.js +250 -0
- package/dist/api-contract/validators/parameter.js.map +1 -0
- package/dist/api-contract/validators/type.d.ts +38 -0
- package/dist/api-contract/validators/type.d.ts.map +1 -0
- package/dist/api-contract/validators/type.js +244 -0
- package/dist/api-contract/validators/type.js.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.js +665 -0
- package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
- package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
- package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
- package/dist/context/apiContract/graphqlSupport.js +671 -0
- package/dist/context/apiContract/graphqlSupport.js.map +1 -0
- package/dist/context/apiContract/index.d.ts +14 -0
- package/dist/context/apiContract/index.d.ts.map +1 -0
- package/dist/context/apiContract/index.js +17 -0
- package/dist/context/apiContract/index.js.map +1 -0
- package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
- package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
- package/dist/context/apiContract/webSocketSupport.js +465 -0
- package/dist/context/apiContract/webSocketSupport.js.map +1 -0
- package/dist/context/apiContractContext.d.ts +15 -0
- package/dist/context/apiContractContext.d.ts.map +1 -0
- package/dist/context/apiContractContext.js +979 -0
- package/dist/context/apiContractContext.js.map +1 -0
- package/dist/context/apiContractExtraction.d.ts +52 -0
- package/dist/context/apiContractExtraction.d.ts.map +1 -0
- package/dist/context/apiContractExtraction.js +438 -0
- package/dist/context/apiContractExtraction.js.map +1 -0
- package/dist/context/contextLineage.d.ts +79 -0
- package/dist/context/contextLineage.d.ts.map +1 -0
- package/dist/context/contextLineage.js +259 -0
- package/dist/context/contextLineage.js.map +1 -0
- package/dist/context/contextOrchestrator.d.ts +57 -0
- package/dist/context/contextOrchestrator.d.ts.map +1 -0
- package/dist/context/contextOrchestrator.js +162 -0
- package/dist/context/contextOrchestrator.js.map +1 -0
- package/dist/context/intentTracker.d.ts +73 -0
- package/dist/context/intentTracker.d.ts.map +1 -0
- package/dist/context/intentTracker.js +168 -0
- package/dist/context/intentTracker.js.map +1 -0
- package/dist/context/projectContext.d.ts +219 -0
- package/dist/context/projectContext.d.ts.map +1 -0
- package/dist/context/projectContext.js +1984 -0
- package/dist/context/projectContext.js.map +1 -0
- package/dist/prompts/index.d.ts +17 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +260 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/library.d.ts +51 -0
- package/dist/prompts/library.d.ts.map +1 -0
- package/dist/prompts/library.js +65 -0
- package/dist/prompts/library.js.map +1 -0
- package/dist/prompts/templates.d.ts +44 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +97 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/queue/jobPersistence.d.ts +46 -0
- package/dist/queue/jobPersistence.d.ts.map +1 -0
- package/dist/queue/jobPersistence.js +158 -0
- package/dist/queue/jobPersistence.js.map +1 -0
- package/dist/queue/jobQueue.d.ts +116 -0
- package/dist/queue/jobQueue.d.ts.map +1 -0
- package/dist/queue/jobQueue.js +275 -0
- package/dist/queue/jobQueue.js.map +1 -0
- package/dist/queue/validationJob.d.ts +69 -0
- package/dist/queue/validationJob.d.ts.map +1 -0
- package/dist/queue/validationJob.js +435 -0
- package/dist/queue/validationJob.js.map +1 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +328 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/validationReportStore.d.ts +170 -0
- package/dist/resources/validationReportStore.d.ts.map +1 -0
- package/dist/resources/validationReportStore.js +515 -0
- package/dist/resources/validationReportStore.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +102 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/asyncValidation.d.ts +19 -0
- package/dist/tools/asyncValidation.d.ts.map +1 -0
- package/dist/tools/asyncValidation.js +346 -0
- package/dist/tools/asyncValidation.js.map +1 -0
- package/dist/tools/buildContext.d.ts +17 -0
- package/dist/tools/buildContext.d.ts.map +1 -0
- package/dist/tools/buildContext.js +188 -0
- package/dist/tools/buildContext.js.map +1 -0
- package/dist/tools/getDependencyGraph.d.ts +16 -0
- package/dist/tools/getDependencyGraph.d.ts.map +1 -0
- package/dist/tools/getDependencyGraph.js +436 -0
- package/dist/tools/getDependencyGraph.js.map +1 -0
- package/dist/tools/incrementalValidation.d.ts +71 -0
- package/dist/tools/incrementalValidation.d.ts.map +1 -0
- package/dist/tools/incrementalValidation.js +203 -0
- package/dist/tools/incrementalValidation.js.map +1 -0
- package/dist/tools/index.d.ts +24 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +106 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/validateCode.d.ts +17 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +368 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateCodeLite.d.ts +2 -0
- package/dist/tools/validateCodeLite.d.ts.map +1 -0
- package/dist/tools/validateCodeLite.js +2 -0
- package/dist/tools/validateCodeLite.js.map +1 -0
- package/dist/tools/validation/builtins.d.ts +92 -0
- package/dist/tools/validation/builtins.d.ts.map +1 -0
- package/dist/tools/validation/builtins.js +2184 -0
- package/dist/tools/validation/builtins.js.map +1 -0
- package/dist/tools/validation/contextualNaming.d.ts +99 -0
- package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
- package/dist/tools/validation/contextualNaming.js +959 -0
- package/dist/tools/validation/contextualNaming.js.map +1 -0
- package/dist/tools/validation/deadCode.d.ts +115 -0
- package/dist/tools/validation/deadCode.d.ts.map +1 -0
- package/dist/tools/validation/deadCode.js +861 -0
- package/dist/tools/validation/deadCode.js.map +1 -0
- package/dist/tools/validation/extractors/index.d.ts +131 -0
- package/dist/tools/validation/extractors/index.d.ts.map +1 -0
- package/dist/tools/validation/extractors/index.js +233 -0
- package/dist/tools/validation/extractors/index.js.map +1 -0
- package/dist/tools/validation/extractors/javascript.d.ts +73 -0
- package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
- package/dist/tools/validation/extractors/javascript.js +1841 -0
- package/dist/tools/validation/extractors/javascript.js.map +1 -0
- package/dist/tools/validation/extractors/python.d.ts +93 -0
- package/dist/tools/validation/extractors/python.d.ts.map +1 -0
- package/dist/tools/validation/extractors/python.js +799 -0
- package/dist/tools/validation/extractors/python.js.map +1 -0
- package/dist/tools/validation/manifest.d.ts +45 -0
- package/dist/tools/validation/manifest.d.ts.map +1 -0
- package/dist/tools/validation/manifest.js +719 -0
- package/dist/tools/validation/manifest.js.map +1 -0
- package/dist/tools/validation/parser.d.ts +58 -0
- package/dist/tools/validation/parser.d.ts.map +1 -0
- package/dist/tools/validation/parser.js +232 -0
- package/dist/tools/validation/parser.js.map +1 -0
- package/dist/tools/validation/registry.d.ts +15 -0
- package/dist/tools/validation/registry.d.ts.map +1 -0
- package/dist/tools/validation/registry.js +169 -0
- package/dist/tools/validation/registry.js.map +1 -0
- package/dist/tools/validation/scoring.d.ts +54 -0
- package/dist/tools/validation/scoring.d.ts.map +1 -0
- package/dist/tools/validation/scoring.js +242 -0
- package/dist/tools/validation/scoring.js.map +1 -0
- package/dist/tools/validation/types.d.ts +120 -0
- package/dist/tools/validation/types.d.ts.map +1 -0
- package/dist/tools/validation/types.js +11 -0
- package/dist/tools/validation/types.js.map +1 -0
- package/dist/tools/validation/unusedLocals.d.ts +36 -0
- package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
- package/dist/tools/validation/unusedLocals.js +333 -0
- package/dist/tools/validation/unusedLocals.js.map +1 -0
- package/dist/tools/validation/validation.d.ts +98 -0
- package/dist/tools/validation/validation.d.ts.map +1 -0
- package/dist/tools/validation/validation.js +1837 -0
- package/dist/tools/validation/validation.js.map +1 -0
- package/dist/types/codeGraph.d.ts +163 -0
- package/dist/types/codeGraph.d.ts.map +1 -0
- package/dist/types/codeGraph.js +9 -0
- package/dist/types/codeGraph.js.map +1 -0
- package/dist/types/symbolGraph.d.ts +68 -0
- package/dist/types/symbolGraph.d.ts.map +1 -0
- package/dist/types/symbolGraph.js +10 -0
- package/dist/types/symbolGraph.js.map +1 -0
- package/dist/types/tools.d.ts +43 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +7 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/fileFilter.d.ts +37 -0
- package/dist/utils/fileFilter.d.ts.map +1 -0
- package/dist/utils/fileFilter.js +91 -0
- package/dist/utils/fileFilter.js.map +1 -0
- package/dist/utils/gitUtils.d.ts +28 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +81 -0
- package/dist/utils/gitUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/serialization.d.ts +25 -0
- package/dist/utils/serialization.d.ts.map +1 -0
- package/dist/utils/serialization.js +53 -0
- package/dist/utils/serialization.js.map +1 -0
- 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
|