code-auditor-mcp 4.1.0 → 5.0.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 +374 -0
- package/README.md +4 -4
- package/configs/hhra-compat.json +0 -8
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts +1 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js +7 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts +2 -8
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js +4 -4
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts +1 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts +2 -2
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts +1 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.js.map +1 -1
- package/dist/analyzers/applicability.d.ts +42 -0
- package/dist/analyzers/applicability.d.ts.map +1 -1
- package/dist/analyzers/applicability.js +74 -0
- package/dist/analyzers/applicability.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +18 -24
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +30 -23
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +113 -76
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +2 -0
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +8 -3
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +210 -148
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
- package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/documentationAnalyzer.js +23 -28
- package/dist/analyzers/documentationAnalyzer.js.map +1 -1
- package/dist/analyzers/handleIdentification.d.ts +356 -0
- package/dist/analyzers/handleIdentification.d.ts.map +1 -0
- package/dist/analyzers/handleIdentification.js +424 -0
- package/dist/analyzers/handleIdentification.js.map +1 -0
- package/dist/analyzers/manifestStaleness.d.ts +64 -0
- package/dist/analyzers/manifestStaleness.d.ts.map +1 -0
- package/dist/analyzers/manifestStaleness.js +115 -0
- package/dist/analyzers/manifestStaleness.js.map +1 -0
- package/dist/analyzers/orgFilterTiers.d.ts +73 -1
- package/dist/analyzers/orgFilterTiers.d.ts.map +1 -1
- package/dist/analyzers/orgFilterTiers.js +166 -1
- package/dist/analyzers/orgFilterTiers.js.map +1 -1
- package/dist/analyzers/provenance.d.ts +251 -57
- package/dist/analyzers/provenance.d.ts.map +1 -1
- package/dist/analyzers/provenance.js +1109 -429
- package/dist/analyzers/provenance.js.map +1 -1
- package/dist/analyzers/reactAnalyzer.d.ts +2 -0
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +2 -0
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/receiverResolution.d.ts +183 -0
- package/dist/analyzers/receiverResolution.d.ts.map +1 -0
- package/dist/analyzers/receiverResolution.js +540 -0
- package/dist/analyzers/receiverResolution.js.map +1 -0
- package/dist/analyzers/receiverRoot.d.ts +328 -0
- package/dist/analyzers/receiverRoot.d.ts.map +1 -0
- package/dist/analyzers/receiverRoot.js +990 -0
- package/dist/analyzers/receiverRoot.js.map +1 -0
- package/dist/analyzers/ruleRegistry.d.ts +12 -68
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
- package/dist/analyzers/ruleRegistry.js +32 -342
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/ruleTiming.d.ts +10 -0
- package/dist/analyzers/ruleTiming.d.ts.map +1 -1
- package/dist/analyzers/ruleTiming.js +20 -0
- package/dist/analyzers/ruleTiming.js.map +1 -1
- package/dist/analyzers/sqlLiteral.d.ts +76 -0
- package/dist/analyzers/sqlLiteral.d.ts.map +1 -0
- package/dist/analyzers/sqlLiteral.js +419 -0
- package/dist/analyzers/sqlLiteral.js.map +1 -0
- package/dist/analyzers/tsEcosystem.d.ts +115 -0
- package/dist/analyzers/tsEcosystem.d.ts.map +1 -0
- package/dist/analyzers/tsEcosystem.js +231 -0
- package/dist/analyzers/tsEcosystem.js.map +1 -0
- package/dist/analyzers/tsExpressionDescriptor.d.ts +156 -0
- package/dist/analyzers/tsExpressionDescriptor.d.ts.map +1 -0
- package/dist/analyzers/tsExpressionDescriptor.js +374 -0
- package/dist/analyzers/tsExpressionDescriptor.js.map +1 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +6 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +107 -44
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +1 -12
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +24 -101
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +287 -49
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +2130 -512
- 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 +2 -18
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +0 -33
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +20 -143
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +4 -3
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +36 -13
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSecretsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSecretsAnalyzer.js +6 -0
- package/dist/analyzers/universal/UniversalSecretsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts +15 -0
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.js +25 -0
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +21 -32
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +166 -196
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/functionConcerns.d.ts +3 -0
- package/dist/analyzers/universal/functionConcerns.d.ts.map +1 -1
- package/dist/analyzers/universal/functionConcerns.js +4 -1
- package/dist/analyzers/universal/functionConcerns.js.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts +310 -69
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.js +709 -383
- package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
- package/dist/analyzers/universal/schema/config.d.ts +3 -14
- package/dist/analyzers/universal/schema/config.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/config.js +3 -16
- package/dist/analyzers/universal/schema/config.js.map +1 -1
- package/dist/analyzers/universal/schema/discovery.d.ts +22 -1
- package/dist/analyzers/universal/schema/discovery.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/discovery.js +36 -20
- package/dist/analyzers/universal/schema/discovery.js.map +1 -1
- package/dist/analyzers/universal/schema/jsonSchema.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/jsonSchema.js +13 -3
- package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -1
- package/dist/analyzers/universal/schema/migrations.d.ts +187 -27
- package/dist/analyzers/universal/schema/migrations.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/migrations.js +443 -186
- package/dist/analyzers/universal/schema/migrations.js.map +1 -1
- package/dist/analyzers/universal/schema/types.d.ts +17 -3
- package/dist/analyzers/universal/schema/types.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/violations.js +1 -1
- package/dist/analyzers/universal/schema/violations.js.map +1 -1
- package/dist/analyzers/universal/styleScale.d.ts +52 -0
- package/dist/analyzers/universal/styleScale.d.ts.map +1 -0
- package/dist/analyzers/universal/styleScale.js +95 -0
- package/dist/analyzers/universal/styleScale.js.map +1 -0
- package/dist/applyDataDirEnv.js +1 -1
- package/dist/applyDataDirEnv.js.map +1 -1
- package/dist/auditRouter.d.ts +26 -30
- package/dist/auditRouter.d.ts.map +1 -1
- package/dist/auditRouter.js +373 -143
- package/dist/auditRouter.js.map +1 -1
- package/dist/auditRunner.d.ts +64 -1
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +1537 -1051
- package/dist/auditRunner.js.map +1 -1
- package/dist/baseline.d.ts +30 -3
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +70 -9
- package/dist/baseline.js.map +1 -1
- package/dist/cli.js +997 -812
- package/dist/cli.js.map +1 -1
- package/dist/codeIndex/analyzerConfig.d.ts +60 -0
- package/dist/codeIndex/analyzerConfig.d.ts.map +1 -0
- package/dist/codeIndex/analyzerConfig.js +98 -0
- package/dist/codeIndex/analyzerConfig.js.map +1 -0
- package/dist/codeIndex/auditResults.d.ts +39 -0
- package/dist/codeIndex/auditResults.d.ts.map +1 -0
- package/dist/codeIndex/auditResults.js +99 -0
- package/dist/codeIndex/auditResults.js.map +1 -0
- package/dist/codeIndex/codeMap.d.ts +59 -0
- package/dist/codeIndex/codeMap.d.ts.map +1 -0
- package/dist/codeIndex/codeMap.js +72 -0
- package/dist/codeIndex/codeMap.js.map +1 -0
- package/dist/codeIndex/conventions.d.ts +33 -0
- package/dist/codeIndex/conventions.d.ts.map +1 -0
- package/dist/codeIndex/conventions.js +84 -0
- package/dist/codeIndex/conventions.js.map +1 -0
- package/dist/codeIndex/coverage.d.ts +78 -0
- package/dist/codeIndex/coverage.d.ts.map +1 -0
- package/dist/codeIndex/coverage.js +164 -0
- package/dist/codeIndex/coverage.js.map +1 -0
- package/dist/codeIndex/dependencyGraph.d.ts +97 -0
- package/dist/codeIndex/dependencyGraph.d.ts.map +1 -0
- package/dist/codeIndex/dependencyGraph.js +241 -0
- package/dist/codeIndex/dependencyGraph.js.map +1 -0
- package/dist/codeIndex/functionIndex.d.ts +111 -0
- package/dist/codeIndex/functionIndex.d.ts.map +1 -0
- package/dist/codeIndex/functionIndex.js +306 -0
- package/dist/codeIndex/functionIndex.js.map +1 -0
- package/dist/codeIndex/inferredReceivers.d.ts +32 -0
- package/dist/codeIndex/inferredReceivers.d.ts.map +1 -0
- package/dist/codeIndex/inferredReceivers.js +41 -0
- package/dist/codeIndex/inferredReceivers.js.map +1 -0
- package/dist/codeIndex/meta.d.ts +30 -0
- package/dist/codeIndex/meta.d.ts.map +1 -0
- package/dist/codeIndex/meta.js +37 -0
- package/dist/codeIndex/meta.js.map +1 -0
- package/dist/codeIndex/migrations.d.ts +96 -0
- package/dist/codeIndex/migrations.d.ts.map +1 -0
- package/dist/codeIndex/migrations.js +1302 -0
- package/dist/codeIndex/migrations.js.map +1 -0
- package/dist/codeIndex/projectTasks.d.ts +54 -0
- package/dist/codeIndex/projectTasks.d.ts.map +1 -0
- package/dist/codeIndex/projectTasks.js +81 -0
- package/dist/codeIndex/projectTasks.js.map +1 -0
- package/dist/codeIndex/provenance.d.ts +47 -0
- package/dist/codeIndex/provenance.d.ts.map +1 -0
- package/dist/codeIndex/provenance.js +48 -0
- package/dist/codeIndex/provenance.js.map +1 -0
- package/dist/codeIndex/rawSql.d.ts +54 -0
- package/dist/codeIndex/rawSql.d.ts.map +1 -0
- package/dist/codeIndex/rawSql.js +71 -0
- package/dist/codeIndex/rawSql.js.map +1 -0
- package/dist/codeIndex/schema.d.ts +99 -0
- package/dist/codeIndex/schema.d.ts.map +1 -0
- package/dist/codeIndex/schema.js +174 -0
- package/dist/codeIndex/schema.js.map +1 -0
- package/dist/codeIndex/search.d.ts +40 -0
- package/dist/codeIndex/search.d.ts.map +1 -0
- package/dist/codeIndex/search.js +316 -0
- package/dist/codeIndex/search.js.map +1 -0
- package/dist/codeIndex/shared.d.ts +27 -0
- package/dist/codeIndex/shared.d.ts.map +1 -0
- package/dist/codeIndex/shared.js +46 -0
- package/dist/codeIndex/shared.js.map +1 -0
- package/dist/codeIndex/sqliteCollection.d.ts +81 -0
- package/dist/codeIndex/sqliteCollection.d.ts.map +1 -0
- package/dist/codeIndex/sqliteCollection.js +250 -0
- package/dist/codeIndex/sqliteCollection.js.map +1 -0
- package/dist/codeIndex/whitelist.d.ts +59 -0
- package/dist/codeIndex/whitelist.d.ts.map +1 -0
- package/dist/codeIndex/whitelist.js +188 -0
- package/dist/codeIndex/whitelist.js.map +1 -0
- package/dist/codeIndexDB.d.ts +130 -277
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +364 -2748
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/codeIndexService.d.ts +87 -12
- package/dist/codeIndexService.d.ts.map +1 -1
- package/dist/codeIndexService.js +110 -34
- package/dist/codeIndexService.js.map +1 -1
- package/dist/componentScanner.d.ts +35 -0
- package/dist/componentScanner.d.ts.map +1 -1
- package/dist/componentScanner.js +114 -80
- package/dist/componentScanner.js.map +1 -1
- package/dist/config/configGeneratePath.d.ts +4 -0
- package/dist/config/configGeneratePath.d.ts.map +1 -1
- package/dist/config/configGeneratePath.js +4 -0
- package/dist/config/configGeneratePath.js.map +1 -1
- package/dist/config/configLoader.d.ts +16 -1
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +26 -23
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +11 -7
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +21 -20
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/effectiveConfig.d.ts +17 -2
- package/dist/config/effectiveConfig.d.ts.map +1 -1
- package/dist/config/effectiveConfig.js +32 -25
- package/dist/config/effectiveConfig.js.map +1 -1
- package/dist/config/lintConfigReader.d.ts +6 -0
- package/dist/config/lintConfigReader.d.ts.map +1 -1
- package/dist/config/lintConfigReader.js +6 -0
- package/dist/config/lintConfigReader.js.map +1 -1
- package/dist/config/staticObjectExtract.d.ts +4 -0
- package/dist/config/staticObjectExtract.d.ts.map +1 -1
- package/dist/config/staticObjectExtract.js +7 -3
- package/dist/config/staticObjectExtract.js.map +1 -1
- package/dist/config/thresholdRationales.d.ts +2 -0
- package/dist/config/thresholdRationales.d.ts.map +1 -1
- package/dist/config/thresholdRationales.js +5 -2
- package/dist/config/thresholdRationales.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -5
- package/dist/constants.js.map +1 -1
- package/dist/conventions/conventionMiner.d.ts +105 -2
- package/dist/conventions/conventionMiner.d.ts.map +1 -1
- package/dist/conventions/conventionMiner.js +334 -259
- package/dist/conventions/conventionMiner.js.map +1 -1
- package/dist/coverage/coverageService.js +4 -4
- package/dist/coverage/coverageService.js.map +1 -1
- package/dist/daemon/args.d.ts +3 -0
- package/dist/daemon/args.d.ts.map +1 -1
- package/dist/daemon/args.js +3 -0
- package/dist/daemon/args.js.map +1 -1
- package/dist/daemon/core.d.ts +33 -27
- package/dist/daemon/core.d.ts.map +1 -1
- package/dist/daemon/core.js +198 -162
- package/dist/daemon/core.js.map +1 -1
- package/dist/daemon/lspServer.d.ts +8 -0
- package/dist/daemon/lspServer.d.ts.map +1 -1
- package/dist/daemon/lspServer.js +8 -0
- package/dist/daemon/lspServer.js.map +1 -1
- package/dist/daemon/main.d.ts +2 -0
- package/dist/daemon/main.d.ts.map +1 -1
- package/dist/daemon/main.js +2 -0
- package/dist/daemon/main.js.map +1 -1
- package/dist/daemon/resolve.d.ts +22 -7
- package/dist/daemon/resolve.d.ts.map +1 -1
- package/dist/daemon/resolve.js +29 -8
- package/dist/daemon/resolve.js.map +1 -1
- package/dist/daemon/socketClient.d.ts +10 -1
- package/dist/daemon/socketClient.d.ts.map +1 -1
- package/dist/daemon/socketClient.js +10 -1
- package/dist/daemon/socketClient.js.map +1 -1
- package/dist/daemon/socketServer.d.ts +13 -0
- package/dist/daemon/socketServer.d.ts.map +1 -1
- package/dist/daemon/socketServer.js +13 -0
- package/dist/daemon/socketServer.js.map +1 -1
- package/dist/dataPaths.d.ts +27 -8
- package/dist/dataPaths.d.ts.map +1 -1
- package/dist/dataPaths.js +28 -44
- package/dist/dataPaths.js.map +1 -1
- package/dist/dismissals.d.ts +22 -1
- package/dist/dismissals.d.ts.map +1 -1
- package/dist/dismissals.js +22 -1
- package/dist/dismissals.js.map +1 -1
- package/dist/enforcement/gate.d.ts +1 -0
- package/dist/enforcement/gate.d.ts.map +1 -1
- package/dist/enforcement/gate.js +1 -0
- package/dist/enforcement/gate.js.map +1 -1
- package/dist/fingerprint.d.ts +6 -0
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +46 -1
- package/dist/fingerprint.js.map +1 -1
- package/dist/functionScanner.d.ts +30 -1
- package/dist/functionScanner.d.ts.map +1 -1
- package/dist/functionScanner.js +258 -256
- package/dist/functionScanner.js.map +1 -1
- package/dist/generators/AWSQConfigGenerator.d.ts +23 -0
- package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
- package/dist/generators/AWSQConfigGenerator.js +23 -0
- package/dist/generators/AWSQConfigGenerator.js.map +1 -1
- package/dist/generators/BaseConfigGenerator.d.ts +7 -0
- package/dist/generators/BaseConfigGenerator.d.ts.map +1 -1
- package/dist/generators/BaseConfigGenerator.js +7 -0
- package/dist/generators/BaseConfigGenerator.js.map +1 -1
- package/dist/generators/ClaudeConfigGenerator.d.ts +23 -0
- package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ClaudeConfigGenerator.js +23 -0
- package/dist/generators/ClaudeConfigGenerator.js.map +1 -1
- package/dist/generators/ClineConfigGenerator.d.ts +23 -0
- package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ClineConfigGenerator.js +23 -0
- package/dist/generators/ClineConfigGenerator.js.map +1 -1
- package/dist/generators/CodeiumConfigGenerator.d.ts +23 -0
- package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CodeiumConfigGenerator.js +23 -0
- package/dist/generators/CodeiumConfigGenerator.js.map +1 -1
- package/dist/generators/CodexConfigGenerator.d.ts +23 -0
- package/dist/generators/CodexConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CodexConfigGenerator.js +23 -0
- package/dist/generators/CodexConfigGenerator.js.map +1 -1
- package/dist/generators/ConfigGeneratorFactory.d.ts +9 -0
- package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
- package/dist/generators/ConfigGeneratorFactory.js +9 -0
- package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
- package/dist/generators/ContinueConfigGenerator.d.ts +23 -0
- package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ContinueConfigGenerator.js +23 -0
- package/dist/generators/ContinueConfigGenerator.js.map +1 -1
- package/dist/generators/CopilotConfigGenerator.d.ts +23 -0
- package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CopilotConfigGenerator.js +23 -0
- package/dist/generators/CopilotConfigGenerator.js.map +1 -1
- package/dist/generators/CursorConfigGenerator.d.ts +23 -0
- package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CursorConfigGenerator.js +23 -0
- package/dist/generators/CursorConfigGenerator.js.map +1 -1
- package/dist/generators/GeminiConfigGenerator.d.ts +23 -0
- package/dist/generators/GeminiConfigGenerator.d.ts.map +1 -1
- package/dist/generators/GeminiConfigGenerator.js +23 -0
- package/dist/generators/GeminiConfigGenerator.js.map +1 -1
- package/dist/generators/VSCodeConfigGenerator.d.ts +23 -0
- package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/VSCodeConfigGenerator.js +23 -0
- package/dist/generators/VSCodeConfigGenerator.js.map +1 -1
- package/dist/generators/ZCodeConfigGenerator.d.ts +23 -0
- package/dist/generators/ZCodeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ZCodeConfigGenerator.js +23 -0
- package/dist/generators/ZCodeConfigGenerator.js.map +1 -1
- package/dist/graph/blastRadius.d.ts.map +1 -1
- package/dist/graph/blastRadius.js +12 -7
- package/dist/graph/blastRadius.js.map +1 -1
- package/dist/graph/callGraph.d.ts +31 -0
- package/dist/graph/callGraph.d.ts.map +1 -1
- package/dist/graph/callGraph.js +62 -32
- package/dist/graph/callGraph.js.map +1 -1
- package/dist/graph/importClassification.d.ts +28 -0
- package/dist/graph/importClassification.d.ts.map +1 -1
- package/dist/graph/importClassification.js +57 -0
- package/dist/graph/importClassification.js.map +1 -1
- package/dist/graph/importGraph.d.ts +38 -0
- package/dist/graph/importGraph.d.ts.map +1 -1
- package/dist/graph/importGraph.js +38 -0
- package/dist/graph/importGraph.js.map +1 -1
- package/dist/graph/outputFormatter.d.ts +12 -4
- package/dist/graph/outputFormatter.d.ts.map +1 -1
- package/dist/graph/outputFormatter.js +12 -62
- package/dist/graph/outputFormatter.js.map +1 -1
- package/dist/hooks/codex.d.ts +8 -1
- package/dist/hooks/codex.d.ts.map +1 -1
- package/dist/hooks/codex.js +7 -0
- package/dist/hooks/codex.js.map +1 -1
- package/dist/hooks/core.d.ts +6 -0
- package/dist/hooks/core.d.ts.map +1 -1
- package/dist/hooks/core.js +6 -1
- package/dist/hooks/core.js.map +1 -1
- package/dist/hooks/cursor.d.ts +11 -1
- package/dist/hooks/cursor.d.ts.map +1 -1
- package/dist/hooks/cursor.js +10 -0
- package/dist/hooks/cursor.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/installConfig.d.ts +23 -5
- package/dist/installConfig.d.ts.map +1 -1
- package/dist/installConfig.js +23 -5
- package/dist/installConfig.js.map +1 -1
- package/dist/installer.d.ts +6 -0
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +6 -0
- package/dist/installer.js.map +1 -1
- package/dist/invariants/ruleEngine.d.ts +3 -0
- package/dist/invariants/ruleEngine.d.ts.map +1 -1
- package/dist/invariants/ruleEngine.js +156 -119
- package/dist/invariants/ruleEngine.js.map +1 -1
- package/dist/invariants/ruleValidator.d.ts +3 -0
- package/dist/invariants/ruleValidator.d.ts.map +1 -1
- package/dist/invariants/ruleValidator.js +185 -178
- package/dist/invariants/ruleValidator.js.map +1 -1
- package/dist/languages/LanguageOrchestrator.d.ts +4 -1
- package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
- package/dist/languages/LanguageOrchestrator.js +8 -19
- package/dist/languages/LanguageOrchestrator.js.map +1 -1
- package/dist/languages/RuntimeManager.d.ts +8 -0
- package/dist/languages/RuntimeManager.d.ts.map +1 -1
- package/dist/languages/RuntimeManager.js +55 -5
- package/dist/languages/RuntimeManager.js.map +1 -1
- package/dist/languages/UniversalAnalyzer.js +1 -1
- package/dist/languages/UniversalAnalyzer.js.map +1 -1
- package/dist/languages/adapterBridge.d.ts +4 -0
- package/dist/languages/adapterBridge.d.ts.map +1 -1
- package/dist/languages/adapterBridge.js +37 -3
- package/dist/languages/adapterBridge.js.map +1 -1
- package/dist/languages/go/GoAdapter.d.ts.map +1 -1
- package/dist/languages/go/GoAdapter.js +11 -14
- package/dist/languages/go/GoAdapter.js.map +1 -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 +2 -0
- package/dist/languages/go/analyzer-src/dataaccess.go +388 -0
- package/dist/languages/go/analyzer-src/types.go +8 -0
- package/dist/languages/go/analyzer-windows-amd64.exe +0 -0
- package/dist/languages/go/database-packages.json +8 -0
- package/dist/languages/go/goResolution.d.ts +229 -0
- package/dist/languages/go/goResolution.d.ts.map +1 -0
- package/dist/languages/go/goResolution.js +799 -0
- package/dist/languages/go/goResolution.js.map +1 -0
- package/dist/languages/go/stdlib-packages.json +353 -0
- package/dist/languages/go/tenantInputs.d.ts +37 -0
- package/dist/languages/go/tenantInputs.d.ts.map +1 -0
- package/dist/languages/go/tenantInputs.js +121 -0
- package/dist/languages/go/tenantInputs.js.map +1 -0
- package/dist/languages/index.d.ts +1 -0
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +5 -0
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/json/JsonAdapter.d.ts +177 -0
- package/dist/languages/json/JsonAdapter.d.ts.map +1 -0
- package/dist/languages/json/JsonAdapter.js +531 -0
- package/dist/languages/json/JsonAdapter.js.map +1 -0
- package/dist/languages/locationIndex.d.ts +41 -0
- package/dist/languages/locationIndex.d.ts.map +1 -0
- package/dist/languages/locationIndex.js +42 -0
- package/dist/languages/locationIndex.js.map +1 -0
- package/dist/languages/sql/dialectDetection.d.ts +57 -0
- package/dist/languages/sql/dialectDetection.d.ts.map +1 -0
- package/dist/languages/sql/dialectDetection.js +135 -0
- package/dist/languages/sql/dialectDetection.js.map +1 -0
- package/dist/languages/sql/sqlAst.d.ts +494 -0
- package/dist/languages/sql/sqlAst.d.ts.map +1 -0
- package/dist/languages/sql/sqlAst.js +1817 -0
- package/dist/languages/sql/sqlAst.js.map +1 -0
- package/dist/languages/testConventions.d.ts +12 -1
- package/dist/languages/testConventions.d.ts.map +1 -1
- package/dist/languages/testConventions.js +13 -1
- package/dist/languages/testConventions.js.map +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -1
- package/dist/languages/tree-sitter/converter.js +2 -2
- package/dist/languages/tree-sitter/converter.js.map +1 -1
- package/dist/languages/tree-sitter/parser.d.ts +3 -4
- package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
- package/dist/languages/tree-sitter/parser.js +10 -4
- package/dist/languages/tree-sitter/parser.js.map +1 -1
- package/dist/languages/tree-sitter/rawNode.d.ts +3 -0
- package/dist/languages/tree-sitter/rawNode.d.ts.map +1 -1
- package/dist/languages/tree-sitter/rawNode.js +3 -0
- package/dist/languages/tree-sitter/rawNode.js.map +1 -1
- package/dist/languages/types.d.ts +7 -0
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +36 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +168 -45
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/languages/typescript/database-packages.json +19 -0
- package/dist/ledger.d.ts +118 -2
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +167 -45
- package/dist/ledger.js.map +1 -1
- package/dist/legacyIndexNotice.d.ts +32 -0
- package/dist/legacyIndexNotice.d.ts.map +1 -0
- package/dist/legacyIndexNotice.js +89 -0
- package/dist/legacyIndexNotice.js.map +1 -0
- package/dist/mcp-tools/discoveryQueries.d.ts +55 -0
- package/dist/mcp-tools/discoveryQueries.d.ts.map +1 -0
- package/dist/mcp-tools/discoveryQueries.js +157 -0
- package/dist/mcp-tools/discoveryQueries.js.map +1 -0
- package/dist/mcp-tools/projectTasks.d.ts +9 -123
- package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
- package/dist/mcp-tools/projectTasks.js +180 -170
- package/dist/mcp-tools/projectTasks.js.map +1 -1
- package/dist/mcp-tools/whitelistTools.d.ts +20 -0
- package/dist/mcp-tools/whitelistTools.d.ts.map +1 -1
- package/dist/mcp-tools/whitelistTools.js +20 -0
- package/dist/mcp-tools/whitelistTools.js.map +1 -1
- package/dist/mcp-tools/workflowGuide.d.ts +9 -0
- package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
- package/dist/mcp-tools/workflowGuide.js +13 -5
- package/dist/mcp-tools/workflowGuide.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts +78 -0
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +203 -340
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp-ui-simple.d.ts +2 -0
- package/dist/mcp-ui-simple.d.ts.map +1 -1
- package/dist/mcp-ui-simple.js +12 -5
- package/dist/mcp-ui-simple.js.map +1 -1
- package/dist/mcp.d.ts +6 -0
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +832 -851
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts +29 -33
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +102 -791
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/mcpAutoIndex.d.ts +5 -0
- package/dist/mcpAutoIndex.d.ts.map +1 -1
- package/dist/mcpAutoIndex.js +7 -2
- package/dist/mcpAutoIndex.js.map +1 -1
- package/dist/mcpDiagnostics.d.ts +7 -0
- package/dist/mcpDiagnostics.d.ts.map +1 -1
- package/dist/mcpDiagnostics.js +34 -9
- package/dist/mcpDiagnostics.js.map +1 -1
- package/dist/mcpToolErrors.d.ts +16 -0
- package/dist/mcpToolErrors.d.ts.map +1 -1
- package/dist/mcpToolErrors.js +16 -0
- package/dist/mcpToolErrors.js.map +1 -1
- package/dist/nextFile.d.ts +6 -0
- package/dist/nextFile.d.ts.map +1 -1
- package/dist/nextFile.js +6 -0
- package/dist/nextFile.js.map +1 -1
- package/dist/nextFileIncremental.d.ts +44 -4
- package/dist/nextFileIncremental.d.ts.map +1 -1
- package/dist/nextFileIncremental.js +47 -7
- package/dist/nextFileIncremental.js.map +1 -1
- package/dist/phase/batchFunctions.d.ts +38 -0
- package/dist/phase/batchFunctions.d.ts.map +1 -0
- package/dist/phase/batchFunctions.js +64 -0
- package/dist/phase/batchFunctions.js.map +1 -0
- package/dist/phase/checks.d.ts +39 -0
- package/dist/phase/checks.d.ts.map +1 -0
- package/dist/phase/checks.js +48 -0
- package/dist/phase/checks.js.map +1 -0
- package/dist/phase/codeBlocks.d.ts +25 -0
- package/dist/phase/codeBlocks.d.ts.map +1 -0
- package/dist/phase/codeBlocks.js +268 -0
- package/dist/phase/codeBlocks.js.map +1 -0
- package/dist/phase/colorMath.d.ts +41 -0
- package/dist/phase/colorMath.d.ts.map +1 -0
- package/dist/phase/colorMath.js +109 -0
- package/dist/phase/colorMath.js.map +1 -0
- package/dist/phase/config.d.ts +29 -0
- package/dist/phase/config.d.ts.map +1 -0
- package/dist/phase/config.js +54 -0
- package/dist/phase/config.js.map +1 -0
- package/dist/phase/consumed.d.ts +47 -0
- package/dist/phase/consumed.d.ts.map +1 -0
- package/dist/phase/consumed.js +22 -0
- package/dist/phase/consumed.js.map +1 -0
- package/dist/phase/conventionMining.d.ts +59 -0
- package/dist/phase/conventionMining.d.ts.map +1 -0
- package/dist/phase/conventionMining.js +152 -0
- package/dist/phase/conventionMining.js.map +1 -0
- package/dist/phase/coverage.d.ts +65 -0
- package/dist/phase/coverage.d.ts.map +1 -0
- package/dist/phase/coverage.js +121 -0
- package/dist/phase/coverage.js.map +1 -0
- package/dist/phase/dag.d.ts +49 -0
- package/dist/phase/dag.d.ts.map +1 -0
- package/dist/phase/dag.js +120 -0
- package/dist/phase/dag.js.map +1 -0
- package/dist/phase/dataAccessCalls.d.ts +33 -0
- package/dist/phase/dataAccessCalls.d.ts.map +1 -0
- package/dist/phase/dataAccessCalls.js +42 -0
- package/dist/phase/dataAccessCalls.js.map +1 -0
- package/dist/phase/dataAccessCallsCandidates.d.ts +25 -0
- package/dist/phase/dataAccessCallsCandidates.d.ts.map +1 -0
- package/dist/phase/dataAccessCallsCandidates.js +27 -0
- package/dist/phase/dataAccessCallsCandidates.js.map +1 -0
- package/dist/phase/dynamicSql.d.ts +18 -0
- package/dist/phase/dynamicSql.d.ts.map +1 -0
- package/dist/phase/dynamicSql.js +20 -0
- package/dist/phase/dynamicSql.js.map +1 -0
- package/dist/phase/exportForm.d.ts +23 -0
- package/dist/phase/exportForm.d.ts.map +1 -0
- package/dist/phase/exportForm.js +29 -0
- package/dist/phase/exportForm.js.map +1 -0
- package/dist/phase/exportSymbols.d.ts +21 -0
- package/dist/phase/exportSymbols.d.ts.map +1 -0
- package/dist/phase/exportSymbols.js +28 -0
- package/dist/phase/exportSymbols.js.map +1 -0
- package/dist/phase/fileHeader.d.ts +15 -0
- package/dist/phase/fileHeader.d.ts.map +1 -0
- package/dist/phase/fileHeader.js +33 -0
- package/dist/phase/fileHeader.js.map +1 -0
- package/dist/phase/fileImports.d.ts +39 -0
- package/dist/phase/fileImports.d.ts.map +1 -0
- package/dist/phase/fileImports.js +138 -0
- package/dist/phase/fileImports.js.map +1 -0
- package/dist/phase/fileSymbols.d.ts +25 -0
- package/dist/phase/fileSymbols.d.ts.map +1 -0
- package/dist/phase/fileSymbols.js +302 -0
- package/dist/phase/fileSymbols.js.map +1 -0
- package/dist/phase/functionBodies.d.ts +28 -0
- package/dist/phase/functionBodies.d.ts.map +1 -0
- package/dist/phase/functionBodies.js +67 -0
- package/dist/phase/functionBodies.js.map +1 -0
- package/dist/phase/functionIndex.d.ts +28 -0
- package/dist/phase/functionIndex.d.ts.map +1 -0
- package/dist/phase/functionIndex.js +152 -0
- package/dist/phase/functionIndex.js.map +1 -0
- package/dist/phase/goFunctionAnalysis.d.ts +47 -0
- package/dist/phase/goFunctionAnalysis.d.ts.map +1 -0
- package/dist/phase/goFunctionAnalysis.js +291 -0
- package/dist/phase/goFunctionAnalysis.js.map +1 -0
- package/dist/phase/goFunctions.d.ts +38 -0
- package/dist/phase/goFunctions.d.ts.map +1 -0
- package/dist/phase/goFunctions.js +154 -0
- package/dist/phase/goFunctions.js.map +1 -0
- package/dist/phase/goImports.d.ts +29 -0
- package/dist/phase/goImports.d.ts.map +1 -0
- package/dist/phase/goImports.js +68 -0
- package/dist/phase/goImports.js.map +1 -0
- package/dist/phase/goPackageBindings.d.ts +22 -0
- package/dist/phase/goPackageBindings.d.ts.map +1 -0
- package/dist/phase/goPackageBindings.js +30 -0
- package/dist/phase/goPackageBindings.js.map +1 -0
- package/dist/phase/goSwitches.d.ts +28 -0
- package/dist/phase/goSwitches.d.ts.map +1 -0
- package/dist/phase/goSwitches.js +52 -0
- package/dist/phase/goSwitches.js.map +1 -0
- package/dist/phase/importForm.d.ts +20 -0
- package/dist/phase/importForm.d.ts.map +1 -0
- package/dist/phase/importForm.js +27 -0
- package/dist/phase/importForm.js.map +1 -0
- package/dist/phase/importSpecifiers.d.ts +20 -0
- package/dist/phase/importSpecifiers.d.ts.map +1 -0
- package/dist/phase/importSpecifiers.js +30 -0
- package/dist/phase/importSpecifiers.js.map +1 -0
- package/dist/phase/imports.d.ts +18 -0
- package/dist/phase/imports.d.ts.map +1 -0
- package/dist/phase/imports.js +25 -0
- package/dist/phase/imports.js.map +1 -0
- package/dist/phase/jsonDocument.d.ts +26 -0
- package/dist/phase/jsonDocument.d.ts.map +1 -0
- package/dist/phase/jsonDocument.js +36 -0
- package/dist/phase/jsonDocument.js.map +1 -0
- package/dist/phase/localBinding.d.ts +33 -0
- package/dist/phase/localBinding.d.ts.map +1 -0
- package/dist/phase/localBinding.js +208 -0
- package/dist/phase/localBinding.js.map +1 -0
- package/dist/phase/loopQueries.d.ts +31 -0
- package/dist/phase/loopQueries.d.ts.map +1 -0
- package/dist/phase/loopQueries.js +44 -0
- package/dist/phase/loopQueries.js.map +1 -0
- package/dist/phase/loopQueryCandidates.d.ts +26 -0
- package/dist/phase/loopQueryCandidates.d.ts.map +1 -0
- package/dist/phase/loopQueryCandidates.js +28 -0
- package/dist/phase/loopQueryCandidates.js.map +1 -0
- package/dist/phase/oracles.d.ts +216 -0
- package/dist/phase/oracles.d.ts.map +1 -0
- package/dist/phase/oracles.js +484 -0
- package/dist/phase/oracles.js.map +1 -0
- package/dist/phase/phaseModel.d.ts +190 -0
- package/dist/phase/phaseModel.d.ts.map +1 -0
- package/dist/phase/phaseModel.js +468 -0
- package/dist/phase/phaseModel.js.map +1 -0
- package/dist/phase/producers.d.ts +450 -0
- package/dist/phase/producers.d.ts.map +1 -0
- package/dist/phase/producers.js +1027 -0
- package/dist/phase/producers.js.map +1 -0
- package/dist/phase/querySiteCandidates.d.ts +27 -0
- package/dist/phase/querySiteCandidates.d.ts.map +1 -0
- package/dist/phase/querySiteCandidates.js +66 -0
- package/dist/phase/querySiteCandidates.js.map +1 -0
- package/dist/phase/querySites.d.ts +30 -0
- package/dist/phase/querySites.d.ts.map +1 -0
- package/dist/phase/querySites.js +93 -0
- package/dist/phase/querySites.js.map +1 -0
- package/dist/phase/reachability.d.ts +61 -0
- package/dist/phase/reachability.d.ts.map +1 -0
- package/dist/phase/reachability.js +104 -0
- package/dist/phase/reachability.js.map +1 -0
- package/dist/phase/reactComponents.d.ts +33 -0
- package/dist/phase/reactComponents.d.ts.map +1 -0
- package/dist/phase/reactComponents.js +47 -0
- package/dist/phase/reactComponents.js.map +1 -0
- package/dist/phase/receiverActivity.d.ts +35 -0
- package/dist/phase/receiverActivity.d.ts.map +1 -0
- package/dist/phase/receiverActivity.js +66 -0
- package/dist/phase/receiverActivity.js.map +1 -0
- package/dist/phase/receiverConsumers.d.ts +200 -0
- package/dist/phase/receiverConsumers.d.ts.map +1 -0
- package/dist/phase/receiverConsumers.js +1025 -0
- package/dist/phase/receiverConsumers.js.map +1 -0
- package/dist/phase/receiverProvenance.d.ts +97 -0
- package/dist/phase/receiverProvenance.d.ts.map +1 -0
- package/dist/phase/receiverProvenance.js +337 -0
- package/dist/phase/receiverProvenance.js.map +1 -0
- package/dist/phase/routing.d.ts +47 -0
- package/dist/phase/routing.d.ts.map +1 -0
- package/dist/phase/routing.js +62 -0
- package/dist/phase/routing.js.map +1 -0
- package/dist/phase/rules/conventions.d.ts +61 -0
- package/dist/phase/rules/conventions.d.ts.map +1 -0
- package/dist/phase/rules/conventions.js +403 -0
- package/dist/phase/rules/conventions.js.map +1 -0
- package/dist/phase/rules/crossDomain.d.ts +102 -0
- package/dist/phase/rules/crossDomain.d.ts.map +1 -0
- package/dist/phase/rules/crossDomain.js +918 -0
- package/dist/phase/rules/crossDomain.js.map +1 -0
- package/dist/phase/rules/dataAccess.d.ts +62 -0
- package/dist/phase/rules/dataAccess.d.ts.map +1 -0
- package/dist/phase/rules/dataAccess.js +480 -0
- package/dist/phase/rules/dataAccess.js.map +1 -0
- package/dist/phase/rules/dependencyGraph.d.ts +44 -0
- package/dist/phase/rules/dependencyGraph.d.ts.map +1 -0
- package/dist/phase/rules/dependencyGraph.js +260 -0
- package/dist/phase/rules/dependencyGraph.js.map +1 -0
- package/dist/phase/rules/documentation.d.ts +45 -0
- package/dist/phase/rules/documentation.d.ts.map +1 -0
- package/dist/phase/rules/documentation.js +340 -0
- package/dist/phase/rules/documentation.js.map +1 -0
- package/dist/phase/rules/dry.d.ts +109 -0
- package/dist/phase/rules/dry.d.ts.map +1 -0
- package/dist/phase/rules/dry.js +803 -0
- package/dist/phase/rules/dry.js.map +1 -0
- package/dist/phase/rules/fileDocumentation.d.ts +36 -0
- package/dist/phase/rules/fileDocumentation.d.ts.map +1 -0
- package/dist/phase/rules/fileDocumentation.js +134 -0
- package/dist/phase/rules/fileDocumentation.js.map +1 -0
- package/dist/phase/rules/functionBodies.d.ts +33 -0
- package/dist/phase/rules/functionBodies.d.ts.map +1 -0
- package/dist/phase/rules/functionBodies.js +71 -0
- package/dist/phase/rules/functionBodies.js.map +1 -0
- package/dist/phase/rules/goRules.d.ts +49 -0
- package/dist/phase/rules/goRules.d.ts.map +1 -0
- package/dist/phase/rules/goRules.js +209 -0
- package/dist/phase/rules/goRules.js.map +1 -0
- package/dist/phase/rules/querySites.d.ts +29 -0
- package/dist/phase/rules/querySites.d.ts.map +1 -0
- package/dist/phase/rules/querySites.js +94 -0
- package/dist/phase/rules/querySites.js.map +1 -0
- package/dist/phase/rules/react.d.ts +38 -0
- package/dist/phase/rules/react.d.ts.map +1 -0
- package/dist/phase/rules/react.js +202 -0
- package/dist/phase/rules/react.js.map +1 -0
- package/dist/phase/rules/registry.d.ts +170 -0
- package/dist/phase/rules/registry.d.ts.map +1 -0
- package/dist/phase/rules/registry.js +103 -0
- package/dist/phase/rules/registry.js.map +1 -0
- package/dist/phase/rules/schema.d.ts +79 -0
- package/dist/phase/rules/schema.d.ts.map +1 -0
- package/dist/phase/rules/schema.js +273 -0
- package/dist/phase/rules/schema.js.map +1 -0
- package/dist/phase/rules/schemaJson.d.ts +32 -0
- package/dist/phase/rules/schemaJson.d.ts.map +1 -0
- package/dist/phase/rules/schemaJson.js +81 -0
- package/dist/phase/rules/schemaJson.js.map +1 -0
- package/dist/phase/rules/schemaValidator.d.ts +38 -0
- package/dist/phase/rules/schemaValidator.d.ts.map +1 -0
- package/dist/phase/rules/schemaValidator.js +107 -0
- package/dist/phase/rules/schemaValidator.js.map +1 -0
- package/dist/phase/rules/secrets.d.ts +34 -0
- package/dist/phase/rules/secrets.d.ts.map +1 -0
- package/dist/phase/rules/secrets.js +208 -0
- package/dist/phase/rules/secrets.js.map +1 -0
- package/dist/phase/rules/security.d.ts +30 -0
- package/dist/phase/rules/security.d.ts.map +1 -0
- package/dist/phase/rules/security.js +85 -0
- package/dist/phase/rules/security.js.map +1 -0
- package/dist/phase/rules/securityDefects.d.ts +37 -0
- package/dist/phase/rules/securityDefects.d.ts.map +1 -0
- package/dist/phase/rules/securityDefects.js +167 -0
- package/dist/phase/rules/securityDefects.js.map +1 -0
- package/dist/phase/rules/solid.d.ts +61 -0
- package/dist/phase/rules/solid.d.ts.map +1 -0
- package/dist/phase/rules/solid.js +562 -0
- package/dist/phase/rules/solid.js.map +1 -0
- package/dist/phase/rules/styles.d.ts +77 -0
- package/dist/phase/rules/styles.d.ts.map +1 -0
- package/dist/phase/rules/styles.js +868 -0
- package/dist/phase/rules/styles.js.map +1 -0
- package/dist/phase/rules/unreferencedModule.d.ts +26 -0
- package/dist/phase/rules/unreferencedModule.d.ts.map +1 -0
- package/dist/phase/rules/unreferencedModule.js +61 -0
- package/dist/phase/rules/unreferencedModule.js.map +1 -0
- package/dist/phase/runner.d.ts +549 -0
- package/dist/phase/runner.d.ts.map +1 -0
- package/dist/phase/runner.js +1098 -0
- package/dist/phase/runner.js.map +1 -0
- package/dist/phase/schemaCode.d.ts +34 -0
- package/dist/phase/schemaCode.d.ts.map +1 -0
- package/dist/phase/schemaCode.js +53 -0
- package/dist/phase/schemaCode.js.map +1 -0
- package/dist/phase/schemaObjects.d.ts +37 -0
- package/dist/phase/schemaObjects.d.ts.map +1 -0
- package/dist/phase/schemaObjects.js +139 -0
- package/dist/phase/schemaObjects.js.map +1 -0
- package/dist/phase/schemaUsage.d.ts +30 -0
- package/dist/phase/schemaUsage.d.ts.map +1 -0
- package/dist/phase/schemaUsage.js +99 -0
- package/dist/phase/schemaUsage.js.map +1 -0
- package/dist/phase/schemaUsageCandidates.d.ts +32 -0
- package/dist/phase/schemaUsageCandidates.d.ts.map +1 -0
- package/dist/phase/schemaUsageCandidates.js +165 -0
- package/dist/phase/schemaUsageCandidates.js.map +1 -0
- package/dist/phase/schemaValidations.d.ts +34 -0
- package/dist/phase/schemaValidations.d.ts.map +1 -0
- package/dist/phase/schemaValidations.js +53 -0
- package/dist/phase/schemaValidations.js.map +1 -0
- package/dist/phase/secretCandidates.d.ts +28 -0
- package/dist/phase/secretCandidates.d.ts.map +1 -0
- package/dist/phase/secretCandidates.js +132 -0
- package/dist/phase/secretCandidates.js.map +1 -0
- package/dist/phase/securityCandidates.d.ts +29 -0
- package/dist/phase/securityCandidates.d.ts.map +1 -0
- package/dist/phase/securityCandidates.js +469 -0
- package/dist/phase/securityCandidates.js.map +1 -0
- package/dist/phase/seeded-defects.d.ts +18 -0
- package/dist/phase/seeded-defects.d.ts.map +1 -0
- package/dist/phase/seeded-defects.js +61 -0
- package/dist/phase/seeded-defects.js.map +1 -0
- package/dist/phase/stringLiterals.d.ts +24 -0
- package/dist/phase/stringLiterals.d.ts.map +1 -0
- package/dist/phase/stringLiterals.js +35 -0
- package/dist/phase/stringLiterals.js.map +1 -0
- package/dist/phase/stylesCss.d.ts +25 -0
- package/dist/phase/stylesCss.d.ts.map +1 -0
- package/dist/phase/stylesCss.js +34 -0
- package/dist/phase/stylesCss.js.map +1 -0
- package/dist/phase/stylesMarkup.d.ts +31 -0
- package/dist/phase/stylesMarkup.d.ts.map +1 -0
- package/dist/phase/stylesMarkup.js +48 -0
- package/dist/phase/stylesMarkup.js.map +1 -0
- package/dist/phase/stylesSource.d.ts +36 -0
- package/dist/phase/stylesSource.d.ts.map +1 -0
- package/dist/phase/stylesSource.js +50 -0
- package/dist/phase/stylesSource.js.map +1 -0
- package/dist/phase/typeDeclarations.d.ts +33 -0
- package/dist/phase/typeDeclarations.d.ts.map +1 -0
- package/dist/phase/typeDeclarations.js +76 -0
- package/dist/phase/typeDeclarations.js.map +1 -0
- package/dist/phase/types.d.ts +2191 -0
- package/dist/phase/types.d.ts.map +1 -0
- package/dist/phase/types.js +27 -0
- package/dist/phase/types.js.map +1 -0
- package/dist/phase/withinFileProvenance.d.ts +50 -0
- package/dist/phase/withinFileProvenance.d.ts.map +1 -0
- package/dist/phase/withinFileProvenance.js +112 -0
- package/dist/phase/withinFileProvenance.js.map +1 -0
- package/dist/pipeline.d.ts +37 -30
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +131 -326
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +104 -21
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +1145 -988
- package/dist/pipelineAdapters.js.map +1 -1
- package/dist/pipelineTypes.d.ts +21 -0
- package/dist/pipelineTypes.d.ts.map +1 -1
- package/dist/pipelineTypes.js +21 -10
- package/dist/pipelineTypes.js.map +1 -1
- package/dist/presets/presets.d.ts +9 -2
- package/dist/presets/presets.d.ts.map +1 -1
- package/dist/presets/presets.js +15 -26
- package/dist/presets/presets.js.map +1 -1
- package/dist/reporting/csvReportGenerator.d.ts +14 -3
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
- package/dist/reporting/csvReportGenerator.js +14 -3
- package/dist/reporting/csvReportGenerator.js.map +1 -1
- package/dist/reporting/htmlReportGenerator.d.ts +5 -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 +9 -2
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.js +19 -5
- package/dist/reporting/jsonReportGenerator.js.map +1 -1
- package/dist/reporting/reportGenerator.d.ts +9 -2
- package/dist/reporting/reportGenerator.d.ts.map +1 -1
- package/dist/reporting/reportGenerator.js +9 -2
- package/dist/reporting/reportGenerator.js.map +1 -1
- package/dist/reporting/sarifReportGenerator.d.ts +14 -0
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
- package/dist/reporting/sarifReportGenerator.js +14 -0
- package/dist/reporting/sarifReportGenerator.js.map +1 -1
- package/dist/reporting/sizeDistribution.d.ts +19 -2
- package/dist/reporting/sizeDistribution.d.ts.map +1 -1
- package/dist/reporting/sizeDistribution.js +23 -5
- package/dist/reporting/sizeDistribution.js.map +1 -1
- package/dist/ruleAliases.d.ts +6 -8
- package/dist/ruleAliases.d.ts.map +1 -1
- package/dist/ruleAliases.js +29 -4
- package/dist/ruleAliases.js.map +1 -1
- package/dist/search/QueryParser.d.ts +1 -0
- package/dist/search/QueryParser.d.ts.map +1 -1
- package/dist/search/QueryParser.js +32 -91
- package/dist/search/QueryParser.js.map +1 -1
- package/dist/services/CodeMapGenerator.d.ts +19 -20
- package/dist/services/CodeMapGenerator.d.ts.map +1 -1
- package/dist/services/CodeMapGenerator.js +214 -194
- package/dist/services/CodeMapGenerator.js.map +1 -1
- package/dist/services/ProjectTaskRepository.d.ts +65 -3
- package/dist/services/ProjectTaskRepository.d.ts.map +1 -1
- package/dist/services/ProjectTaskRepository.js +94 -25
- package/dist/services/ProjectTaskRepository.js.map +1 -1
- package/dist/services/auditJobService.d.ts +17 -1
- package/dist/services/auditJobService.d.ts.map +1 -1
- package/dist/services/auditJobService.js +16 -0
- package/dist/services/auditJobService.js.map +1 -1
- package/dist/services/fileAccounting.d.ts +43 -5
- package/dist/services/fileAccounting.d.ts.map +1 -1
- package/dist/services/fileAccounting.js +48 -9
- package/dist/services/fileAccounting.js.map +1 -1
- package/dist/services/projectTaskHelpers.d.ts +45 -0
- package/dist/services/projectTaskHelpers.d.ts.map +1 -1
- package/dist/services/projectTaskHelpers.js +45 -0
- package/dist/services/projectTaskHelpers.js.map +1 -1
- package/dist/services/whitelistService.d.ts +40 -5
- package/dist/services/whitelistService.d.ts.map +1 -1
- package/dist/services/whitelistService.js +87 -46
- package/dist/services/whitelistService.js.map +1 -1
- package/dist/sqlite/betterSqlite3.d.ts +35 -1
- package/dist/sqlite/betterSqlite3.d.ts.map +1 -1
- package/dist/sqlite/betterSqlite3.js +35 -1
- package/dist/sqlite/betterSqlite3.js.map +1 -1
- package/dist/sqlite/driver.d.ts +23 -0
- package/dist/sqlite/driver.d.ts.map +1 -1
- package/dist/sqlite/driver.js +23 -0
- package/dist/sqlite/driver.js.map +1 -1
- package/dist/sqlite/nodeSqlite.d.ts +35 -1
- package/dist/sqlite/nodeSqlite.d.ts.map +1 -1
- package/dist/sqlite/nodeSqlite.js +35 -1
- package/dist/sqlite/nodeSqlite.js.map +1 -1
- package/dist/structuralSignature.d.ts +9 -0
- package/dist/structuralSignature.d.ts.map +1 -1
- package/dist/structuralSignature.js +9 -0
- package/dist/structuralSignature.js.map +1 -1
- package/dist/styles/cssAstExtractor.d.ts +15 -0
- package/dist/styles/cssAstExtractor.d.ts.map +1 -1
- package/dist/styles/cssAstExtractor.js +15 -0
- package/dist/styles/cssAstExtractor.js.map +1 -1
- package/dist/styles/normalizer.d.ts +6 -0
- package/dist/styles/normalizer.d.ts.map +1 -1
- package/dist/styles/normalizer.js +6 -0
- package/dist/styles/normalizer.js.map +1 -1
- package/dist/styles/styleExtractor.d.ts +29 -2
- package/dist/styles/styleExtractor.d.ts.map +1 -1
- package/dist/styles/styleExtractor.js +67 -48
- package/dist/styles/styleExtractor.js.map +1 -1
- package/dist/styles/styleIndexer.d.ts +8 -0
- package/dist/styles/styleIndexer.d.ts.map +1 -1
- package/dist/styles/styleIndexer.js +135 -138
- package/dist/styles/styleIndexer.js.map +1 -1
- package/dist/styles/tailwindConfigLoader.d.ts +12 -0
- package/dist/styles/tailwindConfigLoader.d.ts.map +1 -1
- package/dist/styles/tailwindConfigLoader.js +12 -0
- package/dist/styles/tailwindConfigLoader.js.map +1 -1
- package/dist/styles/tailwindExpander.d.ts +3 -0
- package/dist/styles/tailwindExpander.d.ts.map +1 -1
- package/dist/styles/tailwindExpander.js +8 -4
- package/dist/styles/tailwindExpander.js.map +1 -1
- package/dist/styles/tailwindProbe.d.ts +9 -0
- package/dist/styles/tailwindProbe.d.ts.map +1 -1
- package/dist/styles/tailwindProbe.js +181 -166
- package/dist/styles/tailwindProbe.js.map +1 -1
- package/dist/styles/tailwindUtilityExpander.d.ts +13 -0
- package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
- package/dist/styles/tailwindUtilityExpander.js +13 -0
- package/dist/styles/tailwindUtilityExpander.js.map +1 -1
- package/dist/symbols.d.ts +13 -11
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +14 -21
- package/dist/symbols.js.map +1 -1
- package/dist/telemetry.d.ts +31 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +31 -3
- package/dist/telemetry.js.map +1 -1
- package/dist/tool-registry.d.ts +37 -1
- package/dist/tool-registry.d.ts.map +1 -1
- package/dist/tool-registry.js +37 -1
- package/dist/tool-registry.js.map +1 -1
- package/dist/types.d.ts +106 -92
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -16
- package/dist/types.js.map +1 -1
- package/dist/ui/InteractivePrompts.d.ts +12 -0
- package/dist/ui/InteractivePrompts.d.ts.map +1 -1
- package/dist/ui/InteractivePrompts.js +12 -0
- package/dist/ui/InteractivePrompts.js.map +1 -1
- package/dist/utils/astParser.d.ts +15 -0
- package/dist/utils/astParser.d.ts.map +1 -1
- package/dist/utils/astParser.js +15 -0
- package/dist/utils/astParser.js.map +1 -1
- package/dist/utils/astUtils.d.ts +60 -0
- package/dist/utils/astUtils.d.ts.map +1 -1
- package/dist/utils/astUtils.js +350 -362
- package/dist/utils/astUtils.js.map +1 -1
- package/dist/utils/contentHash.d.ts +22 -0
- package/dist/utils/contentHash.d.ts.map +1 -0
- package/dist/utils/contentHash.js +26 -0
- package/dist/utils/contentHash.js.map +1 -0
- package/dist/utils/dependencyExtractor.d.ts +28 -0
- package/dist/utils/dependencyExtractor.d.ts.map +1 -1
- package/dist/utils/dependencyExtractor.js +28 -1
- package/dist/utils/dependencyExtractor.js.map +1 -1
- package/dist/utils/errorMessage.d.ts +10 -0
- package/dist/utils/errorMessage.d.ts.map +1 -0
- package/dist/utils/errorMessage.js +12 -0
- package/dist/utils/errorMessage.js.map +1 -0
- package/dist/utils/fileDiscovery.d.ts +61 -2
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +131 -23
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/dist/utils/reactDetection.d.ts +34 -5
- package/dist/utils/reactDetection.d.ts.map +1 -1
- package/dist/utils/reactDetection.js +73 -52
- package/dist/utils/reactDetection.js.map +1 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +1 -1
- package/dist/workers/auditWorker.js +7 -3
- package/dist/workers/auditWorker.js.map +1 -1
- package/examples/.auditrc.example.json +0 -8
- package/examples/.auditrc.json +0 -11
- package/examples/.code-auditor.json +0 -2
- package/examples/nextjs.auditrc.json +0 -8
- package/examples/node-api.auditrc.json +0 -7
- package/examples/react.auditrc.json +0 -6
- package/examples/tolerant-solid.auditrc.json +0 -5
- package/package.json +14 -8
- package/plugin/.claude-plugin/manifest.json +16 -0
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/hooks.json +6 -2
- package/plugin/scripts/hook-audit.sh +41 -14
- package/plugin/scripts/hook-common.sh +50 -5
- package/plugin/scripts/hook-drift-check.sh +72 -0
- package/plugin/scripts/hook-self-audit.sh +17 -12
- package/plugin/skills/code-auditor/SKILL.md +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,990 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Receiver root resolution — Spec 69 §10 S5e.
|
|
3
|
+
*
|
|
4
|
+
* cannot-fire keys to the *receiver's root resolution being inconclusive*, not
|
|
5
|
+
* to the callee's method name. Every query-candidate receiver resolves to a root
|
|
6
|
+
* identifier, and that root gets one of three dispositions:
|
|
7
|
+
*
|
|
8
|
+
* • `handle` — the root resolves to a DB handle (package import, DB-handle
|
|
9
|
+
* type annotation, wrapper class/function, or form-5 function
|
|
10
|
+
* return). The finding path extracts it; no coverage offset.
|
|
11
|
+
* • `not-handle` — the root resolves to something that is *definitively* not a
|
|
12
|
+
* DB handle: an ambient global (no binding anywhere in the
|
|
13
|
+
* file's scope chain), a literal / primitive / object / array
|
|
14
|
+
* declaration, a non-DB-typed parameter, or a non-DB
|
|
15
|
+
* constructor (`new URLSearchParams()`).
|
|
16
|
+
* `clean` is the *correct* outcome, not a silent one.
|
|
17
|
+
* • `unproven` — the root resolves to something genuinely undetermined: a
|
|
18
|
+
* `any`/`unknown` type, an un-annotated parameter, an
|
|
19
|
+
* un-annotated factory return, an unresolvable import, or an
|
|
20
|
+
* unrecognized bare-specifier package (Spec 70 R4 — not in the
|
|
21
|
+
* database-packages manifest). This is the cannot-fire surface
|
|
22
|
+
* (Spec 69 §10 S5a).
|
|
23
|
+
*
|
|
24
|
+
* There is NO identifier list on either side. A global is `not-handle` because it
|
|
25
|
+
* resolved to the global scope (no binding), not because it was enumerated; a
|
|
26
|
+
* name is `handle` because it resolved to a DB package/type/wrapper, not because
|
|
27
|
+
* it *looks* like `db`.
|
|
28
|
+
*/
|
|
29
|
+
import { isNodeBuiltin, isDbHandleTypeName, dbHandlePackagesForName, handleTypesForPackage, JS_GLOBALS } from './tsEcosystem.js';
|
|
30
|
+
// ── Binding extraction ───────────────────────────────────────────────────────
|
|
31
|
+
/** Node types that declare a name in the file scope (value and/or type). */
|
|
32
|
+
const VALUE_DECLARATION_TYPES = new Set([
|
|
33
|
+
'variable_declarator',
|
|
34
|
+
'required_parameter',
|
|
35
|
+
'optional_parameter',
|
|
36
|
+
'public_field_definition',
|
|
37
|
+
'function_declaration',
|
|
38
|
+
'method_definition',
|
|
39
|
+
'generator_function_declaration',
|
|
40
|
+
'class_declaration',
|
|
41
|
+
'abstract_class_declaration',
|
|
42
|
+
'interface_declaration',
|
|
43
|
+
'type_alias_declaration',
|
|
44
|
+
'enum_declaration',
|
|
45
|
+
]);
|
|
46
|
+
const FUNCTION_NAME_TYPES = new Set([
|
|
47
|
+
'function_declaration',
|
|
48
|
+
'method_definition',
|
|
49
|
+
'generator_function_declaration',
|
|
50
|
+
]);
|
|
51
|
+
const CLASS_NAME_TYPES = new Set([
|
|
52
|
+
'class_declaration',
|
|
53
|
+
'abstract_class_declaration',
|
|
54
|
+
]);
|
|
55
|
+
/** Node types that declare a *type-only* name (interface / type alias / enum) —
|
|
56
|
+
* a name that can appear in a type annotation but is not a runtime value, so a
|
|
57
|
+
* value reference to it is `unproven` and a same-named handle type is shadowed
|
|
58
|
+
* (Spec 70 criterion 9 — the type→package lookup must know the name is local). */
|
|
59
|
+
const TYPE_DECLARATION_TYPES = new Set([
|
|
60
|
+
'interface_declaration',
|
|
61
|
+
'type_alias_declaration',
|
|
62
|
+
'enum_declaration',
|
|
63
|
+
]);
|
|
64
|
+
/**
|
|
65
|
+
* Build the per-file binding environment: imports, variable/parameter/field
|
|
66
|
+
* declarations, and function/class declaration names.
|
|
67
|
+
*
|
|
68
|
+
* This is structural resolution — enumerating *what is actually bound in the
|
|
69
|
+
* file* — not a curated name list. A name is `not-handle` because it has no
|
|
70
|
+
* binding here (ambient global), never because it is on some list.
|
|
71
|
+
*
|
|
72
|
+
* @param ast the parsed file AST whose imports and declarations seed the map
|
|
73
|
+
* @param adapter the language adapter used to read node names and text
|
|
74
|
+
* @param sourceCode the file source text for reading node text
|
|
75
|
+
* @returns a name → binding map for every name bound in the file
|
|
76
|
+
*/
|
|
77
|
+
/** Node types that open a function scope (the nearest enclosing function a
|
|
78
|
+
* binding belongs to). Reused by `enclosingFunctionScope` below. */
|
|
79
|
+
const FUNCTION_SCOPE_TYPES = new Set([
|
|
80
|
+
'function_declaration',
|
|
81
|
+
'function_expression',
|
|
82
|
+
'arrow_function',
|
|
83
|
+
'method_definition',
|
|
84
|
+
]);
|
|
85
|
+
/** The binding's enclosing scope: the start byte offset (`range[0]`) of the
|
|
86
|
+
* enclosing function, or `0` for top-level. Two same-named bindings in
|
|
87
|
+
* different functions are distinct bindings, not a collision — the classifier
|
|
88
|
+
* keys on this when a reference's scope is known. A function/class/type
|
|
89
|
+
* declaration introduces its name into the *enclosing* scope, so the walk
|
|
90
|
+
* starts from its parent; a variable/parameter/field sits inside its scope
|
|
91
|
+
* directly. */
|
|
92
|
+
function enclosingFunctionScope(node, adapter) {
|
|
93
|
+
let current = FUNCTION_NAME_TYPES.has(node.type) || CLASS_NAME_TYPES.has(node.type) || TYPE_DECLARATION_TYPES.has(node.type)
|
|
94
|
+
? adapter.getParent(node)
|
|
95
|
+
: node;
|
|
96
|
+
while (current) {
|
|
97
|
+
if (FUNCTION_SCOPE_TYPES.has(current.type))
|
|
98
|
+
return current.range[0];
|
|
99
|
+
current = adapter.getParent(current);
|
|
100
|
+
}
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
/** Walk imports + value/type declarations and emit *every* binding with its
|
|
104
|
+
* enclosing scope — no name dedup. `buildBindingEnv` and
|
|
105
|
+
* `buildBindingScopeIndex` both reduce this list; it is the single source of
|
|
106
|
+
* truth so the flat map and the scope index cannot drift apart. */
|
|
107
|
+
function collectBindings(ast, adapter, sourceCode) {
|
|
108
|
+
const out = [];
|
|
109
|
+
for (const imp of adapter.extractImports(ast)) {
|
|
110
|
+
for (const spec of imp.specifiers) {
|
|
111
|
+
const name = spec.alias ?? spec.name;
|
|
112
|
+
if (!name || name === '*')
|
|
113
|
+
continue;
|
|
114
|
+
const importKind = spec.isDefault ? 'default' : spec.isNamespace ? 'namespace' : 'named';
|
|
115
|
+
out.push({ name, binding: { kind: 'import', source: imp.source, importKind, scope: 0 } });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const nodes = adapter.findNodes(ast, {
|
|
119
|
+
custom: (n) => VALUE_DECLARATION_TYPES.has(n.type),
|
|
120
|
+
});
|
|
121
|
+
for (const node of nodes) {
|
|
122
|
+
const scope = enclosingFunctionScope(node, adapter);
|
|
123
|
+
if (node.type === 'variable_declarator') {
|
|
124
|
+
for (const name of variableDeclaratorNames(node, adapter, sourceCode)) {
|
|
125
|
+
if (name)
|
|
126
|
+
out.push({ name, binding: { ...bindingFromDeclarator(node, adapter, sourceCode), scope } });
|
|
127
|
+
}
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (node.type === 'required_parameter' || node.type === 'optional_parameter') {
|
|
131
|
+
const name = parameterName(node, adapter, sourceCode);
|
|
132
|
+
if (name) {
|
|
133
|
+
out.push({
|
|
134
|
+
name,
|
|
135
|
+
binding: { kind: 'parameter', typeText: childTypeAnnotationText(node, adapter, sourceCode), scope },
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (node.type === 'public_field_definition') {
|
|
141
|
+
const name = fieldName(node, adapter, sourceCode);
|
|
142
|
+
if (name)
|
|
143
|
+
out.push({ name, binding: { ...bindingFromField(node, adapter, sourceCode), scope } });
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (FUNCTION_NAME_TYPES.has(node.type)) {
|
|
147
|
+
const name = adapter.getNodeName(node);
|
|
148
|
+
if (name)
|
|
149
|
+
out.push({ name, binding: { kind: 'function', scope } });
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (CLASS_NAME_TYPES.has(node.type)) {
|
|
153
|
+
const name = adapter.getNodeName(node);
|
|
154
|
+
if (name)
|
|
155
|
+
out.push({ name, binding: { kind: 'class', scope } });
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (TYPE_DECLARATION_TYPES.has(node.type)) {
|
|
159
|
+
const name = adapter.getNodeName(node);
|
|
160
|
+
if (name)
|
|
161
|
+
out.push({ name, binding: { kind: 'type', scope } });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
/** Collapse the full binding list into the flat name-keyed map — first wins
|
|
167
|
+
* (declaration order). This is the legacy `buildBindingEnv` the classifier
|
|
168
|
+
* reads when a reference's scope is unknown; the scope-aware `resolveBinding`
|
|
169
|
+
* prefers `buildBindingScopeIndex` and falls back here for an enclosing scope.
|
|
170
|
+
*
|
|
171
|
+
* @param ast the parsed file AST
|
|
172
|
+
* @param adapter the language adapter (imports + declaration walk)
|
|
173
|
+
* @param sourceCode the file source text
|
|
174
|
+
* @returns the flat name → first-wins binding map */
|
|
175
|
+
export function buildBindingEnv(ast, adapter, sourceCode) {
|
|
176
|
+
const bindings = new Map();
|
|
177
|
+
for (const { name, binding } of collectBindings(ast, adapter, sourceCode)) {
|
|
178
|
+
if (!bindings.has(name))
|
|
179
|
+
bindings.set(name, binding);
|
|
180
|
+
}
|
|
181
|
+
return bindings;
|
|
182
|
+
}
|
|
183
|
+
/** The scope-keyed binding index: name → (enclosing scope → binding), with *no*
|
|
184
|
+
* name collapse. The classifier's scope-aware lookup reads this to resolve a
|
|
185
|
+
* reference to the same-scoped binding when two same-named bindings live in
|
|
186
|
+
* different functions; a scope with no entry for the name falls back to the
|
|
187
|
+
* flat `buildBindingEnv` map (a same-name binding in an enclosing scope).
|
|
188
|
+
*
|
|
189
|
+
* @param ast the parsed file AST
|
|
190
|
+
* @param adapter the language adapter (imports + declaration walk)
|
|
191
|
+
* @param sourceCode the file source text
|
|
192
|
+
* @returns name → (enclosing scope → binding), no name collapse */
|
|
193
|
+
export function buildBindingScopeIndex(ast, adapter, sourceCode) {
|
|
194
|
+
const index = new Map();
|
|
195
|
+
for (const { name, binding } of collectBindings(ast, adapter, sourceCode)) {
|
|
196
|
+
const scope = binding.scope ?? 0;
|
|
197
|
+
let byScope = index.get(name);
|
|
198
|
+
if (!byScope) {
|
|
199
|
+
byScope = new Map();
|
|
200
|
+
index.set(name, byScope);
|
|
201
|
+
}
|
|
202
|
+
if (!byScope.has(scope))
|
|
203
|
+
byScope.set(scope, binding);
|
|
204
|
+
}
|
|
205
|
+
return index;
|
|
206
|
+
}
|
|
207
|
+
/** Resolve a reference to the binding in its scope: prefer the scope-keyed
|
|
208
|
+
* index's exact-scope entry, else fall back to the flat (name-keyed, first-wins)
|
|
209
|
+
* map. A reference with no `scope` (the legacy/bare callers) uses the flat map
|
|
210
|
+
* only — behavior unchanged. */
|
|
211
|
+
function resolveBinding(name, env, scope) {
|
|
212
|
+
if (scope !== undefined && env.bindingsByScope) {
|
|
213
|
+
const scoped = env.bindingsByScope.get(name)?.get(scope);
|
|
214
|
+
if (scoped)
|
|
215
|
+
return scoped;
|
|
216
|
+
}
|
|
217
|
+
return env.bindings.get(name);
|
|
218
|
+
}
|
|
219
|
+
function variableDeclaratorNames(node, adapter, sourceCode) {
|
|
220
|
+
const children = adapter.getChildren(node);
|
|
221
|
+
const nameNode = children.find((c) => c.type === 'identifier' || c.type === 'object_pattern' || c.type === 'array_pattern');
|
|
222
|
+
if (!nameNode)
|
|
223
|
+
return [];
|
|
224
|
+
if (nameNode.type === 'identifier')
|
|
225
|
+
return [adapter.getNodeText(nameNode, sourceCode) ?? ''];
|
|
226
|
+
const names = [];
|
|
227
|
+
collectPatternNames(nameNode, adapter, sourceCode, names);
|
|
228
|
+
return names;
|
|
229
|
+
}
|
|
230
|
+
function collectPatternNames(node, adapter, sourceCode, out) {
|
|
231
|
+
if (node.type === 'identifier') {
|
|
232
|
+
const name = adapter.getNodeText(node, sourceCode);
|
|
233
|
+
if (name)
|
|
234
|
+
out.push(name);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
for (const child of adapter.getChildren(node)) {
|
|
238
|
+
if ([':', '=', '{', '}', '[', ']', ','].includes(child.type))
|
|
239
|
+
continue;
|
|
240
|
+
collectPatternNames(child, adapter, sourceCode, out);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function parameterName(node, adapter, sourceCode) {
|
|
244
|
+
const id = adapter.getChildren(node).find((c) => c.type === 'identifier');
|
|
245
|
+
return id ? adapter.getNodeText(id, sourceCode) : null;
|
|
246
|
+
}
|
|
247
|
+
function fieldName(node, adapter, sourceCode) {
|
|
248
|
+
const id = adapter.getChildren(node).find((c) => c.type === 'property_identifier' || c.type === 'field_identifier');
|
|
249
|
+
return id ? adapter.getNodeText(id, sourceCode) : null;
|
|
250
|
+
}
|
|
251
|
+
function childTypeAnnotationText(node, adapter, sourceCode) {
|
|
252
|
+
const typeNode = adapter.getChildren(node).find((c) => c.type === 'type_annotation');
|
|
253
|
+
if (!typeNode)
|
|
254
|
+
return undefined;
|
|
255
|
+
return adapter.getNodeText(typeNode, sourceCode).trim();
|
|
256
|
+
}
|
|
257
|
+
function bindingFromDeclarator(node, adapter, sourceCode) {
|
|
258
|
+
const children = adapter.getChildren(node);
|
|
259
|
+
const typeNode = children.find((c) => c.type === 'type_annotation');
|
|
260
|
+
let valueNode;
|
|
261
|
+
let pastEquals = false;
|
|
262
|
+
for (const child of children) {
|
|
263
|
+
if (child.type === '=' || child.type === 'equals') {
|
|
264
|
+
pastEquals = true;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
if (child.type === ':' || child.type === 'type_annotation')
|
|
268
|
+
continue;
|
|
269
|
+
if (pastEquals || (!valueNode && child.type !== 'identifier' && child.type !== 'object_pattern' && child.type !== 'array_pattern')) {
|
|
270
|
+
valueNode = child;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
kind: 'variable',
|
|
276
|
+
typeText: typeNode ? adapter.getNodeText(typeNode, sourceCode).trim() : undefined,
|
|
277
|
+
value: valueNode ? describeValue(valueNode, adapter, sourceCode) : undefined,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function bindingFromField(node, adapter, sourceCode) {
|
|
281
|
+
const children = adapter.getChildren(node);
|
|
282
|
+
const typeNode = children.find((c) => c.type === 'type_annotation');
|
|
283
|
+
const valueNode = children.find((c) => c.type !== 'property_identifier' &&
|
|
284
|
+
c.type !== 'field_identifier' &&
|
|
285
|
+
c.type !== 'decorator' &&
|
|
286
|
+
c.type !== 'accessibility_modifier' &&
|
|
287
|
+
c.type !== 'private' &&
|
|
288
|
+
c.type !== 'public' &&
|
|
289
|
+
c.type !== 'protected' &&
|
|
290
|
+
c.type !== 'static' &&
|
|
291
|
+
c.type !== 'readonly' &&
|
|
292
|
+
c.type !== 'abstract' &&
|
|
293
|
+
c.type !== 'type_annotation');
|
|
294
|
+
return {
|
|
295
|
+
kind: 'field',
|
|
296
|
+
typeText: typeNode ? adapter.getNodeText(typeNode, sourceCode).trim() : undefined,
|
|
297
|
+
value: valueNode ? describeValue(valueNode, adapter, sourceCode) : undefined,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Extract interface and type-alias field-type maps (`Env → { DB: 'D1Database' }`)
|
|
302
|
+
* for the member-chain resolution arm (Spec 70 decision B3). Walks
|
|
303
|
+
* `interface_declaration` bodies (`interface_body`) and `type_alias_declaration`
|
|
304
|
+
* object-literal bodies (`object_type`) for `property_signature` nodes, mapping
|
|
305
|
+
* each declared field name to its type text. A name with a body but no typed
|
|
306
|
+
* fields still yields a (possibly empty) entry — the entry's presence tells
|
|
307
|
+
* {@link classifyMemberPath} the name is a *known* interface, so an unknown
|
|
308
|
+
* field cannot-fire rather than falls back to the bare type name.
|
|
309
|
+
*
|
|
310
|
+
* @param ast the parsed file AST to walk for interface/type-alias declarations
|
|
311
|
+
* @param adapter the language adapter used to find and read declaration nodes
|
|
312
|
+
* @param sourceCode the file source text for reading node text
|
|
313
|
+
* @returns a name → field-name → type-text map for every interface/type alias
|
|
314
|
+
*/
|
|
315
|
+
export function extractInterfaceFields(ast, adapter, sourceCode) {
|
|
316
|
+
const fields = new Map();
|
|
317
|
+
const decls = adapter.findNodes(ast, {
|
|
318
|
+
custom: (n) => n.type === 'interface_declaration' ||
|
|
319
|
+
(n.type === 'type_alias_declaration' &&
|
|
320
|
+
adapter.getChildren(n).some((c) => c.type === 'object_type')),
|
|
321
|
+
});
|
|
322
|
+
for (const decl of decls) {
|
|
323
|
+
const nameNode = adapter.getChildren(decl).find((c) => c.type === 'type_identifier');
|
|
324
|
+
const name = nameNode ? adapter.getNodeText(nameNode, sourceCode) : null;
|
|
325
|
+
if (!name)
|
|
326
|
+
continue;
|
|
327
|
+
const body = adapter
|
|
328
|
+
.getChildren(decl)
|
|
329
|
+
.find((c) => c.type === 'interface_body' || c.type === 'object_type');
|
|
330
|
+
if (!body)
|
|
331
|
+
continue;
|
|
332
|
+
let fieldMap = fields.get(name);
|
|
333
|
+
if (!fieldMap) {
|
|
334
|
+
fieldMap = new Map();
|
|
335
|
+
fields.set(name, fieldMap);
|
|
336
|
+
}
|
|
337
|
+
for (const sig of adapter.getChildren(body)) {
|
|
338
|
+
if (sig.type !== 'property_signature')
|
|
339
|
+
continue;
|
|
340
|
+
const fieldNameNode = adapter.getChildren(sig).find((c) => c.type === 'property_identifier');
|
|
341
|
+
const fieldName = fieldNameNode ? adapter.getNodeText(fieldNameNode, sourceCode) : null;
|
|
342
|
+
if (!fieldName)
|
|
343
|
+
continue;
|
|
344
|
+
const typeText = propertySignatureFieldType(sig, adapter, sourceCode);
|
|
345
|
+
if (typeText === undefined)
|
|
346
|
+
continue;
|
|
347
|
+
if (!fieldMap.has(fieldName))
|
|
348
|
+
fieldMap.set(fieldName, typeText);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return fields;
|
|
352
|
+
}
|
|
353
|
+
/** Read a `property_signature`'s type text, stripping the annotation's `:`. */
|
|
354
|
+
function propertySignatureFieldType(node, adapter, sourceCode) {
|
|
355
|
+
const typeAnn = adapter.getChildren(node).find((c) => c.type === 'type_annotation');
|
|
356
|
+
if (!typeAnn)
|
|
357
|
+
return undefined;
|
|
358
|
+
const typeNode = adapter.getChildren(typeAnn).find((c) => c.type !== ':');
|
|
359
|
+
if (typeNode) {
|
|
360
|
+
const text = adapter.getNodeText(typeNode, sourceCode);
|
|
361
|
+
if (text)
|
|
362
|
+
return text.trim();
|
|
363
|
+
}
|
|
364
|
+
const raw = adapter.getNodeText(typeAnn, sourceCode);
|
|
365
|
+
return raw ? raw.trim().replace(/^:\s*/, '') : undefined;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Extract a serializable {@link ValueDescriptor} from a value/initializer
|
|
369
|
+
* expression node, mirroring {@link classifyValue}'s structural dispatch exactly
|
|
370
|
+
* but extracting names/structure instead of classifying. The descriptor lets a
|
|
371
|
+
* binding outlive its file's AST; classification is deferred to
|
|
372
|
+
* {@link classifyValue} at the point of use, where the file's provenance and
|
|
373
|
+
* bindings are known.
|
|
374
|
+
*/
|
|
375
|
+
function describeValue(node, adapter, sourceCode) {
|
|
376
|
+
const { type } = node;
|
|
377
|
+
if (NON_HANDLE_VALUE_TYPES.has(type))
|
|
378
|
+
return { kind: 'literal' };
|
|
379
|
+
if (type === 'identifier')
|
|
380
|
+
return { kind: 'identifier', name: adapter.getNodeText(node, sourceCode) ?? '' };
|
|
381
|
+
if (type === 'await_expression' || type === 'parenthesized_expression' || type === 'binary_expression' || type === 'ternary_expression') {
|
|
382
|
+
for (const child of adapter.getChildren(node)) {
|
|
383
|
+
if (type === 'await_expression' && child.type === 'await')
|
|
384
|
+
continue;
|
|
385
|
+
if (type === 'parenthesized_expression' && (child.type === '(' || child.type === ')'))
|
|
386
|
+
continue;
|
|
387
|
+
if ((type === 'binary_expression' || type === 'ternary_expression') && isPunctuation(child.type))
|
|
388
|
+
continue;
|
|
389
|
+
return { kind: 'unwrap', operand: describeValue(child, adapter, sourceCode) };
|
|
390
|
+
}
|
|
391
|
+
return { kind: 'unwrap', operand: null };
|
|
392
|
+
}
|
|
393
|
+
if (type === 'new_expression') {
|
|
394
|
+
const ctor = findChildOfType(node, ['identifier', 'member_expression']);
|
|
395
|
+
const ctorName = ctor ? extractIdentifierName(ctor, adapter, sourceCode) : null;
|
|
396
|
+
return { kind: 'new', ctorName };
|
|
397
|
+
}
|
|
398
|
+
if (type === 'call_expression') {
|
|
399
|
+
const callee = getCallExpressionCallee(node, adapter);
|
|
400
|
+
if (callee?.type === 'identifier') {
|
|
401
|
+
return { kind: 'call', calleeKind: 'identifier', calleeName: adapter.getNodeText(callee, sourceCode) ?? '', receiverRoot: null };
|
|
402
|
+
}
|
|
403
|
+
if (callee && (callee.type === 'member_expression' || callee.type === 'selector_expression')) {
|
|
404
|
+
return { kind: 'call', calleeKind: 'member', calleeName: null, receiverRoot: resolveReceiverRoot(callee, adapter, sourceCode) };
|
|
405
|
+
}
|
|
406
|
+
return { kind: 'call', calleeKind: 'other', calleeName: null, receiverRoot: null };
|
|
407
|
+
}
|
|
408
|
+
if (type === 'member_expression' || type === 'selector_expression') {
|
|
409
|
+
return { kind: 'member', root: resolveReceiverRoot(node, adapter, sourceCode) };
|
|
410
|
+
}
|
|
411
|
+
if (type === 'as_expression' || type === 'satisfies_expression') {
|
|
412
|
+
const children = adapter.getChildren(node);
|
|
413
|
+
const typeNode = children.find((c) => c.type === 'type_annotation' || c.type === 'predefined_type');
|
|
414
|
+
if (typeNode) {
|
|
415
|
+
return { kind: 'as', typeText: adapter.getNodeText(typeNode, sourceCode), operand: null };
|
|
416
|
+
}
|
|
417
|
+
const operand = children.find((c) => c.type !== 'as' && c.type !== 'satisfies');
|
|
418
|
+
if (operand && operand !== node)
|
|
419
|
+
return { kind: 'as', typeText: null, operand: describeValue(operand, adapter, sourceCode) };
|
|
420
|
+
return { kind: 'as', typeText: null, operand: null };
|
|
421
|
+
}
|
|
422
|
+
if (type === 'arrow_function' || type === 'function_expression' || type === 'function') {
|
|
423
|
+
return { kind: 'function' };
|
|
424
|
+
}
|
|
425
|
+
return { kind: 'other' };
|
|
426
|
+
}
|
|
427
|
+
// ── Classification ───────────────────────────────────────────────────────────
|
|
428
|
+
const NON_HANDLE_VALUE_TYPES = new Set([
|
|
429
|
+
'string',
|
|
430
|
+
'string_fragment',
|
|
431
|
+
'template_string',
|
|
432
|
+
'number',
|
|
433
|
+
'object',
|
|
434
|
+
'array',
|
|
435
|
+
'true',
|
|
436
|
+
'false',
|
|
437
|
+
'null',
|
|
438
|
+
'undefined',
|
|
439
|
+
'regex',
|
|
440
|
+
'bigint',
|
|
441
|
+
]);
|
|
442
|
+
const NON_HANDLE_PRIMITIVES = new Set([
|
|
443
|
+
'string',
|
|
444
|
+
'number',
|
|
445
|
+
'boolean',
|
|
446
|
+
'bigint',
|
|
447
|
+
'symbol',
|
|
448
|
+
'void',
|
|
449
|
+
'null',
|
|
450
|
+
'undefined',
|
|
451
|
+
'never',
|
|
452
|
+
]);
|
|
453
|
+
/**
|
|
454
|
+
* Classify a bare root identifier's disposition under the file's resolution env.
|
|
455
|
+
*
|
|
456
|
+
* @param name the bare root identifier to classify
|
|
457
|
+
* @param env the file's resolution environment (provenance, bindings, adapter)
|
|
458
|
+
* @param depth recursion guard; classification gives up past depth 8
|
|
459
|
+
* @param opts `thisField` marks the name as a `this.<field>` reference;
|
|
460
|
+
* `memberPath` is the receiver's member chain after the root
|
|
461
|
+
* (e.g. `env.DB.prepare` → `['DB']`), resolved through the root's
|
|
462
|
+
* interface field types when present (Spec 70 decision B3)
|
|
463
|
+
* @returns `handle`, `not-handle`, or `unproven`
|
|
464
|
+
*/
|
|
465
|
+
export function classifyRootIdentifier(name, env, depth = 0, opts) {
|
|
466
|
+
if (!name)
|
|
467
|
+
return 'unproven';
|
|
468
|
+
// A provenanced name is a DB handle — except a `this.<name>` reference to a
|
|
469
|
+
// *wrapper* (a function/method whose body does DB work). Wrapper evidence
|
|
470
|
+
// describes the method's own body, not the receiver `this.<method>`: a method
|
|
471
|
+
// name is not evidence (the method-name proof this path removed lists for).
|
|
472
|
+
// A package-import / sql-argument / binding seed still proves a `this.<field>`
|
|
473
|
+
// handle (`this.env`, `this.db`), and those reasons are not `wrapper`, so they
|
|
474
|
+
// keep short-circuiting here. This must stay *before* the binding lookup.
|
|
475
|
+
const evidence = env.provenance.get(name);
|
|
476
|
+
if (evidence && !(opts?.thisField && evidence.reason === 'wrapper'))
|
|
477
|
+
return 'handle';
|
|
478
|
+
if (depth > 8)
|
|
479
|
+
return 'unproven';
|
|
480
|
+
// Form-3 heritage (Spec 70 Q3, Item 1): a `this.<field>` reference resolves to
|
|
481
|
+
// the enclosing class's base-class field type (`extends WorkflowEntrypoint<Env>`
|
|
482
|
+
// → `this.env` is `Env`), then through the member path by the same
|
|
483
|
+
// interface-field seam as B3. The base class is resolved *to its declaration*
|
|
484
|
+
// in the project's declared dependencies' `.d.ts` via `env.resolveHeritageField`
|
|
485
|
+
// — never a bundled name map. This runs *before* the binding lookup — the
|
|
486
|
+
// heritage contract is authoritative, and a same-named local binding is a
|
|
487
|
+
// shadow, not the field's type. No heritage (`thisHeritage` null), no resolver,
|
|
488
|
+
// or an unresolvable declaration all fall through to `unproven` (abstain,
|
|
489
|
+
// never a guess from the class merely having a generic parameter).
|
|
490
|
+
if (opts?.thisField && opts.thisHeritage && env.resolveHeritageField) {
|
|
491
|
+
const { base, args } = splitHeritage(opts.thisHeritage);
|
|
492
|
+
const fieldType = env.resolveHeritageField(base, name, args);
|
|
493
|
+
if (fieldType !== null) {
|
|
494
|
+
return classifyTypeOrMember(fieldType, opts.memberPath, env, depth + 1);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
const binding = resolveBinding(name, env, opts?.scope);
|
|
498
|
+
if (!binding) {
|
|
499
|
+
// A bare unbound name is an ambient global → not-handle. An undeclared
|
|
500
|
+
// `this.<field>` is a dynamic/unseen field → unproven (the caller passes
|
|
501
|
+
// `thisField` when the receiver chain bottoms out at `this`/`super`).
|
|
502
|
+
return opts?.thisField ? 'unproven' : 'not-handle';
|
|
503
|
+
}
|
|
504
|
+
if (opts?.thisField && binding.kind !== 'field') {
|
|
505
|
+
// `this.<field>` is a field reference, never a local name. A parameter,
|
|
506
|
+
// variable, import, function, or class of the same name is a *shadow*, not
|
|
507
|
+
// the field's type — consulting it would let `env`/`ctx`/`state` resolve to
|
|
508
|
+
// a local's disposition instead of the field. Leave it unproven: a plain
|
|
509
|
+
// unresolvable field stays cannot-fire rather than clean.
|
|
510
|
+
return 'unproven';
|
|
511
|
+
}
|
|
512
|
+
switch (binding.kind) {
|
|
513
|
+
case 'import':
|
|
514
|
+
return classifyImportSource(binding.source ?? '', name, binding.importKind, env);
|
|
515
|
+
case 'variable':
|
|
516
|
+
case 'field':
|
|
517
|
+
if (binding.typeText)
|
|
518
|
+
return classifyTypeOrMember(binding.typeText, opts?.memberPath, env, depth);
|
|
519
|
+
if (binding.value)
|
|
520
|
+
return classifyValue(binding.value, env, depth);
|
|
521
|
+
return 'unproven';
|
|
522
|
+
case 'parameter':
|
|
523
|
+
if (binding.typeText)
|
|
524
|
+
return classifyTypeOrMember(binding.typeText, opts?.memberPath, env, depth);
|
|
525
|
+
return 'unproven';
|
|
526
|
+
case 'function':
|
|
527
|
+
case 'class':
|
|
528
|
+
case 'type':
|
|
529
|
+
return 'unproven';
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Classify a typed binding, resolving a member chain through interface field
|
|
534
|
+
* types when one is supplied (Spec 70 decision B3). With no member path this is
|
|
535
|
+
* the plain type-text classification.
|
|
536
|
+
*/
|
|
537
|
+
function classifyTypeOrMember(typeText, memberPath, env, depth) {
|
|
538
|
+
if (memberPath && memberPath.length > 0) {
|
|
539
|
+
return classifyMemberPath(typeText, memberPath, env, depth);
|
|
540
|
+
}
|
|
541
|
+
return classifyTypeText(typeText, env, depth);
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Resolve a member receiver through its interface / type-alias field types
|
|
545
|
+
* (Spec 70 decision B3): `env.DB` where `env` is typed `Env` and
|
|
546
|
+
* `interface Env { DB: D1Database }` resolves `DB` → `D1Database` → handle.
|
|
547
|
+
* Each step looks up the head member's declared field type in
|
|
548
|
+
* `env.interfaceFields` and recurses on the remaining path; the final field
|
|
549
|
+
* type is classified by the ordinary type-text rules. A field absent from the
|
|
550
|
+
* known interface (or a type name with no known fields) cannot-fire — the
|
|
551
|
+
* member is not a declared DB field, never a guessed clean.
|
|
552
|
+
*/
|
|
553
|
+
function classifyMemberPath(typeText, memberPath, env, depth) {
|
|
554
|
+
const fields = env.interfaceFields;
|
|
555
|
+
if (!fields || memberPath.length === 0)
|
|
556
|
+
return classifyTypeText(typeText, env, depth);
|
|
557
|
+
const base = baseTypeName(typeText);
|
|
558
|
+
const iface = fields.get(base);
|
|
559
|
+
if (!iface)
|
|
560
|
+
return classifyTypeText(typeText, env, depth);
|
|
561
|
+
const [head, ...rest] = memberPath;
|
|
562
|
+
const fieldType = iface.get(head);
|
|
563
|
+
if (fieldType === undefined)
|
|
564
|
+
return 'unproven';
|
|
565
|
+
if (rest.length === 0)
|
|
566
|
+
return classifyTypeText(fieldType, env, depth + 1);
|
|
567
|
+
return classifyMemberPath(fieldType, rest, env, depth + 1);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Derive the receiver's member path after the root from the site strings (Spec 70
|
|
571
|
+
* decision B3). `receiver` is the member-chain text left of the method (`env.DB`
|
|
572
|
+
* for `env.DB.prepare`); `root` is its leftmost identifier (`env`); the path is
|
|
573
|
+
* the non-root segments (`['DB']`). A `this`/`super`-rooted receiver has no
|
|
574
|
+
* resolvable member path (its `thisField` guard already leaves it unproven), and
|
|
575
|
+
* any segment that is not a plain identifier (a method name, an index, a call
|
|
576
|
+
* result) is dropped to empty — only declared interface fields are resolvable.
|
|
577
|
+
*
|
|
578
|
+
* @param root the receiver's leftmost identifier
|
|
579
|
+
* @param receiver the member-chain text left of the method
|
|
580
|
+
* @param thisField true when the receiver is a `this`/`super` field
|
|
581
|
+
* @returns the non-root member-path segments, or an empty array when not resolvable
|
|
582
|
+
*/
|
|
583
|
+
export function deriveMemberPath(root, receiver, thisField) {
|
|
584
|
+
if (thisField || !root || !receiver.startsWith(root))
|
|
585
|
+
return [];
|
|
586
|
+
const rest = receiver.slice(root.length).replace(/^[.\s]+/, '');
|
|
587
|
+
if (!rest)
|
|
588
|
+
return [];
|
|
589
|
+
const parts = rest.split('.').map((p) => p.trim()).filter((p) => p.length > 0);
|
|
590
|
+
if (parts.length === 0 || parts.some((p) => !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(p)))
|
|
591
|
+
return [];
|
|
592
|
+
return parts;
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Derive the member path after the root for a `this`/`super`-rooted receiver
|
|
596
|
+
* (Spec 70 Q3): `this.env.DB` → root `env`, path `['DB']`. Unlike
|
|
597
|
+
* {@link deriveMemberPath} (which returns `[]` for a `this`-rooted receiver), the
|
|
598
|
+
* `this.`/`super.` prefix is stripped first so the root's member chain is
|
|
599
|
+
* recoverable — it resolves through the root's base-class field type (`this.env`
|
|
600
|
+
* is `Env`) and then the same interface-field seam as B3.
|
|
601
|
+
*
|
|
602
|
+
* @param root the receiver's leftmost identifier (after the `this.`/`super.` strip)
|
|
603
|
+
* @param receiver the member-chain text left of the method
|
|
604
|
+
* @returns the member-path segments after the root, or an empty array when not resolvable
|
|
605
|
+
*/
|
|
606
|
+
export function deriveThisMemberPath(root, receiver) {
|
|
607
|
+
if (!root || !receiver)
|
|
608
|
+
return [];
|
|
609
|
+
const t = receiver.trim().replace(/^(?:this|super)\./, '');
|
|
610
|
+
if (!t.startsWith(root))
|
|
611
|
+
return [];
|
|
612
|
+
const rest = t.slice(root.length).replace(/^[.\s]+/, '');
|
|
613
|
+
if (!rest)
|
|
614
|
+
return [];
|
|
615
|
+
const parts = rest.split('.').map((p) => p.trim()).filter((p) => p.length > 0);
|
|
616
|
+
if (parts.length === 0 || parts.some((p) => !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(p)))
|
|
617
|
+
return [];
|
|
618
|
+
return parts;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* True when a receiver root is DB-shaped — its disposition is `handle` or
|
|
622
|
+
* `unproven` — never a name list. This is the package-discriminant replacement
|
|
623
|
+
* for the deleted `DB_CALL_METHODS` / `isDbShapedMethod` candidacy filters: a
|
|
624
|
+
* call is a DB/ORM candidate when its receiver resolves to a DB package/handle
|
|
625
|
+
* or to something unresolved, and NOT when it resolves to a provably non-DB
|
|
626
|
+
* receiver (a JS global, primitive, or Node builtin). `join` is
|
|
627
|
+
* `Array.prototype.join` (root `Array` → not-handle) and also `SQL JOIN`
|
|
628
|
+
* (root `db` → handle) — the receiver's resolution, not the method name,
|
|
629
|
+
* distinguishes them.
|
|
630
|
+
*
|
|
631
|
+
* @param root the bare receiver-root identifier to classify
|
|
632
|
+
* @param env the file's resolution environment (provenance, bindings, adapter)
|
|
633
|
+
* @returns true unless the root provably resolves to a non-DB receiver
|
|
634
|
+
*/
|
|
635
|
+
export function isDbShapedRoot(root, env, opts) {
|
|
636
|
+
return classifyRootIdentifier(root, env, 0, opts) !== 'not-handle';
|
|
637
|
+
}
|
|
638
|
+
function classifyImportSource(source, name, importKind, env) {
|
|
639
|
+
// One seam (Spec 70 B1): every specifier kind — relative, tsconfig-`paths`
|
|
640
|
+
// alias, bare (tsconfig-`paths` → in-repo, else node_modules vendor `.d.ts`),
|
|
641
|
+
// and the `@/`/`~/` fallback — answers through `resolveImport`. An in-repo
|
|
642
|
+
// resolution means the name's origin is a project file whose export chain is
|
|
643
|
+
// not walked here, so the name's DB-handle status is unknown → `unproven`
|
|
644
|
+
// (never the old `not-handle`, which claimed to have proven a re-exported
|
|
645
|
+
// handle is clean). Absent a resolver, relative/alias still abstain below.
|
|
646
|
+
const resolved = env.resolveImport?.(source);
|
|
647
|
+
if (resolved?.kind === 'in-repo') {
|
|
648
|
+
env.importResolutionReason = `resolves to in-repo file \`${resolved.path}\` whose export chain is not walked here`;
|
|
649
|
+
return 'unproven';
|
|
650
|
+
}
|
|
651
|
+
// A bare specifier that did not land in-repo → node_modules or a Node builtin.
|
|
652
|
+
// A Node builtin (`fs`, `node:path`, …) is provably not a DB client →
|
|
653
|
+
// `not-handle`. A manifest DB package resolves by import kind: a
|
|
654
|
+
// default/namespace import is the package's handle (its local name is
|
|
655
|
+
// arbitrary — `import mysql from 'mysql2/promise'`), while a *named* import is
|
|
656
|
+
// a handle only when the manifest lists its name — `import { eq } from
|
|
657
|
+
// 'drizzle-orm'` is provably NOT a handle, `import { Pool } from 'pg'` is. An
|
|
658
|
+
// unrecognized package reached by resolution reports cannot-fire (Spec 70 R4),
|
|
659
|
+
// never a guessed clean.
|
|
660
|
+
if (isNodeBuiltin(source))
|
|
661
|
+
return 'not-handle';
|
|
662
|
+
const handles = handleTypesForPackage(source);
|
|
663
|
+
if (handles) {
|
|
664
|
+
if (importKind === 'default' || importKind === 'namespace')
|
|
665
|
+
return 'handle';
|
|
666
|
+
return handles.has(name) ? 'handle' : 'not-handle';
|
|
667
|
+
}
|
|
668
|
+
// A bare specifier that resolved to neither an in-repo file, a node_modules
|
|
669
|
+
// declaration, a Node builtin, nor a manifest DB package names no module in
|
|
670
|
+
// this tree. That is the honest cannot-fire case — a codegen token
|
|
671
|
+
// (`__prismaFolder__`), a build-step alias (blitz `db`), or a genuinely absent
|
|
672
|
+
// module all resolve to nothing here, and guessing a target from the name would
|
|
673
|
+
// be a fabrication (Spec 70 B1). Only when a resolver was threaded and answered
|
|
674
|
+
// `unresolved` do we say this; without a resolver (Go, bare-root callers) the
|
|
675
|
+
// fallback reason below is the conservative "unrecognized package".
|
|
676
|
+
if (resolved?.kind === 'unresolved') {
|
|
677
|
+
env.importResolutionReason = `imports from \`${source}\`, which names no module in this tree (no in-repo file reachable from the specifier, no node_modules declaration)`;
|
|
678
|
+
return 'unproven';
|
|
679
|
+
}
|
|
680
|
+
return 'unproven';
|
|
681
|
+
}
|
|
682
|
+
function classifyTypeText(typeText, env, depth) {
|
|
683
|
+
const t = typeText.trim();
|
|
684
|
+
const unionParts = splitTopLevel(t, '|');
|
|
685
|
+
const interParts = splitTopLevel(t, '&');
|
|
686
|
+
if (unionParts.length > 1 || interParts.length > 1) {
|
|
687
|
+
const parts = unionParts.length > 1 ? unionParts : interParts;
|
|
688
|
+
const dispositions = parts.map((p) => classifyTypeText(p, env, depth + 1));
|
|
689
|
+
if (dispositions.some((d) => d === 'handle'))
|
|
690
|
+
return 'handle';
|
|
691
|
+
if (dispositions.every((d) => d === 'not-handle'))
|
|
692
|
+
return 'not-handle';
|
|
693
|
+
return 'unproven';
|
|
694
|
+
}
|
|
695
|
+
const base = baseTypeName(t);
|
|
696
|
+
if (base === 'any' || base === 'unknown')
|
|
697
|
+
return 'unproven';
|
|
698
|
+
if (NON_HANDLE_PRIMITIVES.has(base))
|
|
699
|
+
return 'not-handle';
|
|
700
|
+
if (/\[\]$/.test(t) || /^ReadonlyArray</.test(t) || /^Array</.test(t))
|
|
701
|
+
return 'not-handle';
|
|
702
|
+
// A JS builtin global type (`Map`, `Set`, `Buffer`, `Date`, `Promise`, `String`,
|
|
703
|
+
// …) is provably not a DB handle — the global object's own names, enumerated at
|
|
704
|
+
// load, never a hand-written list.
|
|
705
|
+
if (JS_GLOBALS.has(base))
|
|
706
|
+
return 'not-handle';
|
|
707
|
+
// Resolve a handle-candidate type name to its *origin* before consulting the
|
|
708
|
+
// manifest (Spec 70 criterion 9 — the lookup keys on package AND type). A bare
|
|
709
|
+
// name match against the flattened handle-name set would credit a project's own
|
|
710
|
+
// unrelated `D1Database` declaration or an import from a non-DB package, so ask
|
|
711
|
+
// where the name came from first:
|
|
712
|
+
// · an import resolves through its package's handle list in the manifest;
|
|
713
|
+
// · a local type declaration (class/interface/type-alias/enum) shadows the
|
|
714
|
+
// ambient manifest name — it is not the DB handle;
|
|
715
|
+
// · only an *ambient* (unbound) name falls through to the name match, which
|
|
716
|
+
// is what a Workers `D1Database` without an import relies on (the type is
|
|
717
|
+
// injected by `@cloudflare/workers-types` via tsconfig `types`).
|
|
718
|
+
const binding = env.bindings.get(base);
|
|
719
|
+
if (binding) {
|
|
720
|
+
if (binding.kind === 'import') {
|
|
721
|
+
const handles = handleTypesForPackage(binding.source ?? '');
|
|
722
|
+
if (handles?.has(base))
|
|
723
|
+
return 'handle';
|
|
724
|
+
// Imported from a non-manifest package, or a non-handle name from a DB
|
|
725
|
+
// package (`KVNamespace` from `@cloudflare/workers-types`) — cannot-fire,
|
|
726
|
+
// never a guessed clean.
|
|
727
|
+
return 'unproven';
|
|
728
|
+
}
|
|
729
|
+
if (binding.kind === 'class' || binding.kind === 'type') {
|
|
730
|
+
// A local class/interface/type-alias/enum of this name shadows the ambient
|
|
731
|
+
// manifest type — it is not the DB handle.
|
|
732
|
+
return 'unproven';
|
|
733
|
+
}
|
|
734
|
+
// variable / parameter / field / function bind only a *value*, not a type,
|
|
735
|
+
// so a type annotation naming one still refers to the ambient type.
|
|
736
|
+
}
|
|
737
|
+
if (isDbHandleTypeName(base)) {
|
|
738
|
+
// The ambient arm (Spec 70 criterion 9, Item 3): an unbound handle-type name
|
|
739
|
+
// is credited only when a manifest package that declares it is a declared
|
|
740
|
+
// dependency of the project (package.json deps/devDeps or tsconfig `types`).
|
|
741
|
+
// Otherwise the name resolved to nothing — cannot-fire, never a guessed
|
|
742
|
+
// clean — and the cause is recorded for `resolveRoot`'s reason.
|
|
743
|
+
const declaring = dbHandlePackagesForName(base);
|
|
744
|
+
const declared = env.declaredTypePackages;
|
|
745
|
+
if (declaring && declared && [...declaring].some((pkg) => declared.has(pkg))) {
|
|
746
|
+
return 'handle';
|
|
747
|
+
}
|
|
748
|
+
env.ambientRejectionReason = `type \`${base}\` resolves to nothing (its declaring package is not a declared dependency)`;
|
|
749
|
+
return 'unproven';
|
|
750
|
+
}
|
|
751
|
+
return 'unproven';
|
|
752
|
+
}
|
|
753
|
+
function baseTypeName(typeText) {
|
|
754
|
+
let t = typeText.trim();
|
|
755
|
+
if (t.startsWith(':'))
|
|
756
|
+
t = t.slice(1).trim();
|
|
757
|
+
if (t.startsWith('typeof '))
|
|
758
|
+
t = t.slice('typeof '.length).trim();
|
|
759
|
+
if (t.startsWith('keyof '))
|
|
760
|
+
t = t.slice('keyof '.length).trim();
|
|
761
|
+
const lt = t.indexOf('<');
|
|
762
|
+
if (lt > 0 && t.endsWith('>'))
|
|
763
|
+
t = t.slice(0, lt).trim();
|
|
764
|
+
return t;
|
|
765
|
+
}
|
|
766
|
+
function splitTopLevel(text, sep) {
|
|
767
|
+
const parts = [];
|
|
768
|
+
let depth = 0;
|
|
769
|
+
let current = '';
|
|
770
|
+
for (const ch of text) {
|
|
771
|
+
if (ch === '<' || ch === '(' || ch === '[' || ch === '{')
|
|
772
|
+
depth++;
|
|
773
|
+
if (ch === '>' || ch === ')' || ch === ']' || ch === '}')
|
|
774
|
+
depth--;
|
|
775
|
+
if (ch === sep && depth === 0) {
|
|
776
|
+
parts.push(current.trim());
|
|
777
|
+
current = '';
|
|
778
|
+
continue;
|
|
779
|
+
}
|
|
780
|
+
current += ch;
|
|
781
|
+
}
|
|
782
|
+
if (current.trim())
|
|
783
|
+
parts.push(current.trim());
|
|
784
|
+
return parts;
|
|
785
|
+
}
|
|
786
|
+
function classifyValue(value, env, depth) {
|
|
787
|
+
switch (value.kind) {
|
|
788
|
+
case 'literal':
|
|
789
|
+
case 'function':
|
|
790
|
+
return 'not-handle';
|
|
791
|
+
case 'identifier':
|
|
792
|
+
return classifyRootIdentifier(value.name, env, depth + 1);
|
|
793
|
+
case 'new':
|
|
794
|
+
if (value.ctorName)
|
|
795
|
+
return classifyRootIdentifier(value.ctorName, env, depth + 1);
|
|
796
|
+
return 'unproven';
|
|
797
|
+
case 'call':
|
|
798
|
+
if (value.calleeKind === 'identifier') {
|
|
799
|
+
const name = value.calleeName ?? '';
|
|
800
|
+
// A provenanced factory name yields a handle when called: the provenance
|
|
801
|
+
// already established the name as a handle-shaped value, and calling it
|
|
802
|
+
// produces a handle (`resolveHero`, a wrapper that queries in a loop).
|
|
803
|
+
if (env.provenance.has(name))
|
|
804
|
+
return 'handle';
|
|
805
|
+
// A *declared* factory name that resolves non-handle (an import from a
|
|
806
|
+
// non-DB package, a variable typed as a non-handle) proves the return is
|
|
807
|
+
// non-handle: `const $ = load(html)` with `load` from `cheerio`. A truly
|
|
808
|
+
// *unbound* factory name is NOT proof of non-handle — `getConnection()`
|
|
809
|
+
// might return a connection — so only accept not-handle for a name that has
|
|
810
|
+
// a binding in scope.
|
|
811
|
+
const disp = classifyRootIdentifier(name, env, depth + 1);
|
|
812
|
+
if (disp === 'not-handle' && env.bindings.has(name))
|
|
813
|
+
return 'not-handle';
|
|
814
|
+
return 'unproven';
|
|
815
|
+
}
|
|
816
|
+
if (value.calleeKind === 'member') {
|
|
817
|
+
const root = value.receiverRoot;
|
|
818
|
+
// A method call on a *provably non-DB* root is itself non-DB: `cheerio.load()`,
|
|
819
|
+
// `JSON.parse()`, `lodash.get()` all resolve to a package/global that is not a
|
|
820
|
+
// handle, so the call's return is not a handle either. A method call on a
|
|
821
|
+
// *handle* root is NOT itself a handle — `db.prepare()` returns a Statement,
|
|
822
|
+
// `db.transaction()` a Transaction, `stmt.all()` a result row — so it
|
|
823
|
+
// abstains to `unproven` rather than over-claiming `handle`.
|
|
824
|
+
if (root) {
|
|
825
|
+
const rootDisp = classifyRootIdentifier(root, env, depth + 1);
|
|
826
|
+
if (rootDisp === 'not-handle')
|
|
827
|
+
return 'not-handle';
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
return 'unproven';
|
|
831
|
+
case 'member':
|
|
832
|
+
if (value.root)
|
|
833
|
+
return classifyRootIdentifier(value.root, env, depth + 1);
|
|
834
|
+
return 'not-handle';
|
|
835
|
+
case 'as':
|
|
836
|
+
if (value.typeText != null)
|
|
837
|
+
return classifyTypeText(value.typeText, env, depth + 1);
|
|
838
|
+
if (value.operand)
|
|
839
|
+
return classifyValue(value.operand, env, depth + 1);
|
|
840
|
+
return 'unproven';
|
|
841
|
+
case 'unwrap':
|
|
842
|
+
if (value.operand)
|
|
843
|
+
return classifyValue(value.operand, env, depth + 1);
|
|
844
|
+
return 'unproven';
|
|
845
|
+
case 'other':
|
|
846
|
+
return 'unproven';
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
function isPunctuation(type) {
|
|
850
|
+
return [
|
|
851
|
+
'?', ':', '(', ')', '??', '&&', '||', '=', '===', '==', '+', '-', '*', '/', '%', '.', ',',
|
|
852
|
+
].includes(type);
|
|
853
|
+
}
|
|
854
|
+
function findChildOfType(node, types) {
|
|
855
|
+
for (const child of node.children ?? []) {
|
|
856
|
+
if (types.includes(child.type))
|
|
857
|
+
return child;
|
|
858
|
+
const found = findChildOfType(child, types);
|
|
859
|
+
if (found)
|
|
860
|
+
return found;
|
|
861
|
+
}
|
|
862
|
+
return null;
|
|
863
|
+
}
|
|
864
|
+
function extractIdentifierName(node, adapter, sourceCode) {
|
|
865
|
+
if (node.type === 'identifier')
|
|
866
|
+
return adapter.getNodeText(node, sourceCode);
|
|
867
|
+
if (node.type === 'member_expression' || node.type === 'selector_expression') {
|
|
868
|
+
const firstChild = node.children?.[0];
|
|
869
|
+
if (firstChild)
|
|
870
|
+
return extractIdentifierName(firstChild, adapter, sourceCode);
|
|
871
|
+
}
|
|
872
|
+
return null;
|
|
873
|
+
}
|
|
874
|
+
function getCallExpressionCallee(node, adapter) {
|
|
875
|
+
for (const child of adapter.getChildren(node)) {
|
|
876
|
+
if (child.type === 'arguments')
|
|
877
|
+
break;
|
|
878
|
+
if (child.type === 'await_expression') {
|
|
879
|
+
const inner = getCallExpressionCallee(child, adapter);
|
|
880
|
+
if (inner)
|
|
881
|
+
return inner;
|
|
882
|
+
continue;
|
|
883
|
+
}
|
|
884
|
+
if (child.type === 'identifier' ||
|
|
885
|
+
child.type === 'member_expression' ||
|
|
886
|
+
child.type === 'selector_expression' ||
|
|
887
|
+
child.type === 'call_expression') {
|
|
888
|
+
return child;
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
return null;
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* Resolve a member/selector chain to its root identifier name (the leftmost
|
|
895
|
+
* segment, descending through call expressions for builder chains). Returns the
|
|
896
|
+
* bare name (`"db"` for `db.select().from()`, `"page"` for `page.locator()`), or
|
|
897
|
+
* `null` when the root is a literal (array/object/string) or otherwise not an
|
|
898
|
+
* identifier.
|
|
899
|
+
*
|
|
900
|
+
* @param callee the member/selector/identifier expression to resolve
|
|
901
|
+
* @param adapter the language adapter used to read children and text
|
|
902
|
+
* @param sourceCode the file source text for reading node text
|
|
903
|
+
* @returns the leftmost identifier name, or null for a non-identifier root
|
|
904
|
+
*/
|
|
905
|
+
export function resolveReceiverRoot(callee, adapter, sourceCode) {
|
|
906
|
+
let current = callee;
|
|
907
|
+
while (current.type === 'member_expression' || current.type === 'selector_expression') {
|
|
908
|
+
const children = adapter.getChildren(current);
|
|
909
|
+
const object = children.find((c) => c.type !== '.' && c.type !== 'property_identifier' && c.type !== 'field_identifier');
|
|
910
|
+
if (!object)
|
|
911
|
+
return null;
|
|
912
|
+
// When the object is `this`/`super`, the receiver's root is the property of
|
|
913
|
+
// THIS member expression — the first segment after `this` (`env` in
|
|
914
|
+
// `this.env.DB`, `ctx` in `this.ctx.storage.sql`). Returning it here avoids
|
|
915
|
+
// the old `findFirstProperty` fallback, which scanned the whole callee for
|
|
916
|
+
// the first `property_identifier` it could find — which is the *method*
|
|
917
|
+
// (`prepare`/`exec`), i.e. the last segment, not the first.
|
|
918
|
+
if (object.type === 'this' || object.type === 'super') {
|
|
919
|
+
const prop = children.find((c) => c.type === 'property_identifier' || c.type === 'field_identifier');
|
|
920
|
+
return prop ? adapter.getNodeText(prop, sourceCode) : null;
|
|
921
|
+
}
|
|
922
|
+
current = object;
|
|
923
|
+
}
|
|
924
|
+
if (current.type === 'call_expression') {
|
|
925
|
+
const innerCallee = getCallExpressionCallee(current, adapter);
|
|
926
|
+
if (innerCallee)
|
|
927
|
+
return resolveReceiverRoot(innerCallee, adapter, sourceCode);
|
|
928
|
+
return null;
|
|
929
|
+
}
|
|
930
|
+
if (current.type === 'identifier') {
|
|
931
|
+
return adapter.getNodeText(current, sourceCode);
|
|
932
|
+
}
|
|
933
|
+
return null;
|
|
934
|
+
}
|
|
935
|
+
// ── Form-3 this-field type heritage (Spec 70 Q3) ─────────────────────────────
|
|
936
|
+
/** Split `Agent<Env>` / `WorkflowEntrypoint` into its base-class name and type
|
|
937
|
+
* arguments. A heritage with no `<…>` has an empty argument list; nested
|
|
938
|
+
* generics (`Foo<Bar<Baz>, Qux>`) split at top-level commas only. The base-class
|
|
939
|
+
* name and arguments are then handed to `env.resolveHeritageField` for the
|
|
940
|
+
* declaration lookup, or left unresolvable (abstain) when no resolver is
|
|
941
|
+
* threaded. */
|
|
942
|
+
function splitHeritage(text) {
|
|
943
|
+
const t = text.trim();
|
|
944
|
+
const base = baseTypeName(t);
|
|
945
|
+
const lt = t.indexOf('<');
|
|
946
|
+
if (lt <= 0 || !t.endsWith('>'))
|
|
947
|
+
return { base, args: [] };
|
|
948
|
+
return { base, args: splitTopLevel(t.slice(lt + 1, -1), ',') };
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* The enclosing class declaration's `extends` clause text
|
|
952
|
+
* (`WorkflowEntrypoint<Env>`), or null when the node is not inside a class or
|
|
953
|
+
* the class has no base class. The smallest enclosing class wins (nested classes
|
|
954
|
+
* resolve to the innermost), matching the deleted form-3 producer.
|
|
955
|
+
*
|
|
956
|
+
* @param ast the parsed file AST searched for enclosing classes
|
|
957
|
+
* @param adapter the language adapter used to find and read class nodes
|
|
958
|
+
* @param node the node whose enclosing class heritage is sought
|
|
959
|
+
* @param sourceCode the file source text for reading the heritage text
|
|
960
|
+
* @returns the enclosing class's `extends` clause text, or null when none applies
|
|
961
|
+
*/
|
|
962
|
+
export function findEnclosingClassHeritage(ast, adapter, node, sourceCode) {
|
|
963
|
+
const line = node.location.start.line;
|
|
964
|
+
const classes = adapter.findNodes(ast, {
|
|
965
|
+
custom: (n) => n.type === 'class_declaration' || n.type === 'abstract_class_declaration',
|
|
966
|
+
});
|
|
967
|
+
let best = null;
|
|
968
|
+
let bestSpan = Number.POSITIVE_INFINITY;
|
|
969
|
+
for (const cls of classes) {
|
|
970
|
+
const start = cls.location.start.line;
|
|
971
|
+
const end = cls.location.end.line;
|
|
972
|
+
if (start <= line && line <= end) {
|
|
973
|
+
const span = end - start;
|
|
974
|
+
if (span < bestSpan) {
|
|
975
|
+
bestSpan = span;
|
|
976
|
+
best = cls;
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
if (!best)
|
|
981
|
+
return null;
|
|
982
|
+
const heritage = adapter.getChildren(best).find((c) => c.type === 'class_heritage');
|
|
983
|
+
if (!heritage)
|
|
984
|
+
return null;
|
|
985
|
+
const ext = adapter.getChildren(heritage).find((c) => c.type === 'extends_clause');
|
|
986
|
+
if (!ext)
|
|
987
|
+
return null;
|
|
988
|
+
return adapter.getNodeText(ext, sourceCode).trim().replace(/^extends\s+/, '');
|
|
989
|
+
}
|
|
990
|
+
//# sourceMappingURL=receiverRoot.js.map
|