@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
|
@@ -19,7 +19,7 @@ export interface GenerateFlowsFromJsxUsagesArgs {
|
|
|
19
19
|
/** Map of controllable paths to their types */
|
|
20
20
|
attributesMap: Record<string, string>;
|
|
21
21
|
/** Map from local variable names to data sources */
|
|
22
|
-
equivalentSignatureVariables: Record<string, string>;
|
|
22
|
+
equivalentSignatureVariables: Record<string, string | string[]>;
|
|
23
23
|
/** Map from full paths to short paths */
|
|
24
24
|
fullToShortPathMap: Record<string, string>;
|
|
25
25
|
/** Structure map for type lookup */
|
|
@@ -743,6 +743,48 @@ function processScope({
|
|
|
743
743
|
};
|
|
744
744
|
}
|
|
745
745
|
|
|
746
|
+
/**
|
|
747
|
+
* Check if a code string contains only type declarations (type aliases, interfaces, etc.)
|
|
748
|
+
* that don't contribute to runtime behavior. This is used to determine if the root scope
|
|
749
|
+
* should be considered "empty" for scope extraction purposes.
|
|
750
|
+
*/
|
|
751
|
+
function containsOnlyTypeDeclarations(code: string): boolean {
|
|
752
|
+
try {
|
|
753
|
+
const sourceFile = ts.createSourceFile(
|
|
754
|
+
'temp.ts',
|
|
755
|
+
code,
|
|
756
|
+
ts.ScriptTarget.Latest,
|
|
757
|
+
true,
|
|
758
|
+
ts.ScriptKind.TS,
|
|
759
|
+
);
|
|
760
|
+
|
|
761
|
+
// Check each statement - if any is NOT a type-only declaration, return false
|
|
762
|
+
for (const statement of sourceFile.statements) {
|
|
763
|
+
if (
|
|
764
|
+
ts.isTypeAliasDeclaration(statement) ||
|
|
765
|
+
ts.isInterfaceDeclaration(statement) ||
|
|
766
|
+
ts.isEnumDeclaration(statement) ||
|
|
767
|
+
// Import declarations that are type-only
|
|
768
|
+
(ts.isImportDeclaration(statement) &&
|
|
769
|
+
statement.importClause?.isTypeOnly) ||
|
|
770
|
+
// Export declarations that are type-only
|
|
771
|
+
(ts.isExportDeclaration(statement) && statement.isTypeOnly)
|
|
772
|
+
) {
|
|
773
|
+
// This is a type-only declaration, continue checking
|
|
774
|
+
continue;
|
|
775
|
+
}
|
|
776
|
+
// Found a non-type statement
|
|
777
|
+
return false;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// All statements are type-only (or there are no statements)
|
|
781
|
+
return sourceFile.statements.length > 0;
|
|
782
|
+
} catch {
|
|
783
|
+
// If parsing fails, assume it's not type-only
|
|
784
|
+
return false;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
746
788
|
/**
|
|
747
789
|
* Main entry point.
|
|
748
790
|
*
|
|
@@ -792,9 +834,15 @@ export default function isolateScopes(
|
|
|
792
834
|
const jsxLimit = options?.jsxLimit ?? 10;
|
|
793
835
|
processJSXForScope(isolatedScopes, generateSyntheticName, jsxLimit);
|
|
794
836
|
|
|
795
|
-
// If the root scope text is empty and there's
|
|
796
|
-
// return that child scope as the root scope
|
|
797
|
-
|
|
837
|
+
// If the root scope text is empty (or only contains type declarations) and there's
|
|
838
|
+
// only one child scope, return that child scope as the root scope.
|
|
839
|
+
// Type declarations (type aliases, interfaces) don't contribute to runtime behavior,
|
|
840
|
+
// so we treat them as "empty" for scope extraction purposes.
|
|
841
|
+
const rootTextIsEffectivelyEmpty =
|
|
842
|
+
isolatedScopes.text.trim().length === 0 ||
|
|
843
|
+
containsOnlyTypeDeclarations(isolatedScopes.text);
|
|
844
|
+
|
|
845
|
+
if (rootTextIsEffectivelyEmpty) {
|
|
798
846
|
const childScopeArray = Object.values(isolatedScopes.childScopes);
|
|
799
847
|
if (childScopeArray.length === 1) {
|
|
800
848
|
return childScopeArray[0];
|
|
@@ -11,6 +11,11 @@ export default function mergeJsonTypeDefinitions(
|
|
|
11
11
|
if (!typeDef) continue;
|
|
12
12
|
if (typeof typeDef === 'string') continue;
|
|
13
13
|
for (const [key, value] of Object.entries(typeDef)) {
|
|
14
|
+
// Preserve _nullable boolean markers set by convertDotNotation
|
|
15
|
+
if (key === '_nullable' && typeof value === 'boolean') {
|
|
16
|
+
mergedDef[key] = value;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
14
19
|
if (typeof value === 'string') {
|
|
15
20
|
if (!mergedDef[key]) {
|
|
16
21
|
mergedDef[key] = value;
|
|
@@ -7,58 +7,12 @@ import {
|
|
|
7
7
|
|
|
8
8
|
export interface Statement {
|
|
9
9
|
structure: { [key: string]: string };
|
|
10
|
-
|
|
10
|
+
// Supports multiple equivalencies per key for OR expressions (e.g., x = a || b)
|
|
11
|
+
equivalentVariables: { [key: string]: string | string[] };
|
|
11
12
|
llmCall?: LlmCall;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
export default function mergeStatements(statements: Statement[]) {
|
|
15
|
-
// Debug: Log input statements to understand what we're merging
|
|
16
|
-
const hasStateStructure = statements.some((s) =>
|
|
17
|
-
Object.keys(s.structure || {}).some(
|
|
18
|
-
(k) => k === 'state' || k.includes('state'),
|
|
19
|
-
),
|
|
20
|
-
);
|
|
21
|
-
const hasStateEquiv = statements.some((s) =>
|
|
22
|
-
Object.keys(s.equivalentVariables || {}).some(
|
|
23
|
-
(k) => k === 'state' || k.includes('state'),
|
|
24
|
-
),
|
|
25
|
-
);
|
|
26
|
-
if (hasStateStructure || hasStateEquiv) {
|
|
27
|
-
console.log(
|
|
28
|
-
`[UNION-TYPE] mergeStatements INPUT: ${statements.length} statements`,
|
|
29
|
-
);
|
|
30
|
-
statements.forEach((s, i) => {
|
|
31
|
-
const stateInStructure = Object.entries(s.structure || {}).filter(
|
|
32
|
-
([k]) => k === 'state' || k.includes('state'),
|
|
33
|
-
);
|
|
34
|
-
const stateInEquiv = Object.entries(s.equivalentVariables || {}).filter(
|
|
35
|
-
([k]) => k === 'state' || k.includes('state'),
|
|
36
|
-
);
|
|
37
|
-
const sigInEquiv = Object.entries(s.equivalentVariables || {}).filter(
|
|
38
|
-
([k, v]) => k === 'state' || v === 'signature[0]',
|
|
39
|
-
);
|
|
40
|
-
if (
|
|
41
|
-
stateInStructure.length > 0 ||
|
|
42
|
-
stateInEquiv.length > 0 ||
|
|
43
|
-
sigInEquiv.length > 0
|
|
44
|
-
) {
|
|
45
|
-
console.log(`[UNION-TYPE] Statement ${i}:`);
|
|
46
|
-
if (stateInStructure.length > 0)
|
|
47
|
-
console.log(
|
|
48
|
-
`[UNION-TYPE] structure: ${JSON.stringify(Object.fromEntries(stateInStructure))}`,
|
|
49
|
-
);
|
|
50
|
-
if (stateInEquiv.length > 0)
|
|
51
|
-
console.log(
|
|
52
|
-
`[UNION-TYPE] equivalentVariables (state): ${JSON.stringify(Object.fromEntries(stateInEquiv))}`,
|
|
53
|
-
);
|
|
54
|
-
if (sigInEquiv.length > 0)
|
|
55
|
-
console.log(
|
|
56
|
-
`[UNION-TYPE] equivalentVariables (sig): ${JSON.stringify(Object.fromEntries(sigInEquiv))}`,
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
16
|
// This should be handled by the AST Analyzer but it currently has a bug
|
|
63
17
|
const ensureFunctionCallReturnValue = (path: string, value: string) => {
|
|
64
18
|
if (path.endsWith(')') && value !== 'function') {
|
|
@@ -172,12 +126,54 @@ export default function mergeStatements(statements: Statement[]) {
|
|
|
172
126
|
// settingsData → fetcher.data.data uses fetcher::cyDuplicateKey1::.data.data
|
|
173
127
|
const activeRemappings: Record<string, string> = {};
|
|
174
128
|
|
|
129
|
+
// Helper to normalize value to array and process
|
|
130
|
+
const normalizeValue = (value: string | string[]): string[] =>
|
|
131
|
+
Array.isArray(value) ? value : [value];
|
|
132
|
+
|
|
175
133
|
const equivalentVariables = statements.reduce((acc: any, result) => {
|
|
176
|
-
for (const [key,
|
|
134
|
+
for (const [key, rawValue] of Object.entries(
|
|
177
135
|
result.equivalentVariables ?? {},
|
|
178
136
|
)) {
|
|
137
|
+
// Handle arrays from AST analyzer (OR expressions like x = a || b)
|
|
138
|
+
// These should be preserved as arrays to track all sources
|
|
139
|
+
if (Array.isArray(rawValue)) {
|
|
140
|
+
const keyOptions = deBinaryPath(key);
|
|
141
|
+
const validValues = rawValue.filter(
|
|
142
|
+
(v): v is string => typeof v === 'string' && v.length > 0,
|
|
143
|
+
);
|
|
144
|
+
if (validValues.length === 0) continue;
|
|
145
|
+
|
|
146
|
+
// Process each array value through deBinaryPath
|
|
147
|
+
const allValueOptions: string[] = [];
|
|
148
|
+
for (const value of validValues) {
|
|
149
|
+
const valueOptions = deBinaryPath(value);
|
|
150
|
+
allValueOptions.push(...valueOptions);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Remove duplicates while preserving order
|
|
154
|
+
const uniqueValueOptions = [...new Set(allValueOptions)];
|
|
155
|
+
const finalValue =
|
|
156
|
+
uniqueValueOptions.length === 1
|
|
157
|
+
? uniqueValueOptions[0]
|
|
158
|
+
: uniqueValueOptions;
|
|
159
|
+
|
|
160
|
+
delete result.equivalentVariables[key];
|
|
161
|
+
if (keyOptions.length >= 2) {
|
|
162
|
+
for (const keyOption of keyOptions) {
|
|
163
|
+
result.equivalentVariables[keyOption] = finalValue;
|
|
164
|
+
}
|
|
165
|
+
} else {
|
|
166
|
+
result.equivalentVariables[keyOptions[0]] = finalValue;
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Original logic for string values with potential binary expressions in the string
|
|
172
|
+
const firstValue = rawValue;
|
|
173
|
+
if (!firstValue) continue;
|
|
174
|
+
|
|
179
175
|
const keyOptions = deBinaryPath(key);
|
|
180
|
-
const valueOptions = deBinaryPath(
|
|
176
|
+
const valueOptions = deBinaryPath(firstValue);
|
|
181
177
|
delete result.equivalentVariables[key];
|
|
182
178
|
if (keyOptions.length === 2) {
|
|
183
179
|
if (valueOptions.length === 2) {
|
|
@@ -199,27 +195,38 @@ export default function mergeStatements(statements: Statement[]) {
|
|
|
199
195
|
}
|
|
200
196
|
}
|
|
201
197
|
|
|
202
|
-
for (const [key,
|
|
198
|
+
for (const [key, rawValue] of Object.entries(
|
|
203
199
|
result.equivalentVariables ?? {},
|
|
204
200
|
)) {
|
|
201
|
+
// Normalize to array for consistent handling
|
|
202
|
+
const values = normalizeValue(rawValue);
|
|
203
|
+
|
|
205
204
|
// Apply any active remappings to the VALUE, but ONLY for property paths
|
|
206
205
|
// e.g., if fetcher was remapped to fetcher::cyDuplicateKey1::,
|
|
207
206
|
// then "fetcher.data.data" should become "fetcher::cyDuplicateKey1::.data.data"
|
|
208
207
|
// However, we should NOT remap standalone variable references like "description"
|
|
209
208
|
// because that would lose type information from the original variable.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
209
|
+
const remappedValues = values.map((value) => {
|
|
210
|
+
let remappedValue = value;
|
|
211
|
+
for (const [originalKey, remappedKey] of Object.entries(
|
|
212
|
+
activeRemappings,
|
|
213
|
+
)) {
|
|
214
|
+
// Only remap if the value is a property path (contains a dot after the key)
|
|
215
|
+
// This preserves type information for simple variable references
|
|
216
|
+
const keyRegex = new RegExp(
|
|
217
|
+
`^${originalKey.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?=\\.)`,
|
|
218
|
+
);
|
|
219
|
+
if (keyRegex.test(remappedValue)) {
|
|
220
|
+
remappedValue = remappedValue.replace(keyRegex, remappedKey);
|
|
221
|
+
}
|
|
221
222
|
}
|
|
222
|
-
|
|
223
|
+
return remappedValue;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// Use array if multiple values, string if single
|
|
227
|
+
const remappedValue =
|
|
228
|
+
remappedValues.length === 1 ? remappedValues[0] : remappedValues;
|
|
229
|
+
const firstRemappedValue = remappedValues[0];
|
|
223
230
|
|
|
224
231
|
if (acc[key]) {
|
|
225
232
|
if (acc[key] === remappedValue) continue;
|
|
@@ -247,45 +254,32 @@ export default function mergeStatements(statements: Statement[]) {
|
|
|
247
254
|
// If we have equivalentVariables[A] = B, and structure[A] is more specific than structure[B],
|
|
248
255
|
// then update structure[B] to match structure[A]
|
|
249
256
|
// This handles cases like: "state" -> "signature[0]" where "state" has a union type
|
|
250
|
-
|
|
251
|
-
// Debug: Log union types in merged structure
|
|
252
|
-
const unionTypesInStructure = Object.entries(structure).filter(
|
|
253
|
-
([_, v]) => typeof v === 'string' && v.includes("'") && v.includes(' | '),
|
|
254
|
-
);
|
|
255
|
-
if (unionTypesInStructure.length > 0) {
|
|
256
|
-
console.log(
|
|
257
|
-
`[UNION-TYPE] mergeStatements: Found ${unionTypesInStructure.length} union types in merged structure`,
|
|
258
|
-
);
|
|
259
|
-
unionTypesInStructure.forEach(([k, v]) =>
|
|
260
|
-
console.log(`[UNION-TYPE] structure["${k}"] = ${v}`),
|
|
261
|
-
);
|
|
262
|
-
console.log(
|
|
263
|
-
`[UNION-TYPE] mergeStatements: equivalentVariables = ${JSON.stringify(equivalentVariables)}`,
|
|
264
|
-
);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
for (const [source, target] of Object.entries(equivalentVariables) as [
|
|
268
|
-
string,
|
|
257
|
+
for (const [source, rawTarget] of Object.entries(equivalentVariables) as [
|
|
269
258
|
string,
|
|
259
|
+
string | string[],
|
|
270
260
|
][]) {
|
|
261
|
+
// Normalize to array for consistent handling
|
|
262
|
+
const targets = Array.isArray(rawTarget) ? rawTarget : [rawTarget];
|
|
271
263
|
const sourceType = structure[source];
|
|
272
|
-
const targetType = structure[target];
|
|
273
264
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
const sourceIsUnion =
|
|
277
|
-
sourceType.includes("'") && sourceType.includes(' | ');
|
|
265
|
+
for (const target of targets) {
|
|
266
|
+
if (typeof target !== 'string') continue;
|
|
278
267
|
|
|
279
|
-
|
|
280
|
-
// Target doesn't exist or is generic - propagate the union type
|
|
281
|
-
const targetIsGeneric =
|
|
282
|
-
!targetType || targetType === 'string' || targetType === 'unknown';
|
|
268
|
+
const targetType = structure[target];
|
|
283
269
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
);
|
|
288
|
-
|
|
270
|
+
// Check if source has a more specific type (union type vs generic type)
|
|
271
|
+
if (sourceType) {
|
|
272
|
+
const sourceIsUnion =
|
|
273
|
+
sourceType.includes("'") && sourceType.includes(' | ');
|
|
274
|
+
|
|
275
|
+
if (sourceIsUnion) {
|
|
276
|
+
// Target doesn't exist or is generic - propagate the union type
|
|
277
|
+
const targetIsGeneric =
|
|
278
|
+
!targetType || targetType === 'string' || targetType === 'unknown';
|
|
279
|
+
|
|
280
|
+
if (targetIsGeneric) {
|
|
281
|
+
structure[target] = sourceType;
|
|
282
|
+
}
|
|
289
283
|
}
|
|
290
284
|
}
|
|
291
285
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { JsonTypeDefinition } from '~codeyam/types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Check whether all non-`_nullable` children of an object are simple strings.
|
|
5
|
+
* "Leaf-like" nullable objects (all-string children) get collapsed to
|
|
6
|
+
* `"object | null"` so the LLM knows the field can be null.
|
|
7
|
+
* Objects with nested structure (object/array children) keep their shape
|
|
8
|
+
* so the LLM can still generate proper data when the field is truthy.
|
|
9
|
+
*/
|
|
10
|
+
function isLeafLikeObject(obj: Record<string, any>): boolean {
|
|
11
|
+
for (const key of Object.keys(obj)) {
|
|
12
|
+
if (key === '_nullable') continue;
|
|
13
|
+
const value = obj[key];
|
|
14
|
+
if (typeof value !== 'string') return false;
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Collapse *leaf-like* nullable objects/arrays in the data structure to type strings.
|
|
21
|
+
*
|
|
22
|
+
* When convertDotNotation marks an object or array as `_nullable: true`
|
|
23
|
+
* (meaning the schema had `object | undefined`, `object | null`, etc.),
|
|
24
|
+
* we decide whether to collapse it:
|
|
25
|
+
*
|
|
26
|
+
* - **Leaf-like** (all children are simple strings): collapse to `"object | null"`.
|
|
27
|
+
* Example: `{ _nullable: true, type: "string", path: "string" }` → `"object | null"`
|
|
28
|
+
*
|
|
29
|
+
* - **Rich** (has object/array children): strip `_nullable` and keep the structure
|
|
30
|
+
* so the LLM can generate proper nested data when the field is truthy.
|
|
31
|
+
* Example: `{ _nullable: true, items: [...], name: "string" }` → `{ items: [...], name: "string" }`
|
|
32
|
+
*
|
|
33
|
+
* Non-nullable objects are recursively processed but left as nested structures.
|
|
34
|
+
*/
|
|
35
|
+
export default function collapseNullableObjects(
|
|
36
|
+
data: JsonTypeDefinition,
|
|
37
|
+
): JsonTypeDefinition {
|
|
38
|
+
if (typeof data !== 'object' || data === null) {
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (Array.isArray(data)) {
|
|
43
|
+
return data.map((item: any) =>
|
|
44
|
+
typeof item === 'object' && item !== null
|
|
45
|
+
? collapseNullableObjects(item as JsonTypeDefinition)
|
|
46
|
+
: item,
|
|
47
|
+
) as any as JsonTypeDefinition;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const result: JsonTypeDefinition = {};
|
|
51
|
+
|
|
52
|
+
for (const key of Object.keys(data)) {
|
|
53
|
+
// Skip the _nullable marker itself (shouldn't appear at top level, but be safe)
|
|
54
|
+
if (key === '_nullable') continue;
|
|
55
|
+
|
|
56
|
+
const value = data[key];
|
|
57
|
+
|
|
58
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
59
|
+
const hasNullable = (value as any)._nullable === true;
|
|
60
|
+
if (hasNullable && isLeafLikeObject(value as Record<string, any>)) {
|
|
61
|
+
// Leaf-like nullable object → collapse to type string
|
|
62
|
+
const childKeys = Object.keys(value as any).filter(
|
|
63
|
+
(k) => k !== '_nullable',
|
|
64
|
+
);
|
|
65
|
+
console.log(
|
|
66
|
+
`[collapseNullableObjects] collapsed "${key}" → "object | null" (leaf-like, children: [${childKeys.join(', ')}])`,
|
|
67
|
+
);
|
|
68
|
+
result[key] = 'object | null';
|
|
69
|
+
} else if (hasNullable) {
|
|
70
|
+
// Rich nullable object → strip _nullable, keep structure
|
|
71
|
+
const childKeys = Object.keys(value as any).filter(
|
|
72
|
+
(k) => k !== '_nullable',
|
|
73
|
+
);
|
|
74
|
+
console.log(
|
|
75
|
+
`[collapseNullableObjects] kept structure for nullable "${key}" (rich, children: [${childKeys.join(', ')}])`,
|
|
76
|
+
);
|
|
77
|
+
result[key] = collapseNullableObjects(value as JsonTypeDefinition);
|
|
78
|
+
} else {
|
|
79
|
+
// Non-nullable → recurse
|
|
80
|
+
result[key] = collapseNullableObjects(value as JsonTypeDefinition);
|
|
81
|
+
}
|
|
82
|
+
} else if (Array.isArray(value)) {
|
|
83
|
+
const hasNullable = (value as any)._nullable === true;
|
|
84
|
+
if (
|
|
85
|
+
hasNullable &&
|
|
86
|
+
value.length <= 1 &&
|
|
87
|
+
value.every((v) => typeof v === 'string')
|
|
88
|
+
) {
|
|
89
|
+
// Leaf-like nullable array → collapse to type string
|
|
90
|
+
console.log(
|
|
91
|
+
`[collapseNullableObjects] collapsed "${key}" → "array | null" (leaf-like)`,
|
|
92
|
+
);
|
|
93
|
+
result[key] = 'array | null';
|
|
94
|
+
} else if (hasNullable) {
|
|
95
|
+
// Rich nullable array → strip _nullable, keep structure
|
|
96
|
+
console.log(
|
|
97
|
+
`[collapseNullableObjects] kept structure for nullable array "${key}" (${value.length} elements)`,
|
|
98
|
+
);
|
|
99
|
+
result[key] = value.map((item) =>
|
|
100
|
+
typeof item === 'object' && item !== null
|
|
101
|
+
? collapseNullableObjects(item as JsonTypeDefinition)
|
|
102
|
+
: item,
|
|
103
|
+
) as JsonTypeDefinition[];
|
|
104
|
+
} else {
|
|
105
|
+
// Non-nullable → recurse elements
|
|
106
|
+
result[key] = value.map((item) =>
|
|
107
|
+
typeof item === 'object' && item !== null
|
|
108
|
+
? collapseNullableObjects(item as JsonTypeDefinition)
|
|
109
|
+
: item,
|
|
110
|
+
) as JsonTypeDefinition[];
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
result[key] = value;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
@@ -139,16 +139,19 @@ export function gatherAttributesMap(
|
|
|
139
139
|
// Use merged type if available, otherwise fall back to isolated type
|
|
140
140
|
const typeValue =
|
|
141
141
|
mergedSignatureSchema[key] ?? isolatedSignatureSchema[key];
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
142
|
+
// Handle array case (OR expressions) - use first element if array
|
|
143
|
+
const rawEquivalent = equivalentSignatureVariables[keyParts[0]];
|
|
144
|
+
const equivalentSignatureVariable = Array.isArray(rawEquivalent)
|
|
145
|
+
? rawEquivalent[0]
|
|
146
|
+
: rawEquivalent;
|
|
147
|
+
const equivalentSignatureVariableParts = equivalentSignatureVariable
|
|
148
|
+
? splitOutsideParenthesesAndArrays(equivalentSignatureVariable)
|
|
149
|
+
: [];
|
|
147
150
|
if (
|
|
148
151
|
equivalentSignatureVariable &&
|
|
149
|
-
!equivalentSignatureVariableParts[0]
|
|
152
|
+
!equivalentSignatureVariableParts[0]?.includes('(')
|
|
150
153
|
) {
|
|
151
|
-
const equivalentKey =
|
|
154
|
+
const equivalentKey = equivalentSignatureVariable;
|
|
152
155
|
const equivalentPath = joinParenthesesAndArrays([
|
|
153
156
|
equivalentKey,
|
|
154
157
|
...keyParts.slice(1),
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from '~codeyam/types';
|
|
8
8
|
import noErrorAttributes from './noErrorAttributes';
|
|
9
9
|
import simplifyKeysForLLM from './simplifyKeysForLLM';
|
|
10
|
+
import collapseNullableObjects from './collapseNullableObjects';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Sort object keys by the size of their JSON-stringified values (smallest first).
|
|
@@ -99,11 +100,17 @@ ${JSON.stringify(defaultScenarioData.data, null, 2)}
|
|
|
99
100
|
// while the reconcileMockDataKeys function will still match the simplified response back to original keys.
|
|
100
101
|
// Then sort keys by size (smallest first) so small keys appear before large keys,
|
|
101
102
|
// increasing the chance the LLM generates all keys for large schemas.
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
|
|
104
|
+
const afterNoError = structure.dataForMocks
|
|
105
|
+
? (noErrorAttributes(structure.dataForMocks) as JsonTypeDefinition)
|
|
106
|
+
: null;
|
|
107
|
+
|
|
108
|
+
const afterSimplify = afterNoError ? simplifyKeysForLLM(afterNoError) : null;
|
|
109
|
+
|
|
110
|
+
const cleanedDataForMocks = afterSimplify
|
|
111
|
+
? collapseNullableObjects(afterSimplify)
|
|
106
112
|
: null;
|
|
113
|
+
|
|
107
114
|
const sortedDataForMocks =
|
|
108
115
|
cleanedDataForMocks &&
|
|
109
116
|
typeof cleanedDataForMocks === 'object' &&
|
|
@@ -111,6 +118,19 @@ ${JSON.stringify(defaultScenarioData.data, null, 2)}
|
|
|
111
118
|
? sortKeysBySize(cleanedDataForMocks as Record<string, any>)
|
|
112
119
|
: cleanedDataForMocks;
|
|
113
120
|
|
|
121
|
+
// Log nullable-related content in final prompt JSON
|
|
122
|
+
if (sortedDataForMocks) {
|
|
123
|
+
const finalJson = JSON.stringify(sortedDataForMocks, null, 2);
|
|
124
|
+
const hasNullableMarker = finalJson.includes('_nullable');
|
|
125
|
+
const nullCollapsed = (finalJson.match(/"object \| null"/g) || []).length;
|
|
126
|
+
const arrayCollapsed = (finalJson.match(/"array \| null"/g) || []).length;
|
|
127
|
+
if (hasNullableMarker || nullCollapsed > 0 || arrayCollapsed > 0) {
|
|
128
|
+
console.log(
|
|
129
|
+
`[generateEntityScenarioDataGenerator] final prompt: ${nullCollapsed} "object | null", ${arrayCollapsed} "array | null"${hasNullableMarker ? ', WARNING: _nullable still present!' : ''}`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
114
134
|
// When mockData has already been generated via chunks, skip it in the main call
|
|
115
135
|
const mockDataSection = options?.mockDataAlreadyGenerated
|
|
116
136
|
? '## mockData Structure\nmockData has been pre-generated—return `{}` for mockData.'
|
|
@@ -525,7 +525,7 @@ function findControllableBaseForDerivedPath(
|
|
|
525
525
|
export default function resolvePathToControllable(
|
|
526
526
|
localPath: string,
|
|
527
527
|
attributesMap: Record<string, string>,
|
|
528
|
-
equivalentSignatureVariables: Record<string, string>,
|
|
528
|
+
equivalentSignatureVariables: Record<string, string | string[]>,
|
|
529
529
|
fullToShortPathMap: Record<string, string>,
|
|
530
530
|
): PathResolutionResult {
|
|
531
531
|
const chain: string[] = [localPath];
|
|
@@ -600,7 +600,11 @@ export default function resolvePathToControllable(
|
|
|
600
600
|
|
|
601
601
|
// 4. Equivalent variable resolution
|
|
602
602
|
const localVarName = extractLocalVariableName(localPath);
|
|
603
|
-
|
|
603
|
+
// Handle array case (OR expressions) - use first element if array
|
|
604
|
+
const rawDataSourceBase = equivalentSignatureVariables[localVarName];
|
|
605
|
+
const dataSourceBase = Array.isArray(rawDataSourceBase)
|
|
606
|
+
? rawDataSourceBase[0]
|
|
607
|
+
: rawDataSourceBase;
|
|
604
608
|
|
|
605
609
|
if (dataSourceBase) {
|
|
606
610
|
chain.push(`equivalent var: ${localVarName} → ${dataSourceBase}`);
|
|
@@ -626,18 +630,26 @@ export default function resolvePathToControllable(
|
|
|
626
630
|
baseVarName in equivalentSignatureVariables &&
|
|
627
631
|
baseVarName !== localVarName
|
|
628
632
|
) {
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
633
|
+
// Handle array case (OR expressions) - use first element if array
|
|
634
|
+
const rawBaseDataSource = equivalentSignatureVariables[baseVarName];
|
|
635
|
+
const baseDataSource = Array.isArray(rawBaseDataSource)
|
|
636
|
+
? rawBaseDataSource[0]
|
|
637
|
+
: rawBaseDataSource;
|
|
638
|
+
if (baseDataSource) {
|
|
639
|
+
chain.push(
|
|
640
|
+
`transitive resolution: ${baseVarName} → ${baseDataSource}`,
|
|
641
|
+
);
|
|
642
|
+
// Append the array access suffix to the resolved base
|
|
643
|
+
if (baseDataSource.endsWith('()')) {
|
|
644
|
+
fullResolvedPath =
|
|
645
|
+
baseDataSource + '.functionCallReturnValue' + accessSuffix;
|
|
646
|
+
} else if (baseDataSource.endsWith('.functionCallReturnValue')) {
|
|
647
|
+
fullResolvedPath = baseDataSource + accessSuffix;
|
|
648
|
+
} else {
|
|
649
|
+
fullResolvedPath = baseDataSource + accessSuffix;
|
|
650
|
+
}
|
|
651
|
+
chain.push(`transitively resolved: ${fullResolvedPath}`);
|
|
639
652
|
}
|
|
640
|
-
chain.push(`transitively resolved: ${fullResolvedPath}`);
|
|
641
653
|
}
|
|
642
654
|
}
|
|
643
655
|
|
|
@@ -63,7 +63,7 @@ export interface EnrichedConditionalUsage {
|
|
|
63
63
|
/** For comparison conditions, the literal values being compared against */
|
|
64
64
|
comparedValues?: string[];
|
|
65
65
|
/** Where this conditional usage occurs */
|
|
66
|
-
location: 'if' | 'ternary' | 'logical-and' | 'switch';
|
|
66
|
+
location: 'if' | 'ternary' | 'logical-and' | 'switch' | 'unconditional';
|
|
67
67
|
/**
|
|
68
68
|
* The traced source data path in the format "scopeName.path"
|
|
69
69
|
* e.g., "useParams().functionCallReturnValue['*']"
|
|
@@ -120,7 +120,8 @@ export interface SerializableDataStructure {
|
|
|
120
120
|
functionResults: Record<string, SerializableFunctionResult>;
|
|
121
121
|
|
|
122
122
|
// Equivalent signature variables for root scope
|
|
123
|
-
|
|
123
|
+
// Values can be arrays for OR expressions where a variable maps to multiple sources
|
|
124
|
+
equivalentSignatureVariables: Record<string, string | string[]>;
|
|
124
125
|
|
|
125
126
|
environmentVariables: string[];
|
|
126
127
|
|
|
@@ -296,7 +297,7 @@ export function getSourceEquivalencies(
|
|
|
296
297
|
|
|
297
298
|
export function getEquivalentSignatureVariables(
|
|
298
299
|
dataStructure: SerializableDataStructure,
|
|
299
|
-
): Record<string, string> {
|
|
300
|
+
): Record<string, string | string[]> {
|
|
300
301
|
return dataStructure.equivalentSignatureVariables;
|
|
301
302
|
}
|
|
302
303
|
|
|
@@ -41,6 +41,8 @@ export { default as mergeValidatedDataStructures } from './src/lib/files/scenari
|
|
|
41
41
|
|
|
42
42
|
export { discoverDirectDependencies } from './src/lib/files/analyze/dependencyResolver';
|
|
43
43
|
|
|
44
|
+
export { transformationTracer } from './src/lib/files/scenarios/TransformationTracer';
|
|
45
|
+
|
|
44
46
|
export { default as getAnalysisError } from './src/lib/utils/getAnalysisError';
|
|
45
47
|
export { default as measureAndReportExecutionTime } from './src/lib/utils/measureAndReportExecutionTime';
|
|
46
48
|
|