code-auditor-mcp 5.0.2 → 5.2.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +184 -3
- package/README.md +24 -2
- package/configs/hhra-compat.json +12 -118
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +11 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +57 -52
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
- package/dist/analyzers/provenance.d.ts +9 -4
- package/dist/analyzers/provenance.d.ts.map +1 -1
- package/dist/analyzers/provenance.js +8 -25
- package/dist/analyzers/provenance.js.map +1 -1
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +0 -5
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/ruleRegistry.js +4 -4
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/ruleTiming.d.ts +1 -1
- package/dist/analyzers/ruleTiming.js +2 -2
- package/dist/analyzers/ruleTiming.js.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +22 -26
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +32 -15
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +189 -115
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +0 -2
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +0 -5
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +2 -10
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +7 -49
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/schema/config.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/config.js +0 -2
- package/dist/analyzers/universal/schema/config.js.map +1 -1
- package/dist/analyzers/universal/schema/types.d.ts +0 -2
- package/dist/analyzers/universal/schema/types.d.ts.map +1 -1
- package/dist/analyzers/vendorSurfaces.d.ts +126 -0
- package/dist/analyzers/vendorSurfaces.d.ts.map +1 -0
- package/dist/analyzers/vendorSurfaces.js +580 -0
- package/dist/analyzers/vendorSurfaces.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +136 -142
- package/dist/auditRunner.js.map +1 -1
- package/dist/churn/churnExtractor.d.ts +0 -1
- package/dist/churn/churnExtractor.d.ts.map +1 -1
- package/dist/churn/churnExtractor.js +2 -4
- package/dist/churn/churnExtractor.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +195 -26
- package/dist/cli.js.map +1 -1
- package/dist/codeIndex/migrations.d.ts.map +1 -1
- package/dist/codeIndex/migrations.js +4 -3
- package/dist/codeIndex/migrations.js.map +1 -1
- package/dist/codeIndexDB.d.ts +11 -2
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +27 -2
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/config/configLoader.d.ts +60 -7
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +252 -60
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +77 -18
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +105 -43
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/daemon/main.d.ts +0 -1
- package/dist/daemon/main.d.ts.map +1 -1
- package/dist/daemon/main.js +11 -4
- package/dist/daemon/main.js.map +1 -1
- package/dist/dataPaths.d.ts +17 -11
- package/dist/dataPaths.d.ts.map +1 -1
- package/dist/dataPaths.js +51 -16
- package/dist/dataPaths.js.map +1 -1
- package/dist/hookLog.d.ts +54 -0
- package/dist/hookLog.d.ts.map +1 -0
- package/dist/hookLog.js +105 -0
- package/dist/hookLog.js.map +1 -0
- package/dist/hookLogPath.generated.d.ts +3 -0
- package/dist/hookLogPath.generated.d.ts.map +1 -0
- package/dist/hookLogPath.generated.js +8 -0
- package/dist/hookLogPath.generated.js.map +1 -0
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +1 -1
- package/dist/installConfig.d.ts +15 -2
- package/dist/installConfig.d.ts.map +1 -1
- package/dist/installConfig.js +17 -2
- package/dist/installConfig.js.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +18 -3
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/mcp-tools/workflowGuide.js +8 -8
- package/dist/mcp-tools/workflowGuide.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +5 -2
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp-ui-simple.d.ts +5 -0
- package/dist/mcp-ui-simple.d.ts.map +1 -1
- package/dist/mcp-ui-simple.js +9 -2
- package/dist/mcp-ui-simple.js.map +1 -1
- package/dist/mcp.d.ts +0 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +36 -33
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts +10 -0
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +10 -1
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/mcpAutoIndex.d.ts.map +1 -1
- package/dist/mcpAutoIndex.js +2 -1
- package/dist/mcpAutoIndex.js.map +1 -1
- package/dist/phase/colorMath.d.ts +18 -5
- package/dist/phase/colorMath.d.ts.map +1 -1
- package/dist/phase/colorMath.js +88 -5
- package/dist/phase/colorMath.js.map +1 -1
- package/dist/phase/dataAccessCallsCandidates.js +1 -1
- package/dist/phase/dataAccessCallsCandidates.js.map +1 -1
- package/dist/phase/goFunctionAnalysis.d.ts +2 -2
- package/dist/phase/goFunctionAnalysis.js +2 -2
- package/dist/phase/goFunctions.d.ts +2 -2
- package/dist/phase/goFunctions.js +2 -2
- package/dist/phase/goImports.d.ts +2 -2
- package/dist/phase/goImports.js +2 -2
- package/dist/phase/goSwitches.d.ts +2 -2
- package/dist/phase/goSwitches.js +2 -2
- package/dist/phase/loopQueryCandidates.js +1 -1
- package/dist/phase/loopQueryCandidates.js.map +1 -1
- package/dist/phase/phaseModel.d.ts +37 -8
- package/dist/phase/phaseModel.d.ts.map +1 -1
- package/dist/phase/phaseModel.js +33 -8
- package/dist/phase/phaseModel.js.map +1 -1
- package/dist/phase/producers.d.ts.map +1 -1
- package/dist/phase/producers.js +24 -17
- package/dist/phase/producers.js.map +1 -1
- package/dist/phase/reachability.d.ts +44 -1
- package/dist/phase/reachability.d.ts.map +1 -1
- package/dist/phase/reachability.js +79 -0
- package/dist/phase/reachability.js.map +1 -1
- package/dist/phase/rules/crossDomain.d.ts.map +1 -1
- package/dist/phase/rules/crossDomain.js +16 -6
- package/dist/phase/rules/crossDomain.js.map +1 -1
- package/dist/phase/rules/dry.d.ts.map +1 -1
- package/dist/phase/rules/dry.js +0 -1
- package/dist/phase/rules/dry.js.map +1 -1
- package/dist/phase/rules/goRules.d.ts +2 -2
- package/dist/phase/rules/goRules.js +2 -2
- package/dist/phase/rules/secrets.d.ts +22 -8
- package/dist/phase/rules/secrets.d.ts.map +1 -1
- package/dist/phase/rules/secrets.js +48 -67
- package/dist/phase/rules/secrets.js.map +1 -1
- package/dist/phase/rules/styles.d.ts +23 -9
- package/dist/phase/rules/styles.d.ts.map +1 -1
- package/dist/phase/rules/styles.js +47 -15
- package/dist/phase/rules/styles.js.map +1 -1
- package/dist/phase/rules/unreferencedModule.d.ts.map +1 -1
- package/dist/phase/rules/unreferencedModule.js +16 -5
- package/dist/phase/rules/unreferencedModule.js.map +1 -1
- package/dist/phase/runner.d.ts +16 -7
- package/dist/phase/runner.d.ts.map +1 -1
- package/dist/phase/runner.js +32 -20
- package/dist/phase/runner.js.map +1 -1
- package/dist/phase/stylesCss.d.ts.map +1 -1
- package/dist/phase/stylesCss.js +4 -0
- package/dist/phase/stylesCss.js.map +1 -1
- package/dist/phase/stylesMarkup.d.ts.map +1 -1
- package/dist/phase/stylesMarkup.js +4 -0
- package/dist/phase/stylesMarkup.js.map +1 -1
- package/dist/phase/stylesSource.d.ts.map +1 -1
- package/dist/phase/stylesSource.js +6 -0
- package/dist/phase/stylesSource.js.map +1 -1
- package/dist/phase/testProgram.d.ts +57 -0
- package/dist/phase/testProgram.d.ts.map +1 -0
- package/dist/phase/testProgram.js +244 -0
- package/dist/phase/testProgram.js.map +1 -0
- package/dist/phase/typeDeclarations.d.ts +2 -2
- package/dist/phase/typeDeclarations.js +2 -2
- package/dist/phase/types.d.ts +46 -0
- package/dist/phase/types.d.ts.map +1 -1
- package/dist/pipelineAdapters.d.ts +1 -171
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +47 -1281
- package/dist/pipelineAdapters.js.map +1 -1
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
- package/dist/reporting/csvReportGenerator.js +0 -6
- package/dist/reporting/csvReportGenerator.js.map +1 -1
- package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
- package/dist/reporting/htmlReportGenerator.js +0 -4
- package/dist/reporting/htmlReportGenerator.js.map +1 -1
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.js +0 -1
- package/dist/reporting/jsonReportGenerator.js.map +1 -1
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
- package/dist/reporting/sarifReportGenerator.js +0 -7
- package/dist/reporting/sarifReportGenerator.js.map +1 -1
- package/dist/sqlite/driver.d.ts +17 -1
- package/dist/sqlite/driver.d.ts.map +1 -1
- package/dist/sqlite/driver.js +28 -5
- package/dist/sqlite/driver.js.map +1 -1
- package/dist/styles/cssInJsHarvest.d.ts +36 -0
- package/dist/styles/cssInJsHarvest.d.ts.map +1 -0
- package/dist/styles/cssInJsHarvest.js +78 -0
- package/dist/styles/cssInJsHarvest.js.map +1 -0
- package/dist/styles/definedClasses.d.ts +95 -0
- package/dist/styles/definedClasses.d.ts.map +1 -0
- package/dist/styles/definedClasses.js +129 -0
- package/dist/styles/definedClasses.js.map +1 -0
- package/dist/styles/markupStyleHarvest.d.ts +33 -0
- package/dist/styles/markupStyleHarvest.d.ts.map +1 -0
- package/dist/styles/markupStyleHarvest.js +73 -0
- package/dist/styles/markupStyleHarvest.js.map +1 -0
- package/dist/styles/styleExtractor.d.ts +37 -0
- package/dist/styles/styleExtractor.d.ts.map +1 -1
- package/dist/styles/styleExtractor.js +89 -33
- package/dist/styles/styleExtractor.js.map +1 -1
- package/dist/styles/styleIndexer.d.ts.map +1 -1
- package/dist/styles/styleIndexer.js +11 -10
- package/dist/styles/styleIndexer.js.map +1 -1
- package/dist/styles/tailwindExpander.d.ts.map +1 -1
- package/dist/styles/tailwindExpander.js +31 -10
- package/dist/styles/tailwindExpander.js.map +1 -1
- package/dist/telemetry.d.ts +67 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +100 -20
- package/dist/telemetry.js.map +1 -1
- package/dist/types/crossLanguage.d.ts +1 -0
- package/dist/types/crossLanguage.d.ts.map +1 -1
- package/dist/types.d.ts +23 -56
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -4
- package/dist/types.js.map +1 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +1 -1
- package/examples/.auditrc.example.json +7 -22
- package/examples/.auditrc.json +12 -155
- package/examples/.code-auditor.json +8 -51
- package/examples/nextjs.auditrc.json +7 -34
- package/examples/node-api.auditrc.json +6 -46
- package/examples/react.auditrc.json +8 -25
- package/examples/tolerant-solid.auditrc.json +12 -44
- package/package.json +6 -5
- package/plugin/.claude-plugin/manifest.json +10 -9
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/hooks.json +4 -4
- package/plugin/scripts/hook-audit.sh +9 -0
- package/plugin/scripts/hook-common.sh +8 -2
- package/plugin/scripts/hook-drift-check.sh +10 -1
- package/plugin/scripts/hook-log-path.sh +7 -0
- package/plugin/scripts/hook-self-audit.sh +9 -0
- package/plugin/scripts/hook-warm.sh +17 -11
- package/plugin/skills/code-auditor/SKILL.md +26 -3
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts +0 -6
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js +0 -12
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js.map +0 -1
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts +0 -7
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js +0 -13
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.d.ts +0 -14
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.js +0 -16
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.d.ts +0 -15
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.js +0 -17
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts +0 -14
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts +0 -18
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.d.ts +0 -19
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts +0 -17
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts +0 -25
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.js +0 -21
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.d.ts +0 -15
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.d.ts +0 -14
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.js +0 -14
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts +0 -15
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.js +0 -16
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.js.map +0 -1
- package/dist/languages/go/analyzer-darwin-amd64 +0 -0
- package/dist/languages/go/analyzer-darwin-arm64 +0 -0
- package/dist/languages/go/analyzer-linux-amd64 +0 -0
- package/dist/languages/go/analyzer-linux-arm64 +0 -0
- package/dist/languages/go/analyzer-src/analyzer.go +0 -643
- package/dist/languages/go/analyzer-src/dataaccess.go +0 -388
- package/dist/languages/go/analyzer-src/go.mod +0 -3
- package/dist/languages/go/analyzer-src/indexer.go +0 -268
- package/dist/languages/go/analyzer-src/parser.go +0 -461
- package/dist/languages/go/analyzer-src/solid.go +0 -311
- package/dist/languages/go/analyzer-src/testconventions.go +0 -25
- package/dist/languages/go/analyzer-src/types.go +0 -156
- package/dist/languages/go/analyzer-windows-amd64.exe +0 -0
- package/dist/languages/go/go.mod +0 -7
- package/dist/languages/go/main.go +0 -203
- package/dist/native/ast-grep-napi.darwin-arm64.node +0 -0
- package/dist/native/ast-grep-napi.darwin-x64.node +0 -0
- package/dist/native/ast-grep-napi.linux-arm64-gnu.node +0 -0
- package/dist/native/ast-grep-napi.linux-arm64-musl.node +0 -0
- package/dist/native/ast-grep-napi.linux-x64-gnu.node +0 -0
- package/dist/native/ast-grep-napi.linux-x64-musl.node +0 -0
- package/dist/native/ast-grep-napi.win32-x64-msvc.node +0 -0
- package/dist/native-bootstrap.d.ts +0 -15
- package/dist/native-bootstrap.d.ts.map +0 -1
- package/dist/native-bootstrap.js +0 -75
- package/dist/native-bootstrap.js.map +0 -1
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendor surface resolution — Item B (reissued).
|
|
3
|
+
*
|
|
4
|
+
* The data-access analyzer once hand-maintained five method-name lists
|
|
5
|
+
* (`EAGER_DB_METHODS`, `ORM_TABLE_VERBS`, `ORM_JOIN_VERBS`, `PRISMA_VERBS`, and
|
|
6
|
+
* `D1_CONVENIENCE`) plus the `COLLECTION_TRANSFORM_METHODS` runtime probe. A
|
|
7
|
+
* hand-copied vendor list drifts: the vendor adds, renames, or removes a method
|
|
8
|
+
* and the replica silently goes stale (the `.get()` gap, the deferred `.iterate()`,
|
|
9
|
+
* the missing lateral joins, the missing `…AndReturn` verbs). The reissued
|
|
10
|
+
* directive deletes the committed snapshot and resolves each vendor's declaration
|
|
11
|
+
* **from the tree under analysis, per run** — the `node_modules` (or workspace)
|
|
12
|
+
* path the tree's *own* imports resolve to, at the version that tree actually
|
|
13
|
+
* installs. Nothing about a vendor's API is committed here, and nothing is fetched
|
|
14
|
+
* from the network at analysis time.
|
|
15
|
+
*
|
|
16
|
+
* Three of the five vendor lists (`eagerMethods`, `ormTableVerbs`, `ormJoinVerbs`)
|
|
17
|
+
* are the union of the analyzer's irreducible cross-vendor grammar (the baseline,
|
|
18
|
+
* present regardless of what resolves) and the per-run probe — the methods only a
|
|
19
|
+
* specific vendor publishes. Two (`prismaVerbs`, `eagerExecutionMethods`) are
|
|
20
|
+
* resolved **entirely** from the tree, with no baseline. `COLLECTION_TRANSFORM_METHODS`
|
|
21
|
+
* is a runtime probe over `Array.prototype` and has no vendor declaration. When a
|
|
22
|
+
* vendor declaration cannot be resolved, the corresponding surface is `null` and
|
|
23
|
+
* its probe methods are absent (not a fallback list, not a stale snapshot); the
|
|
24
|
+
* resolution record carries the *reason* naming what could not be resolved, so a
|
|
25
|
+
* site whose classification depends on a probe-only method is `unproven`, never
|
|
26
|
+
* silent.
|
|
27
|
+
*/
|
|
28
|
+
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
29
|
+
import path from 'node:path';
|
|
30
|
+
import { parseFile, getNodeText } from '../languages/adapterBridge.js';
|
|
31
|
+
/** The every-surface-null surface set — used when there is no project root (the
|
|
32
|
+
* vertical slice tests, the raw extractor's direct-call API). */
|
|
33
|
+
export const EMPTY_VENDOR_SURFACES = {
|
|
34
|
+
kyselyQueryCreator: null,
|
|
35
|
+
kyselySelectQueryBuilder: null,
|
|
36
|
+
betterSqlite3Statement: null,
|
|
37
|
+
betterSqlite3Database: null,
|
|
38
|
+
nodeSqliteStatement: null,
|
|
39
|
+
nodeSqliteDatabase: null,
|
|
40
|
+
d1Database: null,
|
|
41
|
+
d1PreparedStatement: null,
|
|
42
|
+
pgPool: null,
|
|
43
|
+
mysql2Connection: null,
|
|
44
|
+
prismaVerbs: null,
|
|
45
|
+
resolutions: [],
|
|
46
|
+
};
|
|
47
|
+
// Package specifiers shared by VENDOR_TYPE_SPECS (what to probe) and SURFACE_FIELDS
|
|
48
|
+
// (the resolved field name per probe). Extracted so a rename lands in one place and
|
|
49
|
+
// the duplicate-string-literal rule stays quiet on the three driver package names.
|
|
50
|
+
const PKG_BETTER_SQLITE3_TYPES = '@types/better-sqlite3';
|
|
51
|
+
const PKG_NODE_TYPES = '@types/node';
|
|
52
|
+
const PKG_CLOUDFLARE_WORKERS_TYPES = '@cloudflare/workers-types';
|
|
53
|
+
// The Prisma probe's target type name, and the version fallback rendered when a
|
|
54
|
+
// package carries no resolvable version. Each repeats across every
|
|
55
|
+
// `resolvePrismaSurface` / `resolveType` return branch, so a single constant names it.
|
|
56
|
+
const PRISMA_DELEGATE_TYPE = '*Delegate';
|
|
57
|
+
const VERSION_UNKNOWN = 'version unknown';
|
|
58
|
+
const VENDOR_TYPE_SPECS = [
|
|
59
|
+
{ pkg: PKG_BETTER_SQLITE3_TYPES, entry: 'index.d.ts', types: ['Database', 'Statement'] },
|
|
60
|
+
{ pkg: PKG_NODE_TYPES, entry: 'sqlite.d.ts', types: ['DatabaseSync', 'StatementSync'] },
|
|
61
|
+
{ pkg: PKG_CLOUDFLARE_WORKERS_TYPES, entry: 'index.d.ts', types: ['D1Database', 'D1PreparedStatement'] },
|
|
62
|
+
{ pkg: 'kysely', entry: null, types: ['QueryCreator', 'SelectQueryBuilder'] },
|
|
63
|
+
// `@types/pg` and `mysql2` contribute only their single eager-execution member
|
|
64
|
+
// (`query` / `execute` respectively) — a Pool/Connection surface is a *client*
|
|
65
|
+
// surface (connect/end/on), not an eager-execution surface, so the whole
|
|
66
|
+
// declaration is not unioned the way the statement/database surfaces are.
|
|
67
|
+
{ pkg: '@types/pg', entry: null, types: ['Pool'] },
|
|
68
|
+
{ pkg: 'mysql2', entry: null, types: ['Connection'] },
|
|
69
|
+
];
|
|
70
|
+
/**
|
|
71
|
+
* Resolve a package's directory under `projectRoot`'s `node_modules`, walking up
|
|
72
|
+
* ancestor directories so a package hoisted to a workspace root still resolves.
|
|
73
|
+
* Returns the package root, or `null` when the package is not installed anywhere
|
|
74
|
+
* up the tree.
|
|
75
|
+
*/
|
|
76
|
+
function resolvePackageRoot(pkg, projectRoot) {
|
|
77
|
+
const segments = pkg.split('/');
|
|
78
|
+
let dir = path.resolve(projectRoot);
|
|
79
|
+
for (;;) {
|
|
80
|
+
const candidate = path.join(dir, 'node_modules', ...segments);
|
|
81
|
+
if (existsSync(path.join(candidate, 'package.json')))
|
|
82
|
+
return candidate;
|
|
83
|
+
const parent = path.dirname(dir);
|
|
84
|
+
if (parent === dir)
|
|
85
|
+
return null;
|
|
86
|
+
dir = parent;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** Read a package's `version` field, or null when the package.json is absent or
|
|
90
|
+
* unparseable. */
|
|
91
|
+
function packageVersion(pkgRoot) {
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(readFileSync(path.join(pkgRoot, 'package.json'), 'utf8'));
|
|
94
|
+
return typeof parsed.version === 'string' ? parsed.version : null;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Recursively collect every `.d.ts` under `dir`, skipping nested `node_modules`. */
|
|
101
|
+
function walkDts(dir, out = []) {
|
|
102
|
+
let entries;
|
|
103
|
+
try {
|
|
104
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
for (const e of entries) {
|
|
110
|
+
if (e.name === 'node_modules')
|
|
111
|
+
continue;
|
|
112
|
+
const p = path.join(dir, e.name);
|
|
113
|
+
if (e.isDirectory())
|
|
114
|
+
walkDts(p, out);
|
|
115
|
+
else if (p.endsWith('.d.ts'))
|
|
116
|
+
out.push(p);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The declaration kinds a named type may take: interfaces and classes (with an
|
|
122
|
+
* `interface_body`/`class_body`), plus type aliases (a `type_alias_declaration`
|
|
123
|
+
* whose body is an `object_type` or an `intersection_type` of `object_type`s).
|
|
124
|
+
* tree-sitter renders a declaration name as a leading `type_identifier` child
|
|
125
|
+
* for all three.
|
|
126
|
+
*/
|
|
127
|
+
const TYPE_DECLARATION_KINDS = new Set([
|
|
128
|
+
'interface_declaration',
|
|
129
|
+
'class_declaration',
|
|
130
|
+
'abstract_class_declaration',
|
|
131
|
+
'type_alias_declaration',
|
|
132
|
+
]);
|
|
133
|
+
/**
|
|
134
|
+
* Find every `interface_declaration` / `class_declaration` /
|
|
135
|
+
* `abstract_class_declaration` / `type_alias_declaration` named `typeName` in a
|
|
136
|
+
* parsed `.d.ts`.
|
|
137
|
+
*
|
|
138
|
+
* A name is not unique in a real declaration file: `@types/better-sqlite3`
|
|
139
|
+
* declares both `interface Statement` (the surface) and a *conditional*
|
|
140
|
+
* `type Statement<…> = …` alias (a tuple-parameter helper), in the same
|
|
141
|
+
* namespace. Returning the first match — whichever a depth-first walk reaches
|
|
142
|
+
* first — would let the helper alias shadow the interface and read an empty
|
|
143
|
+
* surface. Collect *all* matches and let the caller union their member surfaces.
|
|
144
|
+
*/
|
|
145
|
+
function findTypeDecls(root, typeName, sourceCode) {
|
|
146
|
+
const decls = [];
|
|
147
|
+
const stack = [root];
|
|
148
|
+
while (stack.length > 0) {
|
|
149
|
+
const node = stack.pop();
|
|
150
|
+
if (TYPE_DECLARATION_KINDS.has(node.type)) {
|
|
151
|
+
const nameNode = node.children?.find((c) => c.type === 'type_identifier');
|
|
152
|
+
if (nameNode && getNodeText(nameNode, sourceCode) === typeName)
|
|
153
|
+
decls.push(node);
|
|
154
|
+
}
|
|
155
|
+
if (node.children)
|
|
156
|
+
for (const c of node.children)
|
|
157
|
+
stack.push(c);
|
|
158
|
+
}
|
|
159
|
+
return decls;
|
|
160
|
+
}
|
|
161
|
+
/** A member node of a type body: a callable method/property signature or
|
|
162
|
+
* definition. */
|
|
163
|
+
function isMemberNode(t) {
|
|
164
|
+
return (t === 'method_signature' ||
|
|
165
|
+
t === 'property_signature' ||
|
|
166
|
+
t === 'method_definition' ||
|
|
167
|
+
t === 'public_field_definition' ||
|
|
168
|
+
t === 'property_definition');
|
|
169
|
+
}
|
|
170
|
+
/** Extract the identifier-name surface from a list of member nodes. Non-identifier
|
|
171
|
+
* members (`[Symbol.dispose]`, string-literal keys) are dropped. */
|
|
172
|
+
function collectCallableMembers(memberNodes, sourceCode) {
|
|
173
|
+
const members = new Set();
|
|
174
|
+
for (const m of memberNodes) {
|
|
175
|
+
if (!isMemberNode(m.type))
|
|
176
|
+
continue;
|
|
177
|
+
const nameNode = m.children?.find((c) => c.type === 'property_identifier');
|
|
178
|
+
if (!nameNode)
|
|
179
|
+
continue;
|
|
180
|
+
const name = getNodeText(nameNode, sourceCode);
|
|
181
|
+
if (name && /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name))
|
|
182
|
+
members.add(name);
|
|
183
|
+
}
|
|
184
|
+
return members;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Read the member surface of a `type_alias_declaration` whose body is an
|
|
188
|
+
* `object_type` or an `intersection_type` of `object_type`s — e.g.
|
|
189
|
+
* `type X = { a(): void } & { b(): void }`. Only the top-level members of each
|
|
190
|
+
* `object_type` are collected; a nested `object_type` inside a member's own type
|
|
191
|
+
* annotation (an index signature's value type, a method's return type) is NOT
|
|
192
|
+
* descended into — those are member *types*, not members of the alias.
|
|
193
|
+
*/
|
|
194
|
+
function readTypeAliasMembers(decl, sourceCode) {
|
|
195
|
+
const typeNode = decl.children?.find((c) => c.type === 'intersection_type' || c.type === 'object_type');
|
|
196
|
+
if (!typeNode)
|
|
197
|
+
return new Set();
|
|
198
|
+
const memberNodes = [];
|
|
199
|
+
if (typeNode.type === 'object_type') {
|
|
200
|
+
memberNodes.push(...(typeNode.children ?? []));
|
|
201
|
+
}
|
|
202
|
+
else if (typeNode.type === 'intersection_type') {
|
|
203
|
+
for (const part of typeNode.children ?? []) {
|
|
204
|
+
if (part.type === 'object_type')
|
|
205
|
+
memberNodes.push(...(part.children ?? []));
|
|
206
|
+
// A named-type reference (`type_identifier`) inside an intersection is a
|
|
207
|
+
// cross-declaration alias this single-file reader does not chase — the
|
|
208
|
+
// generated Prisma client never uses it for model delegates.
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return collectCallableMembers(memberNodes, sourceCode);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Read the callable member-name surface of one declared type from a `.d.ts` file.
|
|
215
|
+
* Method and property members both count — a vendor may declare `all(...)` as a
|
|
216
|
+
* method or as a `(...args) => Result` property, and both are part of the callable
|
|
217
|
+
* surface. Non-identifier members (`[Symbol.dispose]`, string-literal keys) are
|
|
218
|
+
* dropped. Returns null when the file is unreadable, unparseable, or does not
|
|
219
|
+
* declare the named type.
|
|
220
|
+
*
|
|
221
|
+
* When a name is declared more than once (an interface shadowed by a helper type
|
|
222
|
+
* alias, as in `@types/better-sqlite3`'s `Statement`), the surface is the union of
|
|
223
|
+
* every declaration's members — a conditional-type alias contributes none, so the
|
|
224
|
+
* interface's surface wins rather than being masked by the helper.
|
|
225
|
+
*/
|
|
226
|
+
function readTypeMemberSurface(dtsPath, typeName) {
|
|
227
|
+
let content;
|
|
228
|
+
try {
|
|
229
|
+
content = readFileSync(dtsPath, 'utf8');
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
const ast = parseFile(dtsPath, content);
|
|
235
|
+
if (!ast)
|
|
236
|
+
return null;
|
|
237
|
+
const decls = findTypeDecls(ast.root, typeName, content);
|
|
238
|
+
if (decls.length === 0)
|
|
239
|
+
return null;
|
|
240
|
+
const members = new Set();
|
|
241
|
+
for (const decl of decls) {
|
|
242
|
+
const body = decl.children?.find((c) => c.type === 'interface_body' || c.type === 'class_body');
|
|
243
|
+
if (body) {
|
|
244
|
+
for (const m of collectCallableMembers(body.children ?? [], content))
|
|
245
|
+
members.add(m);
|
|
246
|
+
}
|
|
247
|
+
else if (decl.type === 'type_alias_declaration') {
|
|
248
|
+
for (const m of readTypeAliasMembers(decl, content))
|
|
249
|
+
members.add(m);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return members;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Enumerate every `*Delegate` declaration in a parsed generated Prisma client and
|
|
256
|
+
* return the union of their callable member names — the model verb set. Prisma 6
|
|
257
|
+
* generates one delegate *interface* per model (`export interface UserDelegate<…>`)
|
|
258
|
+
* whose members are exactly the model verbs; the `[K: symbol]` index signature the
|
|
259
|
+
* generator adds is not a callable member and is dropped. Returns null when no
|
|
260
|
+
* `*Delegate` declaration is found (so an empty client is `unproven`, not an empty
|
|
261
|
+
* verb set).
|
|
262
|
+
*/
|
|
263
|
+
function readDelegateUnion(root, sourceCode) {
|
|
264
|
+
const verbs = new Set();
|
|
265
|
+
let found = false;
|
|
266
|
+
const stack = [root];
|
|
267
|
+
while (stack.length > 0) {
|
|
268
|
+
const node = stack.pop();
|
|
269
|
+
if (TYPE_DECLARATION_KINDS.has(node.type)) {
|
|
270
|
+
const nameNode = node.children?.find((c) => c.type === 'type_identifier');
|
|
271
|
+
const name = nameNode ? getNodeText(nameNode, sourceCode) : null;
|
|
272
|
+
if (name && /Delegate$/.test(name)) {
|
|
273
|
+
found = true;
|
|
274
|
+
const body = node.children?.find((c) => c.type === 'interface_body' || c.type === 'class_body');
|
|
275
|
+
const members = body
|
|
276
|
+
? collectCallableMembers(body.children ?? [], sourceCode)
|
|
277
|
+
: node.type === 'type_alias_declaration'
|
|
278
|
+
? readTypeAliasMembers(node, sourceCode)
|
|
279
|
+
: new Set();
|
|
280
|
+
for (const m of members)
|
|
281
|
+
verbs.add(m);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (node.children)
|
|
285
|
+
for (const c of node.children)
|
|
286
|
+
stack.push(c);
|
|
287
|
+
}
|
|
288
|
+
return found ? verbs : null;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Resolve the generated Prisma client's model verb set from the analyzed tree.
|
|
292
|
+
*
|
|
293
|
+
* Prisma generates its client into a dot-prefixed *virtual* package —
|
|
294
|
+
* `node_modules/.prisma/client/index.d.ts` — re-exported by the `@prisma/client`
|
|
295
|
+
* shim. The verbs live on the generated `*Delegate` declarations (one per model),
|
|
296
|
+
* identical across models by construction, so the union of their member names is
|
|
297
|
+
* exactly the verb set the repo's own schema generated. A tree without a generated
|
|
298
|
+
* client (no `node_modules/.prisma/client`) is `unproven` with that reason — never
|
|
299
|
+
* a committed snapshot, never a network fetch.
|
|
300
|
+
*/
|
|
301
|
+
function resolvePrismaSurface(projectRoot) {
|
|
302
|
+
const pkgRoot = resolvePackageRoot('.prisma/client', projectRoot);
|
|
303
|
+
if (!pkgRoot) {
|
|
304
|
+
return {
|
|
305
|
+
verbs: null,
|
|
306
|
+
resolution: {
|
|
307
|
+
pkg: '.prisma/client',
|
|
308
|
+
type: PRISMA_DELEGATE_TYPE,
|
|
309
|
+
path: null,
|
|
310
|
+
version: null,
|
|
311
|
+
reason: `generated Prisma client \`.prisma/client\` is not present under ${path.join(path.resolve(projectRoot), 'node_modules')} (run \`prisma generate\` in the analyzed tree)`,
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
const version = packageVersion(pkgRoot);
|
|
316
|
+
const indexDts = path.join(pkgRoot, 'index.d.ts');
|
|
317
|
+
if (!existsSync(indexDts)) {
|
|
318
|
+
return {
|
|
319
|
+
verbs: null,
|
|
320
|
+
resolution: {
|
|
321
|
+
pkg: '.prisma/client',
|
|
322
|
+
type: PRISMA_DELEGATE_TYPE,
|
|
323
|
+
path: null,
|
|
324
|
+
version,
|
|
325
|
+
reason: `generated Prisma client has no index.d.ts (${version ?? VERSION_UNKNOWN})`,
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
let content;
|
|
330
|
+
try {
|
|
331
|
+
content = readFileSync(indexDts, 'utf8');
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return {
|
|
335
|
+
verbs: null,
|
|
336
|
+
resolution: {
|
|
337
|
+
pkg: '.prisma/client',
|
|
338
|
+
type: PRISMA_DELEGATE_TYPE,
|
|
339
|
+
path: null,
|
|
340
|
+
version,
|
|
341
|
+
reason: `could not read ${indexDts}`,
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
const ast = parseFile(indexDts, content);
|
|
346
|
+
if (!ast) {
|
|
347
|
+
return {
|
|
348
|
+
verbs: null,
|
|
349
|
+
resolution: {
|
|
350
|
+
pkg: '.prisma/client',
|
|
351
|
+
type: PRISMA_DELEGATE_TYPE,
|
|
352
|
+
path: null,
|
|
353
|
+
version,
|
|
354
|
+
reason: `could not parse ${indexDts}`,
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
const verbs = readDelegateUnion(ast.root, content);
|
|
359
|
+
if (verbs === null) {
|
|
360
|
+
return {
|
|
361
|
+
verbs: null,
|
|
362
|
+
resolution: {
|
|
363
|
+
pkg: '.prisma/client',
|
|
364
|
+
type: PRISMA_DELEGATE_TYPE,
|
|
365
|
+
path: null,
|
|
366
|
+
version,
|
|
367
|
+
reason: `no \`*Delegate\` declaration found in the generated client (${version ?? VERSION_UNKNOWN})`,
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
verbs,
|
|
373
|
+
resolution: { pkg: '.prisma/client', type: PRISMA_DELEGATE_TYPE, path: indexDts, version, reason: null },
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Resolve one (package, type) surface from the tree's `node_modules`. Reads the
|
|
378
|
+
* named entry file when the spec names one; otherwise walks the package's shipped
|
|
379
|
+
* `.d.ts` files for the declaration (kysely's builders are split across subpath
|
|
380
|
+
* files, so its barrel index does not re-declare them). Returns a resolution
|
|
381
|
+
* record plus the member set (or null).
|
|
382
|
+
*/
|
|
383
|
+
function resolveType(spec, type, projectRoot) {
|
|
384
|
+
const pkgRoot = resolvePackageRoot(spec.pkg, projectRoot);
|
|
385
|
+
if (!pkgRoot) {
|
|
386
|
+
return {
|
|
387
|
+
members: null,
|
|
388
|
+
resolution: {
|
|
389
|
+
pkg: spec.pkg,
|
|
390
|
+
type,
|
|
391
|
+
path: null,
|
|
392
|
+
version: null,
|
|
393
|
+
reason: `package \`${spec.pkg}\` is not installed under ${path.join(path.resolve(projectRoot), 'node_modules')}`,
|
|
394
|
+
},
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
const version = packageVersion(pkgRoot);
|
|
398
|
+
// Named entry first; if the type is not declared there, fall back to a walk.
|
|
399
|
+
const candidates = [];
|
|
400
|
+
if (spec.entry)
|
|
401
|
+
candidates.push(path.join(pkgRoot, spec.entry));
|
|
402
|
+
if (!spec.entry)
|
|
403
|
+
walkDts(pkgRoot, candidates);
|
|
404
|
+
for (const dts of candidates) {
|
|
405
|
+
if (!existsSync(dts))
|
|
406
|
+
continue;
|
|
407
|
+
const members = readTypeMemberSurface(dts, type);
|
|
408
|
+
if (members !== null) {
|
|
409
|
+
return {
|
|
410
|
+
members,
|
|
411
|
+
resolution: { pkg: spec.pkg, type, path: dts, version, reason: null },
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// The entry (if named) may exist but not declare the type — walk as a fallback.
|
|
416
|
+
if (spec.entry) {
|
|
417
|
+
const walked = [];
|
|
418
|
+
walkDts(pkgRoot, walked);
|
|
419
|
+
for (const dts of walked) {
|
|
420
|
+
const members = readTypeMemberSurface(dts, type);
|
|
421
|
+
if (members !== null) {
|
|
422
|
+
return {
|
|
423
|
+
members,
|
|
424
|
+
resolution: { pkg: spec.pkg, type, path: dts, version, reason: null },
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return {
|
|
430
|
+
members: null,
|
|
431
|
+
resolution: {
|
|
432
|
+
pkg: spec.pkg,
|
|
433
|
+
type,
|
|
434
|
+
path: null,
|
|
435
|
+
version,
|
|
436
|
+
reason: `type \`${type}\` is not declared in the shipped \`${spec.pkg}\` declarations (${version ?? VERSION_UNKNOWN})`,
|
|
437
|
+
},
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
/** The per-surface field names, in resolution order, keyed by the (pkg, type)
|
|
441
|
+
* pair they correspond to. */
|
|
442
|
+
const SURFACE_FIELDS = [
|
|
443
|
+
{ pkg: PKG_BETTER_SQLITE3_TYPES, type: 'Database', field: 'betterSqlite3Database' },
|
|
444
|
+
{ pkg: PKG_BETTER_SQLITE3_TYPES, type: 'Statement', field: 'betterSqlite3Statement' },
|
|
445
|
+
{ pkg: PKG_NODE_TYPES, type: 'DatabaseSync', field: 'nodeSqliteDatabase' },
|
|
446
|
+
{ pkg: PKG_NODE_TYPES, type: 'StatementSync', field: 'nodeSqliteStatement' },
|
|
447
|
+
{ pkg: PKG_CLOUDFLARE_WORKERS_TYPES, type: 'D1Database', field: 'd1Database' },
|
|
448
|
+
{ pkg: PKG_CLOUDFLARE_WORKERS_TYPES, type: 'D1PreparedStatement', field: 'd1PreparedStatement' },
|
|
449
|
+
{ pkg: 'kysely', type: 'QueryCreator', field: 'kyselyQueryCreator' },
|
|
450
|
+
{ pkg: 'kysely', type: 'SelectQueryBuilder', field: 'kyselySelectQueryBuilder' },
|
|
451
|
+
{ pkg: '@types/pg', type: 'Pool', field: 'pgPool' },
|
|
452
|
+
{ pkg: 'mysql2', type: 'Connection', field: 'mysql2Connection' },
|
|
453
|
+
];
|
|
454
|
+
/**
|
|
455
|
+
* Resolve every vendor surface from the tree under analysis. One pass per run;
|
|
456
|
+
* nothing is cached across runs and nothing is fetched — a tree on a given
|
|
457
|
+
* vendor version is judged by that version's own declarations.
|
|
458
|
+
*
|
|
459
|
+
* @param projectRoot - The root of the tree under analysis; its `node_modules`
|
|
460
|
+
* (walked upward to the workspace root) is where each vendor's declarations resolve.
|
|
461
|
+
* @returns Every vendor surface, each either the resolved member set or `null`
|
|
462
|
+
* with a per-surface `resolution` record carrying the reason.
|
|
463
|
+
*/
|
|
464
|
+
export function resolveVendorSurfaces(projectRoot) {
|
|
465
|
+
const surfaces = {};
|
|
466
|
+
const resolutions = [];
|
|
467
|
+
for (const { pkg, type, field } of SURFACE_FIELDS) {
|
|
468
|
+
const spec = VENDOR_TYPE_SPECS.find((s) => s.pkg === pkg && s.types.includes(type));
|
|
469
|
+
const { members, resolution } = resolveType(spec, type, projectRoot);
|
|
470
|
+
surfaces[field] = members;
|
|
471
|
+
resolutions.push(resolution);
|
|
472
|
+
}
|
|
473
|
+
// Prisma is resolved separately: it is not a single named declaration type but
|
|
474
|
+
// the union of every generated `*Delegate` declaration in `.prisma/client`.
|
|
475
|
+
const prisma = resolvePrismaSurface(projectRoot);
|
|
476
|
+
surfaces.prismaVerbs = prisma.verbs;
|
|
477
|
+
resolutions.push(prisma.resolution);
|
|
478
|
+
return {
|
|
479
|
+
kyselyQueryCreator: surfaces.kyselyQueryCreator ?? null,
|
|
480
|
+
kyselySelectQueryBuilder: surfaces.kyselySelectQueryBuilder ?? null,
|
|
481
|
+
betterSqlite3Statement: surfaces.betterSqlite3Statement ?? null,
|
|
482
|
+
betterSqlite3Database: surfaces.betterSqlite3Database ?? null,
|
|
483
|
+
nodeSqliteStatement: surfaces.nodeSqliteStatement ?? null,
|
|
484
|
+
nodeSqliteDatabase: surfaces.nodeSqliteDatabase ?? null,
|
|
485
|
+
d1Database: surfaces.d1Database ?? null,
|
|
486
|
+
d1PreparedStatement: surfaces.d1PreparedStatement ?? null,
|
|
487
|
+
pgPool: surfaces.pgPool ?? null,
|
|
488
|
+
mysql2Connection: surfaces.mysql2Connection ?? null,
|
|
489
|
+
prismaVerbs: surfaces.prismaVerbs ?? null,
|
|
490
|
+
resolutions,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
/** Add every member of `names` that the surface publishes into `out`. */
|
|
494
|
+
function addIfPublished(surface, names, out) {
|
|
495
|
+
if (!surface)
|
|
496
|
+
return;
|
|
497
|
+
for (const name of names)
|
|
498
|
+
if (surface.has(name))
|
|
499
|
+
out.add(name);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Derive the method sets the analyzer reads. Three of them (`eagerMethods`,
|
|
503
|
+
* `ormTableVerbs`, `ormJoinVerbs`) are the union of the analyzer's irreducible
|
|
504
|
+
* cross-vendor grammar (the baseline, present regardless of what resolves) and the
|
|
505
|
+
* per-run *probe* — the methods only a specific vendor publishes that the baseline
|
|
506
|
+
* lacks. Two more are resolved *entirely* from the tree, with no baseline:
|
|
507
|
+
*
|
|
508
|
+
* - `prismaVerbs` — the union of the generated `.prisma/client` `*Delegate`
|
|
509
|
+
* member names. No hand-kept fallback: where `.prisma/client` is not generated,
|
|
510
|
+
* the set is null and the site is `unproven` with that reason.
|
|
511
|
+
* - `eagerExecutionMethods` — the cross-driver eager-execution surface, the union
|
|
512
|
+
* of whichever driver surfaces resolve (D1PreparedStatement; better-sqlite3 and
|
|
513
|
+
* node:sqlite statement+database; `query` from pg; `execute` from mysql2).
|
|
514
|
+
* Null when no driver resolves, never a fallback list.
|
|
515
|
+
*
|
|
516
|
+
* The baseline is not a copy of any single vendor's declaration: it is the
|
|
517
|
+
* analyzer's accumulated judgment of the generic SQL-driver/builder grammar, the
|
|
518
|
+
* cross-vendor union no one vendor is the authority for (the same criterion that
|
|
519
|
+
* keeps the seven irreducible lists). The probe supplies exactly what that grammar
|
|
520
|
+
* misses and only a vendor publishes — `iterate` (better-sqlite3), `mergeInto` /
|
|
521
|
+
* `replaceInto` and `fullJoin` / `*JoinLateral` (Kysely).
|
|
522
|
+
*
|
|
523
|
+
* @param s - The resolved vendor surfaces to derive the analyzer's method sets from.
|
|
524
|
+
* @returns The derived method sets (`eagerMethods`, `ormTableVerbs`, `ormJoinVerbs`,
|
|
525
|
+
* `prismaVerbs`, `eagerExecutionMethods`) the data-access analyzer reads.
|
|
526
|
+
*/
|
|
527
|
+
export function deriveVendorSets(s) {
|
|
528
|
+
// Irreducible baseline: the generic eager-I/O and builder-verb grammar.
|
|
529
|
+
const eagerMethods = new Set([
|
|
530
|
+
'query', // generic driver abstraction (handle.query)
|
|
531
|
+
'run', 'all', 'get', 'first', 'raw', 'exec', 'batch', // generic eager I/O
|
|
532
|
+
]);
|
|
533
|
+
const ormTableVerbs = new Set(['selectFrom', 'deleteFrom', 'insertInto', 'updateTable']);
|
|
534
|
+
const ormJoinVerbs = new Set(['join', 'leftJoin', 'rightJoin', 'innerJoin']);
|
|
535
|
+
// Per-run probe additions — absent when the vendor is unresolvable (unproven).
|
|
536
|
+
addIfPublished(s.betterSqlite3Statement, ['iterate'], eagerMethods);
|
|
537
|
+
addIfPublished(s.kyselyQueryCreator, ['mergeInto', 'replaceInto'], ormTableVerbs);
|
|
538
|
+
if (s.kyselySelectQueryBuilder) {
|
|
539
|
+
for (const m of s.kyselySelectQueryBuilder) {
|
|
540
|
+
if (m.endsWith('Join') || m.endsWith('JoinLateral'))
|
|
541
|
+
ormJoinVerbs.add(m);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
// Eager-execution surface — the cross-driver union of resolved statement/database
|
|
545
|
+
// surfaces, plus pg's `query` and mysql2's `execute`. Null when nothing resolves
|
|
546
|
+
// (the site is `unproven`); a tree with only better-sqlite3 gets better-sqlite3's
|
|
547
|
+
// methods and nothing else.
|
|
548
|
+
const eagerExecutionMethods = new Set();
|
|
549
|
+
let anyEagerDriverResolved = false;
|
|
550
|
+
const unionSurface = (surface) => {
|
|
551
|
+
if (!surface)
|
|
552
|
+
return;
|
|
553
|
+
anyEagerDriverResolved = true;
|
|
554
|
+
for (const m of surface)
|
|
555
|
+
eagerExecutionMethods.add(m);
|
|
556
|
+
};
|
|
557
|
+
unionSurface(s.d1PreparedStatement);
|
|
558
|
+
unionSurface(s.betterSqlite3Statement);
|
|
559
|
+
unionSurface(s.betterSqlite3Database);
|
|
560
|
+
unionSurface(s.nodeSqliteStatement);
|
|
561
|
+
unionSurface(s.nodeSqliteDatabase);
|
|
562
|
+
if (s.pgPool) {
|
|
563
|
+
anyEagerDriverResolved = true;
|
|
564
|
+
if (s.pgPool.has('query'))
|
|
565
|
+
eagerExecutionMethods.add('query');
|
|
566
|
+
}
|
|
567
|
+
if (s.mysql2Connection) {
|
|
568
|
+
anyEagerDriverResolved = true;
|
|
569
|
+
if (s.mysql2Connection.has('execute'))
|
|
570
|
+
eagerExecutionMethods.add('execute');
|
|
571
|
+
}
|
|
572
|
+
return {
|
|
573
|
+
eagerMethods,
|
|
574
|
+
ormTableVerbs,
|
|
575
|
+
ormJoinVerbs,
|
|
576
|
+
prismaVerbs: s.prismaVerbs,
|
|
577
|
+
eagerExecutionMethods: anyEagerDriverResolved ? eagerExecutionMethods : null,
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=vendorSurfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendorSurfaces.js","sourceRoot":"","sources":["../../src/analyzers/vendorSurfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditRunner.d.ts","sourceRoot":"","sources":["../src/auditRunner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,cAAc,EAoBf,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auditRunner.d.ts","sourceRoot":"","sources":["../src/auditRunner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,cAAc,EAoBf,MAAM,YAAY,CAAC;AA+CpB,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAulC1F;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B1F;AA6kBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB;oCAInB,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAAC;uBAQjD,kBAAkB,KAAG,OAAO,CAAC,WAAW,CAAC;6BAkK1B,WAAW,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;EAS7F;AAoGD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAsCnB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC/C,aAAa,EAAE,MAAM,EACrB,uBAAuB,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa;;;;;;;;oBAQjB,MAAM;wBAAkB,MAAM;qBAAe,MAAM;uBAAiB,MAAM;;;;;;;;EAyD1H;AA2FD,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC/C,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,OAAO,GACnB,iBAAiB,EAAE,CAoDrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAGjF;AAED,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|