@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.4813bf3
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/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +5 -5
- package/analyzer-template/packages/ai/index.ts +7 -1
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +62 -18
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +409 -50
- package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +21 -6
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +992 -249
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +31 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +37 -15
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +126 -11
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +367 -96
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +33 -15
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +315 -6
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +49 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +649 -142
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
- package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
- package/analyzer-template/packages/analyze/index.ts +2 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +89 -9
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +37 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +459 -39
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
- package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +6 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
- package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
- package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +3 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/package.json +1 -1
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/project/constructMockCode.ts +90 -10
- package/analyzer-template/project/writeMockDataTsx.ts +181 -8
- package/analyzer-template/project/writeScenarioComponents.ts +60 -12
- package/analyzer-template/project/writeSimpleRoot.ts +21 -11
- package/background/src/lib/local/createLocalAnalyzer.js +1 -1
- package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +180 -0
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/codeyam-cli.js +18 -2
- package/codeyam-cli/src/codeyam-cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +4 -2
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/baseline.js +2 -0
- package/codeyam-cli/src/commands/baseline.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +9 -5
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +31 -20
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
- package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +49 -257
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +17 -26
- package/codeyam-cli/src/commands/memory.js.map +1 -1
- package/codeyam-cli/src/commands/recapture.js +2 -0
- package/codeyam-cli/src/commands/recapture.js.map +1 -1
- package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
- package/codeyam-cli/src/commands/setup-simulations.js +284 -0
- package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
- package/codeyam-cli/src/commands/test-startup.js +2 -0
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/commands/verify.js +14 -2
- package/codeyam-cli/src/commands/verify.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +7 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +5 -0
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +2 -2
- package/codeyam-cli/src/utils/install-skills.js +70 -45
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
- package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
- package/codeyam-cli/src/utils/progress.js +7 -0
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +4 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/requireSimulations.js +10 -0
- package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/index.js +1 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -1
- package/codeyam-cli/src/utils/rules/parser.js +2 -25
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
- package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +16 -11
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js +37 -10
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/backgroundServer.js +24 -0
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-B86KKU7e.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-CgMEzchJ.js} +3 -8
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-CBui0id_.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-BtBFH820.js} +6 -11
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CN61MOMa.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-C0epRiVn.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-BVnB8a9L.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-0N0YJQv7.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-DXnyr8uP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-CKT08Djd.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-BLJ7HxOC.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-b171b9d3.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-CCQd4aZA.js +78 -0
- package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-CHhiHoo_.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-BejnUJ6R.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-8Fv-lH1-.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-Akn3iYFP.js +257 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
- package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
- package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
- package/codeyam-cli/templates/codeyam-memory.md +392 -0
- package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
- package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
- package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
- package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
- package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
- package/codeyam-cli/templates/rule-notification-hook.py +56 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
- package/codeyam-cli/templates/rules-instructions.md +132 -0
- package/package.json +2 -2
- package/packages/ai/index.js +3 -2
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +50 -13
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
- package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +763 -171
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +33 -3
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +113 -11
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +309 -84
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructureChunking.js +26 -11
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/isolateScopes.js +39 -3
- package/packages/ai/src/lib/isolateScopes.js.map +1 -1
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
- package/packages/ai/src/lib/mergeStatements.js +70 -51
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/analyze/index.js +1 -0
- package/packages/analyze/index.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +65 -7
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +33 -8
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +399 -31
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
- package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/index.js +1 -0
- package/packages/analyze/src/lib/index.js.map +1 -1
- package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
- package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
- package/packages/database/src/lib/analysisBranchToDb.js +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/packages/database/src/lib/analysisToDb.js +1 -1
- package/packages/database/src/lib/analysisToDb.js.map +1 -1
- package/packages/database/src/lib/branchToDb.js +1 -1
- package/packages/database/src/lib/branchToDb.js.map +1 -1
- package/packages/database/src/lib/commitBranchToDb.js +1 -1
- package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
- package/packages/database/src/lib/commitToDb.js +1 -1
- package/packages/database/src/lib/commitToDb.js.map +1 -1
- package/packages/database/src/lib/fileToDb.js +1 -1
- package/packages/database/src/lib/fileToDb.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +3 -0
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/packages/database/src/lib/projectToDb.js +1 -1
- package/packages/database/src/lib/projectToDb.js.map +1 -1
- package/packages/database/src/lib/saveFiles.js +1 -1
- package/packages/database/src/lib/saveFiles.js.map +1 -1
- package/packages/database/src/lib/scenarioToDb.js +1 -1
- package/packages/database/src/lib/scenarioToDb.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +8 -76
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
- package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
- package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
- package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
- package/codeyam-cli/templates/codeyam:memory.md +0 -462
- package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts
CHANGED
|
@@ -152,8 +152,11 @@ export default function fillInSchemaGapsAndUnknowns(
|
|
|
152
152
|
schema[previousSubPath],
|
|
153
153
|
)
|
|
154
154
|
) {
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
// When fillInUnknowns=false, add missing gaps as 'unknown' to preserve raw schema.
|
|
156
|
+
// When fillInUnknowns=true, infer the type using checkIfKnownType.
|
|
157
|
+
const newValue = fillInUnknowns
|
|
158
|
+
? (checkIfKnownType(previousSubPath, functionKeysMapping) ?? 'object')
|
|
159
|
+
: 'unknown';
|
|
157
160
|
|
|
158
161
|
if (
|
|
159
162
|
!schema[previousSubPath] ||
|
|
@@ -166,10 +169,14 @@ export default function fillInSchemaGapsAndUnknowns(
|
|
|
166
169
|
|
|
167
170
|
// Handle the wrong function chaining function().function()
|
|
168
171
|
if (isFunction && !existingSchema(previousSubPath)) {
|
|
172
|
+
// When fillInUnknowns=false, use 'unknown' for non-function paths.
|
|
173
|
+
// When fillInUnknowns=true, infer the type.
|
|
169
174
|
schema[previousSubPath] = previousSubPath.endsWith(')')
|
|
170
175
|
? 'function'
|
|
171
|
-
:
|
|
172
|
-
|
|
176
|
+
: fillInUnknowns
|
|
177
|
+
? (checkIfKnownType(previousSubPath, functionKeysMapping) ??
|
|
178
|
+
'object')
|
|
179
|
+
: 'unknown';
|
|
173
180
|
changeMade = true;
|
|
174
181
|
}
|
|
175
182
|
|
|
@@ -205,16 +212,88 @@ export default function fillInSchemaGapsAndUnknowns(
|
|
|
205
212
|
}
|
|
206
213
|
}
|
|
207
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Pre-built indexes that can be reused across multiple calls to fillInDirectSchemaGapsAndUnknowns.
|
|
217
|
+
* Build once with buildSchemaIndexes(), then pass to all calls processing the same schema.
|
|
218
|
+
*/
|
|
219
|
+
export interface SchemaIndexes {
|
|
220
|
+
functionKeysMapping: Record<string, string[]>;
|
|
221
|
+
prefixMaxDepth: Map<string, number>;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Build indexes for a schema that can be reused across multiple calls.
|
|
226
|
+
* This avoids rebuilding indexes (~1-2 seconds for 18k keys) on every call.
|
|
227
|
+
*
|
|
228
|
+
* @param schema - The schema to build indexes from (typically the full dependency schema)
|
|
229
|
+
* @returns Indexes that can be passed to fillInDirectSchemaGapsAndUnknowns
|
|
230
|
+
*/
|
|
231
|
+
export function buildSchemaIndexes(
|
|
232
|
+
schema: Record<string, string>,
|
|
233
|
+
): SchemaIndexes {
|
|
234
|
+
// Build functionKeysMapping + prefixMaxDepth in a single pass
|
|
235
|
+
// Avoid repeated split/join work by caching parts and building prefixes incrementally.
|
|
236
|
+
const functionKeysMapping: Record<string, string[]> = {};
|
|
237
|
+
const prefixMaxDepth = new Map<string, number>();
|
|
238
|
+
const partsCache = new Map<string, string[]>();
|
|
239
|
+
|
|
240
|
+
for (const key in schema) {
|
|
241
|
+
const parts = getCachedParts(partsCache, key);
|
|
242
|
+
const lastPart = parts[parts.length - 1];
|
|
243
|
+
const prefixes = buildPrefixParts(parts);
|
|
244
|
+
|
|
245
|
+
if (
|
|
246
|
+
key.endsWith(')') ||
|
|
247
|
+
schema[key] === 'function' ||
|
|
248
|
+
lastPart === 'length'
|
|
249
|
+
) {
|
|
250
|
+
const allButLastPart = parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
251
|
+
functionKeysMapping[allButLastPart] ||= [];
|
|
252
|
+
functionKeysMapping[allButLastPart].push(lastPart);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
for (let i = 0; i < prefixes.length; i++) {
|
|
256
|
+
const prefix = prefixes[i];
|
|
257
|
+
const existingMax = prefixMaxDepth.get(prefix) ?? 0;
|
|
258
|
+
if (parts.length > existingMax) {
|
|
259
|
+
prefixMaxDepth.set(prefix, parts.length);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return { functionKeysMapping, prefixMaxDepth };
|
|
265
|
+
}
|
|
266
|
+
|
|
208
267
|
export function fillInDirectSchemaGapsAndUnknowns({
|
|
209
268
|
scopeName,
|
|
210
269
|
schema,
|
|
211
270
|
mergedSchema,
|
|
212
271
|
attempts = 0,
|
|
272
|
+
// Pre-built indexes from buildSchemaIndexes() - use for cross-call caching
|
|
273
|
+
prebuiltIndexes,
|
|
274
|
+
// Internal: pre-computed indexes to avoid rebuilding on recursion
|
|
275
|
+
_functionKeysMapping,
|
|
276
|
+
_prefixMaxDepth,
|
|
277
|
+
_partsCache,
|
|
278
|
+
_prefixPartsCache,
|
|
279
|
+
_knownTypeCache,
|
|
280
|
+
_guessTypeCache,
|
|
281
|
+
_nameHintCache,
|
|
213
282
|
}: {
|
|
214
283
|
scopeName?: string;
|
|
215
284
|
schema: Record<string, string>;
|
|
216
285
|
mergedSchema?: Record<string, string>;
|
|
217
286
|
attempts?: number;
|
|
287
|
+
/** Pre-built indexes from buildSchemaIndexes() - pass to reuse across multiple calls */
|
|
288
|
+
prebuiltIndexes?: SchemaIndexes;
|
|
289
|
+
// Internal: pre-computed indexes to avoid rebuilding on recursion (used by recursive calls)
|
|
290
|
+
_functionKeysMapping?: Record<string, string[]>;
|
|
291
|
+
_prefixMaxDepth?: Map<string, number>;
|
|
292
|
+
_partsCache?: Map<string, string[]>;
|
|
293
|
+
_prefixPartsCache?: Map<string, string[]>;
|
|
294
|
+
_knownTypeCache?: Map<string, string | undefined>;
|
|
295
|
+
_guessTypeCache?: Map<string, string | undefined>;
|
|
296
|
+
_nameHintCache?: Map<string, string | undefined>;
|
|
218
297
|
}) {
|
|
219
298
|
try {
|
|
220
299
|
const existingSchema = (path: any) => {
|
|
@@ -225,105 +304,239 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
225
304
|
}
|
|
226
305
|
};
|
|
227
306
|
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
307
|
+
const partsCache = _partsCache ?? new Map<string, string[]>();
|
|
308
|
+
const prefixPartsCache = _prefixPartsCache ?? new Map<string, string[]>();
|
|
309
|
+
const knownTypeCache =
|
|
310
|
+
_knownTypeCache ?? new Map<string, string | undefined>();
|
|
311
|
+
const guessTypeCache =
|
|
312
|
+
_guessTypeCache ?? new Map<string, string | undefined>();
|
|
313
|
+
const nameHintCache =
|
|
314
|
+
_nameHintCache ?? new Map<string, string | undefined>();
|
|
315
|
+
|
|
316
|
+
const getParts = (path: string) => getCachedParts(partsCache, path);
|
|
317
|
+
const getPrefixParts = (path: string) => {
|
|
318
|
+
const cached = prefixPartsCache.get(path);
|
|
319
|
+
if (cached) return cached;
|
|
320
|
+
const prefixes = buildPrefixParts(getParts(path));
|
|
321
|
+
prefixPartsCache.set(path, prefixes);
|
|
322
|
+
return prefixes;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// Index resolution priority:
|
|
326
|
+
// 1. _functionKeysMapping/_prefixMaxDepth (from recursive calls within this invocation)
|
|
327
|
+
// 2. prebuiltIndexes (from cross-call caching - built once, reused across multiple calls)
|
|
328
|
+
// 3. Build new indexes (fallback - expensive for large schemas)
|
|
329
|
+
const functionKeysMapping =
|
|
330
|
+
_functionKeysMapping ??
|
|
331
|
+
prebuiltIndexes?.functionKeysMapping ??
|
|
332
|
+
(() => {
|
|
333
|
+
const mapping: Record<string, string[]> = {};
|
|
334
|
+
for (const key in schema) {
|
|
335
|
+
const parts = getParts(key);
|
|
238
336
|
const lastPart = parts[parts.length - 1];
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
337
|
+
if (
|
|
338
|
+
key.endsWith(')') ||
|
|
339
|
+
schema[key] === 'function' ||
|
|
340
|
+
lastPart === 'length'
|
|
341
|
+
) {
|
|
342
|
+
const prefixes = getPrefixParts(key);
|
|
343
|
+
const allButLastPart =
|
|
344
|
+
parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
345
|
+
mapping[allButLastPart] ||= [];
|
|
346
|
+
mapping[allButLastPart].push(lastPart);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return mapping;
|
|
350
|
+
})();
|
|
351
|
+
|
|
352
|
+
// Build prefix index for O(1) lookups in checkIfObjectOrFunction
|
|
353
|
+
// Maps each prefix to the max depth of keys that have this prefix
|
|
354
|
+
// This replaces O(n) scans with O(1) lookups, fixing the O(n²) bottleneck
|
|
355
|
+
let prefixMaxDepth =
|
|
356
|
+
_prefixMaxDepth ?? prebuiltIndexes?.prefixMaxDepth ?? null;
|
|
357
|
+
if (!prefixMaxDepth) {
|
|
358
|
+
prefixMaxDepth = new Map<string, number>();
|
|
359
|
+
const targetSchema = mergedSchema ?? schema;
|
|
360
|
+
for (const key in targetSchema) {
|
|
361
|
+
const keyParts = getParts(key);
|
|
362
|
+
const prefixes = buildPrefixParts(keyParts);
|
|
363
|
+
// Record each prefix of this key with its max depth
|
|
364
|
+
for (let i = 0; i < prefixes.length; i++) {
|
|
365
|
+
const prefix = prefixes[i];
|
|
366
|
+
const existingMax = prefixMaxDepth.get(prefix) ?? 0;
|
|
367
|
+
if (keyParts.length > existingMax) {
|
|
368
|
+
prefixMaxDepth.set(prefix, keyParts.length);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
245
373
|
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
374
|
+
// O(1) replacement for checkIfObjectOrFunction
|
|
375
|
+
const checkIfObjectOrFunctionFast = (path: string): string | undefined => {
|
|
376
|
+
const maxDepth = prefixMaxDepth!.get(path);
|
|
377
|
+
|
|
378
|
+
if (maxDepth === undefined) return undefined; // No key starts with this path
|
|
379
|
+
|
|
380
|
+
const pathParts = getParts(path);
|
|
381
|
+
// Check if path's last part ends with ')' → function
|
|
382
|
+
const lastPart = pathParts[pathParts.length - 1];
|
|
383
|
+
if (lastPart?.endsWith(')')) {
|
|
384
|
+
return 'function';
|
|
253
385
|
}
|
|
254
386
|
|
|
255
|
-
|
|
256
|
-
|
|
387
|
+
// Check if there are deeper keys
|
|
388
|
+
if (maxDepth > pathParts.length) {
|
|
389
|
+
return 'object';
|
|
257
390
|
}
|
|
258
391
|
|
|
259
|
-
|
|
260
|
-
|
|
392
|
+
return undefined;
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
let changeMade = false;
|
|
396
|
+
const getKnownType = (path: string) => {
|
|
397
|
+
if (knownTypeCache.has(path)) return knownTypeCache.get(path);
|
|
398
|
+
const known = checkIfKnownType(path, functionKeysMapping);
|
|
399
|
+
knownTypeCache.set(path, known);
|
|
400
|
+
return known;
|
|
401
|
+
};
|
|
402
|
+
const guessTypeFromName = (lastPart: string, defaultType: string) => {
|
|
403
|
+
if (nameHintCache.has(lastPart)) {
|
|
404
|
+
return nameHintCache.get(lastPart) ?? defaultType;
|
|
405
|
+
}
|
|
261
406
|
|
|
407
|
+
let hint: string | undefined;
|
|
262
408
|
if (isLikelyBoolean(lastPart)) {
|
|
263
|
-
|
|
409
|
+
hint = 'boolean';
|
|
264
410
|
} else if (isLikelyDate(lastPart)) {
|
|
265
|
-
|
|
411
|
+
hint = 'date';
|
|
266
412
|
} else if (isLikelyAction(lastPart)) {
|
|
267
|
-
|
|
413
|
+
hint = 'function';
|
|
268
414
|
} else if (pluralize.isPlural(lastPart)) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
415
|
+
// Default to number instead of array - safer for JSX rendering
|
|
416
|
+
// Arrays cause "Objects are not valid as a React child" errors when rendered directly
|
|
417
|
+
hint = 'number';
|
|
272
418
|
}
|
|
419
|
+
|
|
420
|
+
nameHintCache.set(lastPart, hint);
|
|
421
|
+
return hint ?? defaultType;
|
|
422
|
+
};
|
|
423
|
+
const guessTypeForPath = (path: string, defaultType = 'string') => {
|
|
424
|
+
const cacheKey = `${path}|${defaultType}`;
|
|
425
|
+
if (guessTypeCache.has(cacheKey)) {
|
|
426
|
+
return guessTypeCache.get(cacheKey);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
let knownType = getKnownType(path);
|
|
430
|
+
if (!knownType) {
|
|
431
|
+
// Use optimized O(1) prefix lookup instead of O(n) scan
|
|
432
|
+
knownType = checkIfObjectOrFunctionFast(path);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (knownType) {
|
|
436
|
+
guessTypeCache.set(cacheKey, knownType);
|
|
437
|
+
return knownType;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const keyParts = getParts(path);
|
|
441
|
+
const lastPart = keyParts[keyParts.length - 1];
|
|
442
|
+
const guessed = guessTypeFromName(lastPart, defaultType);
|
|
443
|
+
guessTypeCache.set(cacheKey, guessed);
|
|
444
|
+
return guessed;
|
|
273
445
|
};
|
|
274
446
|
|
|
275
447
|
for (const key in schema) {
|
|
276
448
|
if (!schema[key]) schema[key] = 'unknown';
|
|
277
449
|
if (schema[key].includes(' | unknown')) {
|
|
278
|
-
|
|
279
|
-
|
|
450
|
+
const cleaned = schema[key].replace(' | unknown', '');
|
|
451
|
+
if (schema[key] !== cleaned) {
|
|
452
|
+
schema[key] = cleaned;
|
|
453
|
+
changeMade = true;
|
|
454
|
+
}
|
|
280
455
|
} else if (schema[key].startsWith('unknown | ')) {
|
|
281
456
|
// Handle "unknown | undefined" -> "string | undefined"
|
|
282
457
|
const remainingType = schema[key].substring('unknown | '.length);
|
|
283
458
|
const newType = guessTypeForPath(key, 'string');
|
|
284
459
|
if (newType) {
|
|
285
|
-
|
|
286
|
-
|
|
460
|
+
const replacement = `${newType} | ${remainingType}`;
|
|
461
|
+
if (schema[key] !== replacement) {
|
|
462
|
+
schema[key] = replacement;
|
|
463
|
+
changeMade = true;
|
|
464
|
+
}
|
|
287
465
|
}
|
|
288
466
|
} else if (schema[key] === 'unknown') {
|
|
289
467
|
const newType = guessTypeForPath(key, 'string');
|
|
290
|
-
|
|
468
|
+
// Don't convert 'unknown' to 'object' — 'object' is just inferred from
|
|
469
|
+
// having child properties, which isn't more useful than 'unknown' and
|
|
470
|
+
// prevents enrichment from filling in the actual type later.
|
|
471
|
+
if (newType && newType !== 'object' && schema[key] !== newType) {
|
|
291
472
|
schema[key] = newType;
|
|
292
473
|
changeMade = true;
|
|
293
474
|
}
|
|
294
475
|
}
|
|
295
476
|
|
|
296
|
-
const keyParts =
|
|
477
|
+
const keyParts = getParts(key);
|
|
478
|
+
const prefixParts = getPrefixParts(key);
|
|
297
479
|
for (let i = 0; i < keyParts.length; i++) {
|
|
298
|
-
|
|
299
|
-
const lastSubPathPart =
|
|
300
|
-
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
480
|
+
if (i === 0) continue;
|
|
481
|
+
const lastSubPathPart = keyParts[i];
|
|
482
|
+
const previousSubPath = prefixParts[i - 1];
|
|
483
|
+
const isSignatureIndex =
|
|
484
|
+
lastSubPathPart.includes('signature[') &&
|
|
485
|
+
SIGNATURE_INDEX_REGEX.test(lastSubPathPart);
|
|
486
|
+
|
|
487
|
+
if (lastSubPathPart.includes('[')) {
|
|
488
|
+
const cleaned = cleanOutBoundary(lastSubPathPart);
|
|
489
|
+
if (cleaned.match(/\[\d*\]/) && !isSignatureIndex) {
|
|
490
|
+
// Fix 39: Don't overwrite explicit 'object' types with 'array'
|
|
491
|
+
// This handles spurious [] paths from components like JsonNode that handle
|
|
492
|
+
// both arrays and objects. When metadata is explicitly typed as 'object',
|
|
493
|
+
// paths like metadata[] (from dynamic iteration) should not change it.
|
|
494
|
+
const existingType = schema[previousSubPath];
|
|
495
|
+
const baseType = existingType?.split(' | ')[0];
|
|
496
|
+
|
|
497
|
+
// Also check if this path has meaningful object property children (non-[] children).
|
|
498
|
+
// If it does, it's an object with mixed access patterns (e.g., agent.entries
|
|
499
|
+
// AND agent[].type), not a pure array. Don't infer 'array' in that case.
|
|
500
|
+
// Exclude .length since it exists on arrays too and is NOT evidence of object-ness.
|
|
501
|
+
let hasObjectPropertyChildren = false;
|
|
502
|
+
if (baseType !== 'array' && baseType !== 'object') {
|
|
503
|
+
const dotPrefix = previousSubPath + '.';
|
|
504
|
+
const lengthPath = previousSubPath + '.length';
|
|
505
|
+
for (const schemaKey in schema) {
|
|
506
|
+
if (
|
|
507
|
+
schemaKey.startsWith(dotPrefix) &&
|
|
508
|
+
schemaKey !== lengthPath
|
|
509
|
+
) {
|
|
510
|
+
hasObjectPropertyChildren = true;
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
if (
|
|
517
|
+
baseType !== 'array' &&
|
|
518
|
+
baseType !== 'object' &&
|
|
519
|
+
!hasObjectPropertyChildren
|
|
520
|
+
) {
|
|
521
|
+
// Preserve nullability from existing type (e.g., 'unknown | undefined' -> 'array | undefined')
|
|
522
|
+
let newType = 'array';
|
|
523
|
+
if (existingType?.includes(' | undefined')) {
|
|
524
|
+
newType = 'array | undefined';
|
|
525
|
+
} else if (existingType?.includes(' | null')) {
|
|
526
|
+
newType = 'array | null';
|
|
527
|
+
}
|
|
528
|
+
if (schema[previousSubPath] !== newType) {
|
|
529
|
+
schema[previousSubPath] = newType;
|
|
530
|
+
changeMade = true;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
320
533
|
}
|
|
321
534
|
}
|
|
322
535
|
|
|
323
536
|
const isFunction =
|
|
324
537
|
lastSubPathPart.endsWith(')') ||
|
|
325
538
|
lastSubPathPart === 'functionCallReturnValue' ||
|
|
326
|
-
|
|
539
|
+
isSignatureIndex;
|
|
327
540
|
|
|
328
541
|
if (
|
|
329
542
|
!isFunction &&
|
|
@@ -331,15 +544,36 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
331
544
|
schema[previousSubPath],
|
|
332
545
|
)
|
|
333
546
|
) {
|
|
334
|
-
const
|
|
335
|
-
|
|
336
|
-
|
|
547
|
+
const existingType = schema[previousSubPath];
|
|
548
|
+
const baseExistingType = existingType?.split(' | ')[0];
|
|
549
|
+
// Skip if the base type is already a structured type
|
|
337
550
|
if (
|
|
338
|
-
!
|
|
339
|
-
|
|
551
|
+
!['object', 'array', 'function', 'async-function'].includes(
|
|
552
|
+
baseExistingType,
|
|
553
|
+
)
|
|
340
554
|
) {
|
|
341
|
-
|
|
342
|
-
|
|
555
|
+
let newValue = getKnownType(previousSubPath) ?? 'object';
|
|
556
|
+
// Don't overwrite 'unknown' with 'object' — 'object' is just
|
|
557
|
+
// inferred from child properties and isn't more useful than 'unknown'
|
|
558
|
+
if (
|
|
559
|
+
newValue === 'object' &&
|
|
560
|
+
existingType &&
|
|
561
|
+
existingType.split(' | ')[0] === 'unknown'
|
|
562
|
+
) {
|
|
563
|
+
// preserve existing 'unknown' (possibly with nullability)
|
|
564
|
+
} else {
|
|
565
|
+
// Preserve nullability from existing type
|
|
566
|
+
if (existingType?.includes(' | undefined')) {
|
|
567
|
+
newValue = `${newValue} | undefined`;
|
|
568
|
+
} else if (existingType?.includes(' | null')) {
|
|
569
|
+
newValue = `${newValue} | null`;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
if (!existingType || existingType !== newValue) {
|
|
573
|
+
schema[previousSubPath] = newValue;
|
|
574
|
+
changeMade = true;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
343
577
|
}
|
|
344
578
|
}
|
|
345
579
|
|
|
@@ -347,8 +581,7 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
347
581
|
if (isFunction && !existingSchema(previousSubPath)) {
|
|
348
582
|
schema[previousSubPath] = previousSubPath.endsWith(')')
|
|
349
583
|
? 'function'
|
|
350
|
-
: (
|
|
351
|
-
'object');
|
|
584
|
+
: (getKnownType(previousSubPath) ?? 'object');
|
|
352
585
|
changeMade = true;
|
|
353
586
|
}
|
|
354
587
|
|
|
@@ -358,10 +591,12 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
358
591
|
const functionReturnValuePath = `${previousSubPath}.functionCallReturnValue`;
|
|
359
592
|
|
|
360
593
|
// Extract the method name from lastSubPathPart (e.g., "then()" -> "then")
|
|
361
|
-
const
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
594
|
+
const parenIndex = lastSubPathPart.indexOf('(');
|
|
595
|
+
const methodName =
|
|
596
|
+
parenIndex === -1
|
|
597
|
+
? lastSubPathPart
|
|
598
|
+
: lastSubPathPart.slice(0, parenIndex);
|
|
599
|
+
const isPromiseMethod = PROMISE_METHODS.has(methodName);
|
|
365
600
|
const isPreviousAsync = schema[previousSubPath] === 'async-function';
|
|
366
601
|
|
|
367
602
|
// Don't set to 'function' if this is a promise method on an async function
|
|
@@ -386,6 +621,15 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
386
621
|
schema,
|
|
387
622
|
mergedSchema,
|
|
388
623
|
attempts: ++attempts,
|
|
624
|
+
prebuiltIndexes,
|
|
625
|
+
// Pass pre-computed indexes to avoid rebuilding on each recursive call
|
|
626
|
+
_functionKeysMapping: functionKeysMapping,
|
|
627
|
+
_prefixMaxDepth: prefixMaxDepth,
|
|
628
|
+
_partsCache: partsCache,
|
|
629
|
+
_prefixPartsCache: prefixPartsCache,
|
|
630
|
+
_knownTypeCache: knownTypeCache,
|
|
631
|
+
_guessTypeCache: guessTypeCache,
|
|
632
|
+
_nameHintCache: nameHintCache,
|
|
389
633
|
});
|
|
390
634
|
}
|
|
391
635
|
|
|
@@ -395,9 +639,10 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
395
639
|
// However, if the parent could be an 'object' or other type, keep .length as it may be
|
|
396
640
|
// a custom property.
|
|
397
641
|
for (const key of Object.keys(schema)) {
|
|
398
|
-
const parts =
|
|
642
|
+
const parts = getParts(key);
|
|
399
643
|
if (parts[parts.length - 1] === 'length') {
|
|
400
|
-
const
|
|
644
|
+
const prefixes = getPrefixParts(key);
|
|
645
|
+
const parentPath = parts.length > 1 ? prefixes[parts.length - 2] : '';
|
|
401
646
|
const parentType = schema[parentPath];
|
|
402
647
|
if (parentType) {
|
|
403
648
|
// Split union types and filter out nullable parts
|
|
@@ -434,6 +679,35 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
434
679
|
}
|
|
435
680
|
}
|
|
436
681
|
|
|
682
|
+
const SIGNATURE_INDEX_REGEX = /signature\[\d+\]/;
|
|
683
|
+
const PROMISE_METHODS = new Set(['then', 'catch', 'finally']);
|
|
684
|
+
|
|
685
|
+
function getCachedParts(cache: Map<string, string[]>, path: string): string[] {
|
|
686
|
+
const cached = cache.get(path);
|
|
687
|
+
if (cached) return cached;
|
|
688
|
+
const parts = splitOutsideParenthesesAndArrays(path);
|
|
689
|
+
cache.set(path, parts);
|
|
690
|
+
return parts;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
function buildPrefixParts(parts: string[]): string[] {
|
|
694
|
+
if (parts.length === 0) return [];
|
|
695
|
+
const prefixes = new Array(parts.length);
|
|
696
|
+
let prefix = '';
|
|
697
|
+
for (let i = 0; i < parts.length; i++) {
|
|
698
|
+
const part = parts[i];
|
|
699
|
+
if (i === 0) {
|
|
700
|
+
prefix = part;
|
|
701
|
+
} else if (part.startsWith('[') || part.startsWith('(')) {
|
|
702
|
+
prefix += part;
|
|
703
|
+
} else {
|
|
704
|
+
prefix += `.${part}`;
|
|
705
|
+
}
|
|
706
|
+
prefixes[i] = prefix;
|
|
707
|
+
}
|
|
708
|
+
return prefixes;
|
|
709
|
+
}
|
|
710
|
+
|
|
437
711
|
function checkIfObjectOrFunction(path: string, schema: ScopeNode['schema']) {
|
|
438
712
|
const pathParts = splitOutsideParenthesesAndArrays(path);
|
|
439
713
|
for (const structureKey in schema) {
|
|
@@ -506,20 +780,20 @@ function checkIfKnownType(
|
|
|
506
780
|
let hasStrongArrayEvidence = false;
|
|
507
781
|
let hasOnlyAmbiguousArrayMethods = true;
|
|
508
782
|
let hasLengthAccess = false;
|
|
509
|
-
let hasArrayStringAmbiguousMethod = false;
|
|
510
783
|
let hasIncludesOrIndexOfWithVariable = false;
|
|
511
784
|
|
|
512
|
-
|
|
513
|
-
|
|
785
|
+
const entries = functionAndAttributesKeysMapping[key];
|
|
786
|
+
if (!entries || entries.length === 0) return;
|
|
787
|
+
|
|
788
|
+
for (const functionOrAttributeName of entries) {
|
|
514
789
|
// Extract the method name without arguments for checking against ambiguous list
|
|
515
790
|
const methodName = functionOrAttributeName.split('(')[0].trim();
|
|
516
791
|
|
|
792
|
+
const knownType = knownMethodCalls(functionOrAttributeName);
|
|
517
793
|
const couldBeArray =
|
|
518
|
-
|
|
519
|
-
functionOrAttributeName === 'length';
|
|
794
|
+
knownType.includes('array') || functionOrAttributeName === 'length';
|
|
520
795
|
const couldBeString =
|
|
521
|
-
|
|
522
|
-
functionOrAttributeName === 'length';
|
|
796
|
+
knownType.includes('string') || functionOrAttributeName === 'length';
|
|
523
797
|
|
|
524
798
|
// Track .length access
|
|
525
799
|
if (functionOrAttributeName === 'length') {
|
|
@@ -527,10 +801,6 @@ function checkIfKnownType(
|
|
|
527
801
|
}
|
|
528
802
|
|
|
529
803
|
// Track methods that exist on both arrays and strings (like includes, indexOf)
|
|
530
|
-
if (couldBeArray && couldBeString && functionOrAttributeName !== 'length') {
|
|
531
|
-
hasArrayStringAmbiguousMethod = true;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
804
|
// Check if .includes() or .indexOf() is called with a variable argument (not a string literal).
|
|
535
805
|
// Pattern: arr.includes(item) -> likely array (checking if item exists)
|
|
536
806
|
// Pattern: str.includes('substring') -> likely string (checking for substring)
|
|
@@ -572,10 +842,11 @@ function checkIfKnownType(
|
|
|
572
842
|
return 'array';
|
|
573
843
|
}
|
|
574
844
|
|
|
575
|
-
// When .includes() or .indexOf() is called with a variable argument
|
|
576
|
-
//
|
|
577
|
-
//
|
|
578
|
-
|
|
845
|
+
// When .includes() or .indexOf() is called with a variable argument, prefer array.
|
|
846
|
+
// Pattern: arr.includes(item) -> likely array (checking if item exists in collection)
|
|
847
|
+
// String literals are already filtered by hasStringLiteralArgument, so if we get here
|
|
848
|
+
// with a variable argument, it's strong evidence of array membership testing.
|
|
849
|
+
if (isArray && hasIncludesOrIndexOfWithVariable) {
|
|
579
850
|
return 'array';
|
|
580
851
|
}
|
|
581
852
|
|