code-auditor-mcp 3.1.1 → 3.4.1
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +724 -1
- package/README.md +85 -11
- package/dist/__test_tmp__/spec18_test.d.ts +2 -0
- package/dist/__test_tmp__/spec18_test.d.ts.map +1 -0
- package/dist/__test_tmp__/spec18_test.js +5 -0
- package/dist/__test_tmp__/spec18_test.js.map +1 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts +6 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts.map +1 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js +12 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js.map +1 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts +7 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts.map +1 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js +13 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js.map +1 -0
- package/dist/analyzers/analyzerUtils.js +2 -2
- package/dist/analyzers/analyzerUtils.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +2 -2
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts +3 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +3 -3
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +2 -2
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +83 -0
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +611 -0
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -0
- package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/documentationAnalyzer.js +8 -4
- package/dist/analyzers/documentationAnalyzer.js.map +1 -1
- package/dist/analyzers/orm/adapterRegistry.d.ts +41 -0
- package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -0
- package/dist/analyzers/orm/adapterRegistry.js +73 -0
- package/dist/analyzers/orm/adapterRegistry.js.map +1 -0
- package/dist/analyzers/orm/drizzleAdapter.d.ts +42 -0
- package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -0
- package/dist/analyzers/orm/drizzleAdapter.js +166 -0
- package/dist/analyzers/orm/drizzleAdapter.js.map +1 -0
- package/dist/analyzers/orm/index.d.ts +14 -0
- package/dist/analyzers/orm/index.d.ts.map +1 -0
- package/dist/analyzers/orm/index.js +24 -0
- package/dist/analyzers/orm/index.js.map +1 -0
- package/dist/analyzers/orm/prismaAdapter.d.ts +45 -0
- package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -0
- package/dist/analyzers/orm/prismaAdapter.js +170 -0
- package/dist/analyzers/orm/prismaAdapter.js.map +1 -0
- package/dist/analyzers/orm/types.d.ts +63 -0
- package/dist/analyzers/orm/types.d.ts.map +1 -0
- package/dist/analyzers/orm/types.js +10 -0
- package/dist/analyzers/orm/types.js.map +1 -0
- package/dist/analyzers/provenance.d.ts +133 -0
- package/dist/analyzers/provenance.d.ts.map +1 -0
- package/dist/analyzers/provenance.js +1041 -0
- package/dist/analyzers/provenance.js.map +1 -0
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +117 -1
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/ruleRegistry.d.ts +38 -0
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -0
- package/dist/analyzers/ruleRegistry.js +123 -0
- package/dist/analyzers/ruleRegistry.js.map +1 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +58 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +445 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +52 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +108 -26
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +64 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +259 -53
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +5 -15
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +10 -10
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +25 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +250 -59
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +103 -0
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +750 -0
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +499 -4
- package/dist/auditRunner.js.map +1 -1
- package/dist/baseline.d.ts +98 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +184 -0
- package/dist/baseline.js.map +1 -0
- package/dist/churn/churnExtractor.d.ts +32 -0
- package/dist/churn/churnExtractor.d.ts.map +1 -0
- package/dist/churn/churnExtractor.js +264 -0
- package/dist/churn/churnExtractor.js.map +1 -0
- package/dist/cli.js +1218 -11
- package/dist/cli.js.map +1 -1
- package/dist/codeIndexDB-enhanced.js +1 -1
- package/dist/codeIndexDB-enhanced.js.map +1 -1
- package/dist/codeIndexDB.d.ts +101 -0
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +665 -5
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +104 -7
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +72 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +146 -15
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/pathProfiles.d.ts +38 -0
- package/dist/config/pathProfiles.d.ts.map +1 -0
- package/dist/config/pathProfiles.js +47 -0
- package/dist/config/pathProfiles.js.map +1 -0
- package/dist/conventions/conventionMiner.d.ts +63 -0
- package/dist/conventions/conventionMiner.d.ts.map +1 -0
- package/dist/conventions/conventionMiner.js +696 -0
- package/dist/conventions/conventionMiner.js.map +1 -0
- package/dist/coverage/coverageService.d.ts +49 -0
- package/dist/coverage/coverageService.d.ts.map +1 -0
- package/dist/coverage/coverageService.js +117 -0
- package/dist/coverage/coverageService.js.map +1 -0
- package/dist/coverage/istanbulParser.d.ts +84 -0
- package/dist/coverage/istanbulParser.d.ts.map +1 -0
- package/dist/coverage/istanbulParser.js +120 -0
- package/dist/coverage/istanbulParser.js.map +1 -0
- package/dist/coverage/lcovParser.d.ts +40 -0
- package/dist/coverage/lcovParser.d.ts.map +1 -0
- package/dist/coverage/lcovParser.js +168 -0
- package/dist/coverage/lcovParser.js.map +1 -0
- package/dist/fingerprint.d.ts +17 -0
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +42 -0
- package/dist/fingerprint.js.map +1 -1
- package/dist/grammars/tree-sitter-css.wasm +0 -0
- package/dist/graph/blastRadius.d.ts +27 -0
- package/dist/graph/blastRadius.d.ts.map +1 -0
- package/dist/graph/blastRadius.js +150 -0
- package/dist/graph/blastRadius.js.map +1 -0
- package/dist/graph/callGraph.d.ts +78 -0
- package/dist/graph/callGraph.d.ts.map +1 -0
- package/dist/graph/callGraph.js +484 -0
- package/dist/graph/callGraph.js.map +1 -0
- package/dist/graph/importGraph.d.ts +91 -0
- package/dist/graph/importGraph.d.ts.map +1 -0
- package/dist/graph/importGraph.js +602 -0
- package/dist/graph/importGraph.js.map +1 -0
- package/dist/graph/outputFormatter.d.ts +55 -0
- package/dist/graph/outputFormatter.d.ts.map +1 -0
- package/dist/graph/outputFormatter.js +283 -0
- package/dist/graph/outputFormatter.js.map +1 -0
- package/dist/hooks/codex.d.ts +36 -1
- package/dist/hooks/codex.d.ts.map +1 -1
- package/dist/hooks/codex.js +88 -54
- package/dist/hooks/codex.js.map +1 -1
- package/dist/hotspots/hotspotScorer.d.ts +20 -0
- package/dist/hotspots/hotspotScorer.d.ts.map +1 -0
- package/dist/hotspots/hotspotScorer.js +202 -0
- package/dist/hotspots/hotspotScorer.js.map +1 -0
- package/dist/invariants/invariant-rules.schema.json +42 -1
- package/dist/invariants/ruleEngine.d.ts +4 -1
- package/dist/invariants/ruleEngine.d.ts.map +1 -1
- package/dist/invariants/ruleEngine.js +141 -5
- package/dist/invariants/ruleEngine.js.map +1 -1
- package/dist/invariants/ruleValidator.d.ts.map +1 -1
- package/dist/invariants/ruleValidator.js +62 -1
- package/dist/invariants/ruleValidator.js.map +1 -1
- package/dist/invariants/types.d.ts +23 -2
- package/dist/invariants/types.d.ts.map +1 -1
- package/dist/languages/UniversalAnalyzer.d.ts +1 -1
- package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
- package/dist/languages/UniversalAnalyzer.js +61 -4
- package/dist/languages/UniversalAnalyzer.js.map +1 -1
- package/dist/languages/index.d.ts +1 -0
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +3 -0
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +59 -0
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -0
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +236 -0
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -0
- package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
- package/dist/languages/tree-sitter/parser.js +2 -0
- package/dist/languages/tree-sitter/parser.js.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +61 -10
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/ledger.d.ts +128 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +345 -0
- package/dist/ledger.js.map +1 -0
- package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
- package/dist/mcp-tools/projectTasks.js +9 -14
- package/dist/mcp-tools/projectTasks.js.map +1 -1
- package/dist/mcp.js +0 -0
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +3 -0
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
- package/dist/reporting/csvReportGenerator.js +7 -1
- package/dist/reporting/csvReportGenerator.js.map +1 -1
- package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
- package/dist/reporting/htmlReportGenerator.js +5 -1
- package/dist/reporting/htmlReportGenerator.js.map +1 -1
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.js +10 -2
- package/dist/reporting/jsonReportGenerator.js.map +1 -1
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
- package/dist/reporting/sarifReportGenerator.js +17 -17
- package/dist/reporting/sarifReportGenerator.js.map +1 -1
- package/dist/scripts/runBench.d.ts +94 -0
- package/dist/scripts/runBench.d.ts.map +1 -0
- package/dist/scripts/runBench.js +1559 -0
- package/dist/scripts/runBench.js.map +1 -0
- package/dist/search/QueryParser.d.ts.map +1 -1
- package/dist/search/QueryParser.js +51 -4
- package/dist/search/QueryParser.js.map +1 -1
- package/dist/services/CodeMapGenerator.d.ts +33 -0
- package/dist/services/CodeMapGenerator.d.ts.map +1 -1
- package/dist/services/CodeMapGenerator.js +404 -0
- package/dist/services/CodeMapGenerator.js.map +1 -1
- package/dist/styles/normalizer.d.ts +37 -0
- package/dist/styles/normalizer.d.ts.map +1 -0
- package/dist/styles/normalizer.js +301 -0
- package/dist/styles/normalizer.js.map +1 -0
- package/dist/styles/styleExtractor.d.ts +38 -0
- package/dist/styles/styleExtractor.d.ts.map +1 -0
- package/dist/styles/styleExtractor.js +630 -0
- package/dist/styles/styleExtractor.js.map +1 -0
- package/dist/styles/styleIndexer.d.ts +35 -0
- package/dist/styles/styleIndexer.d.ts.map +1 -0
- package/dist/styles/styleIndexer.js +266 -0
- package/dist/styles/styleIndexer.js.map +1 -0
- package/dist/styles/tailwindConfigLoader.d.ts +38 -0
- package/dist/styles/tailwindConfigLoader.d.ts.map +1 -0
- package/dist/styles/tailwindConfigLoader.js +374 -0
- package/dist/styles/tailwindConfigLoader.js.map +1 -0
- package/dist/styles/tailwindExpander.d.ts +38 -0
- package/dist/styles/tailwindExpander.d.ts.map +1 -0
- package/dist/styles/tailwindExpander.js +637 -0
- package/dist/styles/tailwindExpander.js.map +1 -0
- package/dist/styles/types.d.ts +92 -0
- package/dist/styles/types.d.ts.map +1 -0
- package/dist/styles/types.js +10 -0
- package/dist/styles/types.js.map +1 -0
- package/dist/symbols.d.ts +21 -0
- package/dist/symbols.d.ts.map +1 -0
- package/dist/symbols.js +31 -0
- package/dist/symbols.js.map +1 -0
- package/dist/types.d.ts +326 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/fileDiscovery.d.ts +1 -0
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +8 -2
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/package.json +9 -5
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/scripts/hook-audit.sh +5 -1
- package/plugin/skills/code-auditor/SKILL.md +51 -0
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +0 -21
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +0 -21
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +0 -12
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +0 -22
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +0 -9
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +0 -16
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +0 -14
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +0 -22
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +0 -20
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +0 -28
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +0 -31
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +0 -61
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +0 -15
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +0 -49
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +0 -19
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +0 -37
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +0 -73
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +0 -12
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +0 -82
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +0 -15
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +0 -1
- package/dist/analyzers/dataAccessAnalyzer.d.ts +0 -46
- package/dist/analyzers/dataAccessAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/dataAccessAnalyzer.js +0 -474
- package/dist/analyzers/dataAccessAnalyzer.js.map +0 -1
- package/dist/analyzers/dryAnalyzer.d.ts +0 -31
- package/dist/analyzers/dryAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/dryAnalyzer.js +0 -734
- package/dist/analyzers/dryAnalyzer.js.map +0 -1
- package/dist/analyzers/schemaAnalyzer.d.ts +0 -23
- package/dist/analyzers/schemaAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/schemaAnalyzer.js +0 -564
- package/dist/analyzers/schemaAnalyzer.js.map +0 -1
- package/dist/analyzers/solidAnalyzer.d.ts +0 -33
- package/dist/analyzers/solidAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/solidAnalyzer.js +0 -847
- package/dist/analyzers/solidAnalyzer.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twenty-methods-vs-complex.js","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spec-17 R8 Fixture 11: unique-method-74-lines
|
|
3
|
-
* Report section: R3.1 — Self-reference fix
|
|
4
|
-
*
|
|
5
|
-
* A single 74-line unique method should produce ZERO duplicate findings.
|
|
6
|
-
* The self-reference fix (span-overlap check, R3.1) ensures a block
|
|
7
|
-
* never cites itself as the "first occurrence."
|
|
8
|
-
*/
|
|
9
|
-
export declare class ReportGenerator {
|
|
10
|
-
generateReport(title: string, data: number[]): string;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=unique-method-74-lines.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unique-method-74-lines.d.ts","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,eAAe;IACnB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAoE3D;CACF"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spec-17 R8 Fixture 11: unique-method-74-lines
|
|
3
|
-
* Report section: R3.1 — Self-reference fix
|
|
4
|
-
*
|
|
5
|
-
* A single 74-line unique method should produce ZERO duplicate findings.
|
|
6
|
-
* The self-reference fix (span-overlap check, R3.1) ensures a block
|
|
7
|
-
* never cites itself as the "first occurrence."
|
|
8
|
-
*/
|
|
9
|
-
export class ReportGenerator {
|
|
10
|
-
generateReport(title, data) {
|
|
11
|
-
// Line 1 of method body
|
|
12
|
-
const header = `=== ${title} ===`;
|
|
13
|
-
// Line 2
|
|
14
|
-
const separator = "=".repeat(header.length);
|
|
15
|
-
// Line 3
|
|
16
|
-
let total = 0;
|
|
17
|
-
// Line 4
|
|
18
|
-
let min = Number.MAX_VALUE;
|
|
19
|
-
// Line 5
|
|
20
|
-
let max = Number.MIN_VALUE;
|
|
21
|
-
// Line 6
|
|
22
|
-
const processed = [];
|
|
23
|
-
// Line 7
|
|
24
|
-
for (const value of data) {
|
|
25
|
-
// Line 8
|
|
26
|
-
if (value > 0) {
|
|
27
|
-
// Line 9
|
|
28
|
-
processed.push(value);
|
|
29
|
-
// Line 10
|
|
30
|
-
total += value;
|
|
31
|
-
// Line 11
|
|
32
|
-
if (value < min)
|
|
33
|
-
min = value;
|
|
34
|
-
// Line 12
|
|
35
|
-
if (value > max)
|
|
36
|
-
max = value;
|
|
37
|
-
// Line 13
|
|
38
|
-
}
|
|
39
|
-
// Line 14
|
|
40
|
-
}
|
|
41
|
-
// Line 15
|
|
42
|
-
const average = processed.length > 0 ? total / processed.length : 0;
|
|
43
|
-
// Line 16
|
|
44
|
-
const lines = [];
|
|
45
|
-
// Line 17
|
|
46
|
-
lines.push(header);
|
|
47
|
-
// Line 18
|
|
48
|
-
lines.push(separator);
|
|
49
|
-
// Line 19
|
|
50
|
-
lines.push(`Count: ${processed.length}`);
|
|
51
|
-
// Line 20
|
|
52
|
-
lines.push(`Total: ${total}`);
|
|
53
|
-
// Line 21
|
|
54
|
-
lines.push(`Average: ${average.toFixed(2)}`);
|
|
55
|
-
// Line 22
|
|
56
|
-
lines.push(`Min: ${min}`);
|
|
57
|
-
// Line 23
|
|
58
|
-
lines.push(`Max: ${max}`);
|
|
59
|
-
// Line 24
|
|
60
|
-
lines.push(`Range: ${max - min}`);
|
|
61
|
-
// Line 25
|
|
62
|
-
if (processed.length > 0) {
|
|
63
|
-
// Line 26
|
|
64
|
-
lines.push("---");
|
|
65
|
-
// Line 27
|
|
66
|
-
lines.push("Details:");
|
|
67
|
-
// Line 28
|
|
68
|
-
for (let i = 0; i < processed.length; i++) {
|
|
69
|
-
// Line 29
|
|
70
|
-
lines.push(` ${i + 1}. ${processed[i]}`);
|
|
71
|
-
// Line 30
|
|
72
|
-
}
|
|
73
|
-
// Line 31
|
|
74
|
-
}
|
|
75
|
-
// Line 32
|
|
76
|
-
lines.push(separator);
|
|
77
|
-
// Line 33
|
|
78
|
-
return lines.join("\n");
|
|
79
|
-
// Line 34
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=unique-method-74-lines.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unique-method-74-lines.js","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,eAAe;IACnB,cAAc,CAAC,KAAa,EAAE,IAAc;QACjD,wBAAwB;QACxB,MAAM,MAAM,GAAG,OAAO,KAAK,MAAM,CAAC;QAClC,SAAS;QACT,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,SAAS;QACT,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,SAAS;QACT,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3B,SAAS;QACT,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3B,SAAS;QACT,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,SAAS;QACT,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,SAAS;YACT,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,SAAS;gBACT,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtB,UAAU;gBACV,KAAK,IAAI,KAAK,CAAC;gBACf,UAAU;gBACV,IAAI,KAAK,GAAG,GAAG;oBAAE,GAAG,GAAG,KAAK,CAAC;gBAC7B,UAAU;gBACV,IAAI,KAAK,GAAG,GAAG;oBAAE,GAAG,GAAG,KAAK,CAAC;gBAC7B,UAAU;YACZ,CAAC;YACD,UAAU;QACZ,CAAC;QACD,UAAU;QACV,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,UAAU;QACV,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAC9B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7C,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC1B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC1B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;QAClC,UAAU;QACV,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,UAAU;YACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,UAAU;YACV,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvB,UAAU;YACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,UAAU;gBACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1C,UAAU;YACZ,CAAC;YACD,UAAU;QACZ,CAAC;QACD,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,UAAU;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,UAAU;IACZ,CAAC;CACF"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spec-17 R8 Fixture 7: word-the-in-comment
|
|
3
|
-
* Report section: R2.1 — SQL-context-only extraction
|
|
4
|
-
*
|
|
5
|
-
* The word "the" appearing in a comment or string literal should produce
|
|
6
|
-
* ZERO schema findings. This was a ~4,500-count false positive in the
|
|
7
|
-
* diagnostic: the old regex matched "the" in comments as a table ref.
|
|
8
|
-
*/
|
|
9
|
-
export declare function tellTheStory(): string;
|
|
10
|
-
//# sourceMappingURL=word-the-in-comment.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"word-the-in-comment.d.ts","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,wBAAgB,YAAY,IAAI,MAAM,CAGrC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spec-17 R8 Fixture 7: word-the-in-comment
|
|
3
|
-
* Report section: R2.1 — SQL-context-only extraction
|
|
4
|
-
*
|
|
5
|
-
* The word "the" appearing in a comment or string literal should produce
|
|
6
|
-
* ZERO schema findings. This was a ~4,500-count false positive in the
|
|
7
|
-
* diagnostic: the old regex matched "the" in comments as a table ref.
|
|
8
|
-
*/
|
|
9
|
-
// The quick brown fox jumps over the lazy dog
|
|
10
|
-
// The answer to life, the universe, and everything
|
|
11
|
-
export function tellTheStory() {
|
|
12
|
-
const message = "the hero returns from the journey";
|
|
13
|
-
return message;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=word-the-in-comment.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"word-the-in-comment.js","sourceRoot":"","sources":["../../../../../src/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8CAA8C;AAC9C,mDAAmD;AAEnD,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,mCAAmC,CAAC;IACpD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Data Access Analyzer (Functional)
|
|
3
|
-
* Analyzes database access patterns and data layer interactions
|
|
4
|
-
*
|
|
5
|
-
* Detects database usage, query patterns, performance risks,
|
|
6
|
-
* and security concerns in data access code
|
|
7
|
-
*/
|
|
8
|
-
import { AnalyzerDefinition } from '../types.js';
|
|
9
|
-
/**
|
|
10
|
-
* Configuration for Data Access analyzer
|
|
11
|
-
*/
|
|
12
|
-
export interface DataAccessAnalyzerConfig {
|
|
13
|
-
databases?: {
|
|
14
|
-
[key: string]: {
|
|
15
|
-
name: string;
|
|
16
|
-
importPatterns: string[];
|
|
17
|
-
queryPatterns: string[];
|
|
18
|
-
ormPatterns?: string[];
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
organizationPatterns?: string[];
|
|
22
|
-
tablePatterns?: {
|
|
23
|
-
orm?: RegExp[];
|
|
24
|
-
sql?: RegExp[];
|
|
25
|
-
queryBuilder?: RegExp[];
|
|
26
|
-
};
|
|
27
|
-
performanceThresholds?: {
|
|
28
|
-
complexQueryCount?: number;
|
|
29
|
-
unfilteredQueryCount?: number;
|
|
30
|
-
joinedTableCount?: number;
|
|
31
|
-
};
|
|
32
|
-
securityPatterns?: {
|
|
33
|
-
sqlInjectionRisks?: string[];
|
|
34
|
-
parameterizedQueries?: string[];
|
|
35
|
-
};
|
|
36
|
-
sourcePatterns?: {
|
|
37
|
-
api?: string[];
|
|
38
|
-
page?: string[];
|
|
39
|
-
service?: string[];
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Data Access Analyzer definition
|
|
44
|
-
*/
|
|
45
|
-
export declare const dataAccessAnalyzer: AnalyzerDefinition;
|
|
46
|
-
//# sourceMappingURL=dataAccessAnalyzer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dataAccessAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/dataAccessAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AA0BrB;;GAEG;AACH,MAAM,WAAW,wBAAwB;IAEvC,SAAS,CAAC,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC;YACb,cAAc,EAAE,MAAM,EAAE,CAAC;YACzB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;SACxB,CAAC;KACH,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAGhC,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,qBAAqB,CAAC,EAAE;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAGF,gBAAgB,CAAC,EAAE;QACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;IAGF,cAAc,CAAC,EAAE;QACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AA6hBD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,kBA8BhC,CAAC"}
|
|
@@ -1,474 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Data Access Analyzer (Functional)
|
|
3
|
-
* Analyzes database access patterns and data layer interactions
|
|
4
|
-
*
|
|
5
|
-
* Detects database usage, query patterns, performance risks,
|
|
6
|
-
* and security concerns in data access code
|
|
7
|
-
*/
|
|
8
|
-
import { processFiles, createViolation } from './analyzerUtils.js';
|
|
9
|
-
import { getImports, findNodesByKind, getLineAndColumn } from '../utils/astUtils.js';
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Helpers
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
/** Get raw text from a tree-sitter node stored on ASTNode.raw. */
|
|
14
|
-
function rawText(node) {
|
|
15
|
-
return node.raw?.text ?? '';
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Default configuration
|
|
19
|
-
*/
|
|
20
|
-
const DEFAULT_CONFIG = {
|
|
21
|
-
databases: {
|
|
22
|
-
'primary': {
|
|
23
|
-
name: 'Primary Database',
|
|
24
|
-
importPatterns: ['/database/', '/db/', 'drizzle', 'prisma', 'typeorm'],
|
|
25
|
-
queryPatterns: ['select', 'insert', 'update', 'delete', 'query'],
|
|
26
|
-
ormPatterns: ['from', 'where', 'join', 'orderBy', 'groupBy']
|
|
27
|
-
},
|
|
28
|
-
'secondary': {
|
|
29
|
-
name: 'Secondary Database',
|
|
30
|
-
importPatterns: ['/analytics/', '/reporting/'],
|
|
31
|
-
queryPatterns: ['query', 'execute', 'run'],
|
|
32
|
-
ormPatterns: []
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
organizationPatterns: [
|
|
36
|
-
'organizationId',
|
|
37
|
-
'organization_id',
|
|
38
|
-
'orgId',
|
|
39
|
-
'org_id',
|
|
40
|
-
'tenantId',
|
|
41
|
-
'tenant_id',
|
|
42
|
-
'companyId',
|
|
43
|
-
'company_id',
|
|
44
|
-
'filterByOrganization',
|
|
45
|
-
'whereOrganization',
|
|
46
|
-
'scopeToOrg'
|
|
47
|
-
],
|
|
48
|
-
tablePatterns: {
|
|
49
|
-
orm: [
|
|
50
|
-
/\.from\(['"`]?(\w+)['"`]?\)/g,
|
|
51
|
-
/\.table\(['"`]?(\w+)['"`]?\)/g,
|
|
52
|
-
/\.into\(['"`]?(\w+)['"`]?\)/g,
|
|
53
|
-
/\.update\(['"`]?(\w+)['"`]?\)/g
|
|
54
|
-
],
|
|
55
|
-
sql: [
|
|
56
|
-
/(?:FROM|JOIN|INTO|UPDATE)\s+['"`]?(\w+)['"`]?/gi,
|
|
57
|
-
/(?:INSERT\s+INTO)\s+['"`]?(\w+)['"`]?/gi,
|
|
58
|
-
/(?:DELETE\s+FROM)\s+['"`]?(\w+)['"`]?/gi
|
|
59
|
-
],
|
|
60
|
-
queryBuilder: [
|
|
61
|
-
/table:\s*['"`](\w+)['"`]/g,
|
|
62
|
-
/from:\s*['"`](\w+)['"`]/g
|
|
63
|
-
]
|
|
64
|
-
},
|
|
65
|
-
performanceThresholds: {
|
|
66
|
-
complexQueryCount: 3,
|
|
67
|
-
unfilteredQueryCount: 5,
|
|
68
|
-
joinedTableCount: 2
|
|
69
|
-
},
|
|
70
|
-
securityPatterns: {
|
|
71
|
-
sqlInjectionRisks: [
|
|
72
|
-
'concatenation',
|
|
73
|
-
'${',
|
|
74
|
-
'string interpolation',
|
|
75
|
-
'+ variable',
|
|
76
|
-
'raw(',
|
|
77
|
-
'unsafeRaw'
|
|
78
|
-
],
|
|
79
|
-
parameterizedQueries: [
|
|
80
|
-
'prepared',
|
|
81
|
-
'parameterized',
|
|
82
|
-
'bind',
|
|
83
|
-
'?',
|
|
84
|
-
'$1',
|
|
85
|
-
':param'
|
|
86
|
-
]
|
|
87
|
-
},
|
|
88
|
-
sourcePatterns: {
|
|
89
|
-
api: ['/api/', '/routes/', '/endpoints/'],
|
|
90
|
-
page: ['/pages/', '/app/', '/views/'],
|
|
91
|
-
service: ['/services/', '/lib/', '/utils/']
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
// ---------------------------------------------------------------------------
|
|
95
|
-
// Main analysis
|
|
96
|
-
// ---------------------------------------------------------------------------
|
|
97
|
-
/**
|
|
98
|
-
* Analyze a single file for data access patterns.
|
|
99
|
-
* Now accepts a pre-parsed AST (from processFiles) instead of parsing internally.
|
|
100
|
-
*/
|
|
101
|
-
async function analyzeFile(filePath, ast, config, sourceCode) {
|
|
102
|
-
const imports = getImports(ast.root);
|
|
103
|
-
const patterns = [];
|
|
104
|
-
const violations = [];
|
|
105
|
-
// Extract database calls
|
|
106
|
-
const dbCalls = extractDatabaseCalls(ast.root, imports, filePath, config, sourceCode);
|
|
107
|
-
// Group calls by database type
|
|
108
|
-
const callsByDb = new Map();
|
|
109
|
-
dbCalls.forEach(call => {
|
|
110
|
-
if (!callsByDb.has(call.type)) {
|
|
111
|
-
callsByDb.set(call.type, []);
|
|
112
|
-
}
|
|
113
|
-
callsByDb.get(call.type).push(call);
|
|
114
|
-
});
|
|
115
|
-
// Create patterns for each database type used
|
|
116
|
-
callsByDb.forEach((calls, dbType) => {
|
|
117
|
-
const allTables = new Set();
|
|
118
|
-
const queries = [];
|
|
119
|
-
let hasOrgFilter = false;
|
|
120
|
-
let hasSqlInjectionRisk = false;
|
|
121
|
-
calls.forEach(call => {
|
|
122
|
-
call.tables.forEach(table => allTables.add(table));
|
|
123
|
-
hasOrgFilter = hasOrgFilter || call.hasOrganizationFilter;
|
|
124
|
-
hasSqlInjectionRisk = hasSqlInjectionRisk || call.hasSqlInjectionRisk;
|
|
125
|
-
// Create query info with enhanced analysis
|
|
126
|
-
const queryInfo = extractQueryInfo(call, config);
|
|
127
|
-
queries.push(queryInfo);
|
|
128
|
-
});
|
|
129
|
-
const pattern = {
|
|
130
|
-
source: detectSourceType(filePath, config),
|
|
131
|
-
filePath,
|
|
132
|
-
database: dbType,
|
|
133
|
-
tables: Array.from(allTables),
|
|
134
|
-
queries,
|
|
135
|
-
hasOrganizationFilter: hasOrgFilter,
|
|
136
|
-
performanceRisk: assessPerformanceRisk(queries, config),
|
|
137
|
-
hasSqlInjectionRisk
|
|
138
|
-
};
|
|
139
|
-
patterns.push(pattern);
|
|
140
|
-
// Check for violations
|
|
141
|
-
violations.push(...checkDataAccessViolations(pattern));
|
|
142
|
-
});
|
|
143
|
-
return { patterns, violations };
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Detect source type based on file path
|
|
147
|
-
*/
|
|
148
|
-
function detectSourceType(filePath, config) {
|
|
149
|
-
if (config.sourcePatterns.api.some(pattern => filePath.includes(pattern))) {
|
|
150
|
-
return 'api';
|
|
151
|
-
}
|
|
152
|
-
else if (config.sourcePatterns.page.some(pattern => filePath.includes(pattern))) {
|
|
153
|
-
return 'component';
|
|
154
|
-
}
|
|
155
|
-
else if (config.sourcePatterns.service.some(pattern => filePath.includes(pattern))) {
|
|
156
|
-
return 'service';
|
|
157
|
-
}
|
|
158
|
-
return 'service';
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Extract database calls from the AST.
|
|
162
|
-
* Uses tree-sitter call_expression nodes instead of TS API.
|
|
163
|
-
*/
|
|
164
|
-
function extractDatabaseCalls(ast, imports, filePath, config, sourceCode) {
|
|
165
|
-
const calls = [];
|
|
166
|
-
// Map imports to database types
|
|
167
|
-
const dbImports = mapDatabaseImports(imports, config);
|
|
168
|
-
// Find all call expressions using tree-sitter node type
|
|
169
|
-
const callExpressions = findNodesByKind(ast, 'call_expression');
|
|
170
|
-
callExpressions.forEach(callExpr => {
|
|
171
|
-
const callText = rawText(callExpr);
|
|
172
|
-
const { line, column } = getLineAndColumn(callExpr);
|
|
173
|
-
// Check each configured database
|
|
174
|
-
Object.entries(dbImports).forEach(([dbType, importInfo]) => {
|
|
175
|
-
if (importInfo.hasImports && isDatabaseCall(callText, importInfo)) {
|
|
176
|
-
const tables = extractTablesFromCall(callText, config);
|
|
177
|
-
const hasOrgFilter = checkOrganizationFilter(callText, config);
|
|
178
|
-
const securityCheck = checkQuerySecurity(callText, config);
|
|
179
|
-
calls.push({
|
|
180
|
-
type: dbType,
|
|
181
|
-
method: extractMethodName(callExpr),
|
|
182
|
-
file: filePath,
|
|
183
|
-
line,
|
|
184
|
-
column,
|
|
185
|
-
tables,
|
|
186
|
-
hasOrganizationFilter: hasOrgFilter,
|
|
187
|
-
hasParameterizedQuery: securityCheck.parameterized,
|
|
188
|
-
hasSqlInjectionRisk: securityCheck.injectionRisk
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
return calls;
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Map imports to database types
|
|
197
|
-
*/
|
|
198
|
-
function mapDatabaseImports(imports, config) {
|
|
199
|
-
const result = {};
|
|
200
|
-
Object.entries(config.databases).forEach(([key, dbConfig]) => {
|
|
201
|
-
const importNames = [];
|
|
202
|
-
let hasImports = false;
|
|
203
|
-
imports.forEach(imp => {
|
|
204
|
-
if (dbConfig.importPatterns.some((pattern) => imp.moduleSpecifier.includes(pattern))) {
|
|
205
|
-
hasImports = true;
|
|
206
|
-
importNames.push(...imp.importedNames);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
result[key] = {
|
|
210
|
-
hasImports,
|
|
211
|
-
importNames,
|
|
212
|
-
patterns: [...dbConfig.queryPatterns, ...importNames]
|
|
213
|
-
};
|
|
214
|
-
});
|
|
215
|
-
return result;
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Check if a call is a database call
|
|
219
|
-
*/
|
|
220
|
-
function isDatabaseCall(callText, importInfo) {
|
|
221
|
-
if (!importInfo.hasImports)
|
|
222
|
-
return false;
|
|
223
|
-
return importInfo.patterns.some(pattern => callText.includes(pattern));
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Extract method name from a tree-sitter call_expression node.
|
|
227
|
-
*
|
|
228
|
-
* call_expression node structure:
|
|
229
|
-
* children[0] = identifier (e.g., "query()")
|
|
230
|
-
* OR
|
|
231
|
-
* children[0] = member_expression (e.g., "db.query()")
|
|
232
|
-
* children[0] = identifier (e.g., "db")
|
|
233
|
-
* children[1] = "."
|
|
234
|
-
* children[2] = property_identifier (e.g., "query")
|
|
235
|
-
*/
|
|
236
|
-
function extractMethodName(callExpr) {
|
|
237
|
-
const expression = callExpr.children?.[0];
|
|
238
|
-
if (!expression)
|
|
239
|
-
return 'unknown';
|
|
240
|
-
if (expression.type === 'member_expression') {
|
|
241
|
-
// e.g., db.query() — the property_identifier child holds the method name
|
|
242
|
-
const propId = expression.children?.find(c => c.type === 'property_identifier');
|
|
243
|
-
if (propId) {
|
|
244
|
-
return rawText(propId);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
else if (expression.type === 'identifier') {
|
|
248
|
-
// e.g., query()
|
|
249
|
-
return rawText(expression);
|
|
250
|
-
}
|
|
251
|
-
return 'unknown';
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Extract table names from call
|
|
255
|
-
*/
|
|
256
|
-
function extractTablesFromCall(callText, config) {
|
|
257
|
-
const tables = new Set();
|
|
258
|
-
// Try all table extraction patterns
|
|
259
|
-
Object.values(config.tablePatterns).forEach(patterns => {
|
|
260
|
-
patterns.forEach(pattern => {
|
|
261
|
-
const matches = Array.from(callText.matchAll(pattern));
|
|
262
|
-
matches.forEach(match => {
|
|
263
|
-
if (match[1]) {
|
|
264
|
-
tables.add(match[1].toLowerCase());
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
return Array.from(tables);
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Check for organization filtering
|
|
273
|
-
*/
|
|
274
|
-
function checkOrganizationFilter(callText, config) {
|
|
275
|
-
return config.organizationPatterns.some(pattern => callText.toLowerCase().includes(pattern.toLowerCase()));
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Check query security
|
|
279
|
-
*/
|
|
280
|
-
function checkQuerySecurity(callText, config) {
|
|
281
|
-
const hasParameterized = config.securityPatterns.parameterizedQueries.some(pattern => callText.includes(pattern));
|
|
282
|
-
const hasInjectionRisk = config.securityPatterns.sqlInjectionRisks.some(pattern => callText.includes(pattern));
|
|
283
|
-
return {
|
|
284
|
-
parameterized: hasParameterized,
|
|
285
|
-
injectionRisk: hasInjectionRisk && !hasParameterized
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Extract query info from database call
|
|
290
|
-
*/
|
|
291
|
-
function extractQueryInfo(call, config) {
|
|
292
|
-
return {
|
|
293
|
-
type: inferQueryType(call.method),
|
|
294
|
-
tables: call.tables,
|
|
295
|
-
line: call.line,
|
|
296
|
-
hasJoins: detectJoins(call.method),
|
|
297
|
-
hasOrganizationFilter: call.hasOrganizationFilter,
|
|
298
|
-
complexity: analyzeQueryComplexity(call, config)
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Infer query type from method name
|
|
303
|
-
*/
|
|
304
|
-
function inferQueryType(method) {
|
|
305
|
-
const methodLower = method.toLowerCase();
|
|
306
|
-
if (methodLower.includes('select') || methodLower.includes('find') || methodLower.includes('get')) {
|
|
307
|
-
return 'select';
|
|
308
|
-
}
|
|
309
|
-
else if (methodLower.includes('insert') || methodLower.includes('create')) {
|
|
310
|
-
return 'insert';
|
|
311
|
-
}
|
|
312
|
-
else if (methodLower.includes('update')) {
|
|
313
|
-
return 'update';
|
|
314
|
-
}
|
|
315
|
-
else if (methodLower.includes('delete') || methodLower.includes('remove')) {
|
|
316
|
-
return 'delete';
|
|
317
|
-
}
|
|
318
|
-
return 'other';
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Detect if a query has joins
|
|
322
|
-
*/
|
|
323
|
-
function detectJoins(method) {
|
|
324
|
-
const joinPatterns = [
|
|
325
|
-
'join',
|
|
326
|
-
'leftJoin',
|
|
327
|
-
'rightJoin',
|
|
328
|
-
'innerJoin',
|
|
329
|
-
'outerJoin',
|
|
330
|
-
'fullJoin'
|
|
331
|
-
];
|
|
332
|
-
return joinPatterns.some(pattern => method.toLowerCase().includes(pattern.toLowerCase()));
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Analyze query complexity
|
|
336
|
-
*/
|
|
337
|
-
function analyzeQueryComplexity(call, config) {
|
|
338
|
-
let complexityScore = 0;
|
|
339
|
-
// Table count factor
|
|
340
|
-
if (call.tables.length > config.performanceThresholds.joinedTableCount) {
|
|
341
|
-
complexityScore += 2;
|
|
342
|
-
}
|
|
343
|
-
else if (call.tables.length > 1) {
|
|
344
|
-
complexityScore += 1;
|
|
345
|
-
}
|
|
346
|
-
// Method complexity
|
|
347
|
-
if (detectJoins(call.method)) {
|
|
348
|
-
complexityScore += 2;
|
|
349
|
-
}
|
|
350
|
-
// Security risk adds complexity
|
|
351
|
-
if (call.hasSqlInjectionRisk) {
|
|
352
|
-
complexityScore += 3;
|
|
353
|
-
}
|
|
354
|
-
// Missing org filter in multi-tenant context
|
|
355
|
-
if (!call.hasOrganizationFilter && call.tables.length > 0) {
|
|
356
|
-
complexityScore += 1;
|
|
357
|
-
}
|
|
358
|
-
// Determine complexity level
|
|
359
|
-
if (complexityScore >= 5)
|
|
360
|
-
return 'complex';
|
|
361
|
-
if (complexityScore >= 2)
|
|
362
|
-
return 'moderate';
|
|
363
|
-
return 'simple';
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Assess performance risk based on queries
|
|
367
|
-
*/
|
|
368
|
-
function assessPerformanceRisk(queries, config) {
|
|
369
|
-
// Count complex queries
|
|
370
|
-
const complexQueries = queries.filter(q => q.hasJoins ||
|
|
371
|
-
q.tables.length > config.performanceThresholds.joinedTableCount ||
|
|
372
|
-
q.complexity === 'complex').length;
|
|
373
|
-
// Count queries without org filter
|
|
374
|
-
const unfiltered = queries.filter(q => !q.hasOrganizationFilter).length;
|
|
375
|
-
if (complexQueries > config.performanceThresholds.complexQueryCount ||
|
|
376
|
-
unfiltered > config.performanceThresholds.unfilteredQueryCount) {
|
|
377
|
-
return 'high';
|
|
378
|
-
}
|
|
379
|
-
else if (complexQueries > 1 || unfiltered > 2) {
|
|
380
|
-
return 'medium';
|
|
381
|
-
}
|
|
382
|
-
return 'low';
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Check for data access violations
|
|
386
|
-
*/
|
|
387
|
-
function checkDataAccessViolations(pattern) {
|
|
388
|
-
const violations = [];
|
|
389
|
-
// Check for missing organization filter in multi-tenant scenarios
|
|
390
|
-
if (!pattern.hasOrganizationFilter && pattern.tables.length > 0) {
|
|
391
|
-
violations.push(createViolation({
|
|
392
|
-
analyzer: 'data-access',
|
|
393
|
-
severity: 'warning',
|
|
394
|
-
type: 'data-access',
|
|
395
|
-
file: pattern.filePath,
|
|
396
|
-
line: 1,
|
|
397
|
-
column: 1,
|
|
398
|
-
message: 'Database queries may be missing tenant/organization filtering',
|
|
399
|
-
recommendation: 'Add appropriate filtering to ensure data isolation in multi-tenant environments',
|
|
400
|
-
estimatedEffort: 'small'
|
|
401
|
-
}));
|
|
402
|
-
}
|
|
403
|
-
// Check for SQL injection risks
|
|
404
|
-
if (pattern.hasSqlInjectionRisk) {
|
|
405
|
-
violations.push(createViolation({
|
|
406
|
-
analyzer: 'data-access',
|
|
407
|
-
severity: 'critical',
|
|
408
|
-
type: 'data-access',
|
|
409
|
-
file: pattern.filePath,
|
|
410
|
-
line: 1,
|
|
411
|
-
column: 1,
|
|
412
|
-
message: 'Potential SQL injection vulnerability detected',
|
|
413
|
-
recommendation: 'Use parameterized queries or prepared statements instead of string concatenation',
|
|
414
|
-
estimatedEffort: 'medium'
|
|
415
|
-
}));
|
|
416
|
-
}
|
|
417
|
-
// Check for performance risks
|
|
418
|
-
if (pattern.performanceRisk === 'high') {
|
|
419
|
-
violations.push(createViolation({
|
|
420
|
-
analyzer: 'data-access',
|
|
421
|
-
severity: 'warning',
|
|
422
|
-
type: 'data-access',
|
|
423
|
-
file: pattern.filePath,
|
|
424
|
-
line: 1,
|
|
425
|
-
column: 1,
|
|
426
|
-
message: 'High performance risk detected in data access patterns',
|
|
427
|
-
recommendation: 'Optimize queries, add indexes, implement caching, or paginate results',
|
|
428
|
-
estimatedEffort: 'medium'
|
|
429
|
-
}));
|
|
430
|
-
}
|
|
431
|
-
// Check for direct database access in presentation layer
|
|
432
|
-
if (pattern.source === 'component') {
|
|
433
|
-
violations.push(createViolation({
|
|
434
|
-
analyzer: 'data-access',
|
|
435
|
-
severity: 'suggestion',
|
|
436
|
-
type: 'data-access',
|
|
437
|
-
file: pattern.filePath,
|
|
438
|
-
line: 1,
|
|
439
|
-
column: 1,
|
|
440
|
-
message: 'Direct database access detected in presentation layer',
|
|
441
|
-
recommendation: 'Consider moving data access to service layer or API endpoints for better separation of concerns',
|
|
442
|
-
estimatedEffort: 'medium'
|
|
443
|
-
}));
|
|
444
|
-
}
|
|
445
|
-
return violations;
|
|
446
|
-
}
|
|
447
|
-
// ---------------------------------------------------------------------------
|
|
448
|
-
// Analyzer definition
|
|
449
|
-
// ---------------------------------------------------------------------------
|
|
450
|
-
/**
|
|
451
|
-
* Data Access Analyzer definition
|
|
452
|
-
*/
|
|
453
|
-
export const dataAccessAnalyzer = {
|
|
454
|
-
name: 'data-access',
|
|
455
|
-
defaultConfig: DEFAULT_CONFIG,
|
|
456
|
-
analyze: async (files, config, options, progressCallback) => {
|
|
457
|
-
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
458
|
-
// Custom processor to handle patterns collection
|
|
459
|
-
const patterns = [];
|
|
460
|
-
const allViolations = [];
|
|
461
|
-
const result = await processFiles(files, async (filePath, ast, procConfig, sourceCode) => {
|
|
462
|
-
const fileResult = await analyzeFile(filePath, ast, mergedConfig, sourceCode);
|
|
463
|
-
patterns.push(...fileResult.patterns);
|
|
464
|
-
allViolations.push(...fileResult.violations);
|
|
465
|
-
return fileResult.violations;
|
|
466
|
-
}, 'data-access', mergedConfig, progressCallback ?
|
|
467
|
-
(current, total, file) => progressCallback({ current, total, analyzer: 'data-access', file }) :
|
|
468
|
-
undefined);
|
|
469
|
-
// Override violations with our collected ones
|
|
470
|
-
result.violations = allViolations;
|
|
471
|
-
return result;
|
|
472
|
-
}
|
|
473
|
-
};
|
|
474
|
-
//# sourceMappingURL=dataAccessAnalyzer.js.map
|