@codeyam/codeyam-cli 0.1.0-staging.1669d45 → 0.1.0-staging.323686
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 +8 -8
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +3 -3
- package/analyzer-template/packages/ai/index.ts +9 -1
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +48 -34
- package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +31 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +277 -8
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +73 -1
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +108 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +23 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +87 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +32 -7
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
- package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
- package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +626 -6
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +26 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +375 -6
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1003 -45
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
- package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +154 -32
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +22 -1
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
- package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +10 -13
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -7
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +142 -73
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +42 -5
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +77 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
- package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
- package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
- package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
- package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
- package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
- 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 +8 -1
- 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/analysesTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/types/index.ts +1 -0
- package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
- package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +64 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
- package/analyzer-template/playwright/capture.ts +20 -8
- package/analyzer-template/playwright/captureStatic.ts +1 -1
- package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
- package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
- package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
- package/analyzer-template/project/constructMockCode.ts +314 -29
- package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
- package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
- package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
- package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
- package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
- package/analyzer-template/project/orchestrateCapture.ts +71 -6
- package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
- package/analyzer-template/project/runAnalysis.ts +4 -0
- package/analyzer-template/project/start.ts +35 -11
- package/analyzer-template/project/writeMockDataTsx.ts +114 -2
- package/analyzer-template/project/writeScenarioComponents.ts +101 -8
- package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +255 -4
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
- package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +32 -11
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +89 -2
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
- package/background/src/lib/virtualized/project/writeScenarioComponents.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/commands/memory.js +273 -0
- package/codeyam-cli/src/commands/memory.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analysisRunner.js +21 -2
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +20 -6
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +1 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +6 -0
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/rules/index.js +5 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -0
- package/codeyam-cli/src/utils/rules/parser.js +106 -0
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +132 -0
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +40 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +92 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-DVzYx8PN.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.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-memory-hook.sh +200 -0
- package/codeyam-cli/templates/codeyam:debug.md +47 -3
- package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
- package/codeyam-cli/templates/codeyam:memory.md +462 -0
- package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
- package/package.json +8 -5
- package/packages/ai/index.js +5 -2
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +41 -17
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +24 -0
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +228 -11
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +161 -30
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +86 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +19 -0
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +70 -2
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +29 -7
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructureChunking.js +111 -0
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
- package/packages/ai/src/lib/e2eDataTracking.js +241 -0
- package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
- package/packages/ai/src/lib/generateEntityScenarioData.js +510 -7
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +19 -1
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +273 -4
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +738 -40
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
- package/packages/ai/src/lib/resolvePathToControllable.js +131 -27
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
- package/packages/analyze/src/lib/analysisContext.js +30 -5
- package/packages/analyze/src/lib/analysisContext.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +8 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -7
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +116 -66
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +37 -5
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +65 -0
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +8 -1
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/packages/database/src/lib/loadAnalyses.js +45 -2
- package/packages/database/src/lib/loadAnalyses.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +8 -0
- package/packages/database/src/lib/loadAnalysis.js.map +1 -1
- package/packages/database/src/lib/loadBranch.js +11 -1
- package/packages/database/src/lib/loadBranch.js.map +1 -1
- package/packages/database/src/lib/loadCommit.js +7 -0
- package/packages/database/src/lib/loadCommit.js.map +1 -1
- package/packages/database/src/lib/loadCommits.js +22 -1
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +23 -4
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/loadEntityBranches.js +9 -0
- package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +5 -4
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/types/index.js.map +1 -1
- package/packages/utils/src/lib/safeFileName.js +29 -3
- package/packages/utils/src/lib/safeFileName.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
- package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
|
@@ -6,6 +6,7 @@ import { methodRegistry, ArrayPushSemantics } from "./methodSemantics.js";
|
|
|
6
6
|
import { isArithmeticOperator, isAssignmentOperator, isBitwiseCompoundOperator, isComparisonOperator, isDefinedType, isNumericCompoundOperator, leftOrRightType, unwrapExpression, } from "./sharedPatterns.js";
|
|
7
7
|
import { processBindingPattern } from "./processBindings.js";
|
|
8
8
|
import { extractConditionalEffectsFromTernary, findUseStateSetters, } from "./conditionalEffectsExtractor.js";
|
|
9
|
+
import { detectArrayDerivedPattern } from "./arrayDerivationDetector.js";
|
|
9
10
|
/**
|
|
10
11
|
* Extracts the component name from a JSX element.
|
|
11
12
|
* Returns null for intrinsic elements (div, span, etc.) since we only care about
|
|
@@ -273,6 +274,123 @@ function getSourceLocation(node, sourceFile) {
|
|
|
273
274
|
: codeSnippet,
|
|
274
275
|
};
|
|
275
276
|
}
|
|
277
|
+
/**
|
|
278
|
+
* Extracts the root array path from an expression that ends with .map().
|
|
279
|
+
* Handles chained methods like .filter().map(), .slice().map(), etc.
|
|
280
|
+
*
|
|
281
|
+
* Examples:
|
|
282
|
+
* - items.map(...) → "items"
|
|
283
|
+
* - data.users.map(...) → "data.users"
|
|
284
|
+
* - items.filter(...).map(...) → "items"
|
|
285
|
+
* - items.slice(0, 5).map(...) → "items"
|
|
286
|
+
*/
|
|
287
|
+
function extractArrayPathFromMapCall(expr, sourceFile) {
|
|
288
|
+
// Walk up the chain to find the root array
|
|
289
|
+
let current = expr.expression;
|
|
290
|
+
while (ts.isPropertyAccessExpression(current)) {
|
|
291
|
+
const methodName = current.name.getText(sourceFile);
|
|
292
|
+
// Common array methods that return arrays (so we keep going up)
|
|
293
|
+
const arrayReturningMethods = [
|
|
294
|
+
'map',
|
|
295
|
+
'filter',
|
|
296
|
+
'slice',
|
|
297
|
+
'concat',
|
|
298
|
+
'flat',
|
|
299
|
+
'flatMap',
|
|
300
|
+
'reverse',
|
|
301
|
+
'sort',
|
|
302
|
+
'toReversed',
|
|
303
|
+
'toSorted',
|
|
304
|
+
'toSpliced',
|
|
305
|
+
];
|
|
306
|
+
if (arrayReturningMethods.includes(methodName)) {
|
|
307
|
+
const objectExpr = current.expression;
|
|
308
|
+
// If the object is a call expression (chained method), keep going
|
|
309
|
+
if (ts.isCallExpression(objectExpr)) {
|
|
310
|
+
current = objectExpr.expression;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
// Found the root - it's an identifier or property access
|
|
314
|
+
const path = StructuredPath.fromNode(objectExpr, sourceFile);
|
|
315
|
+
return path ? path.toString() : null;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
// Not an array method we recognize
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Extracts JSX rendering usages from a JSX expression.
|
|
327
|
+
* Detects:
|
|
328
|
+
* - array.map() calls → 'array-map' type
|
|
329
|
+
* - string interpolations (identifiers/property access) → 'text-interpolation' type
|
|
330
|
+
*
|
|
331
|
+
* Recursively searches inside && chains and ternary expressions.
|
|
332
|
+
*
|
|
333
|
+
* @param expr The expression inside {expr}
|
|
334
|
+
* @param context The analysis context
|
|
335
|
+
*/
|
|
336
|
+
function extractJsxRenderingUsage(expr, context) {
|
|
337
|
+
const unwrapped = unwrapExpression(expr);
|
|
338
|
+
const sourceLocation = getSourceLocation(expr, context.sourceFile);
|
|
339
|
+
// Detect array.map() calls
|
|
340
|
+
if (ts.isCallExpression(unwrapped)) {
|
|
341
|
+
const calleeExpr = unwrapped.expression;
|
|
342
|
+
if (ts.isPropertyAccessExpression(calleeExpr)) {
|
|
343
|
+
const methodName = calleeExpr.name.getText(context.sourceFile);
|
|
344
|
+
if (methodName === 'map') {
|
|
345
|
+
const arrayPath = extractArrayPathFromMapCall(unwrapped, context.sourceFile);
|
|
346
|
+
if (arrayPath) {
|
|
347
|
+
context.addJsxRenderingUsage({
|
|
348
|
+
path: arrayPath,
|
|
349
|
+
renderingType: 'array-map',
|
|
350
|
+
valueType: 'array',
|
|
351
|
+
sourceLocation,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Detect simple string interpolations: {title} or {user.name}
|
|
358
|
+
else if (ts.isIdentifier(unwrapped) ||
|
|
359
|
+
ts.isPropertyAccessExpression(unwrapped)) {
|
|
360
|
+
const path = StructuredPath.fromNode(unwrapped, context.sourceFile);
|
|
361
|
+
if (path) {
|
|
362
|
+
const pathStr = path.toString();
|
|
363
|
+
const typeInfo = context.getTypeInfo(path);
|
|
364
|
+
// Only track as text interpolation if it's a string type
|
|
365
|
+
// Check for 'string' type, or types that contain 'string' (but not 'string[]')
|
|
366
|
+
if (typeInfo === 'string' ||
|
|
367
|
+
(typeInfo &&
|
|
368
|
+
typeInfo.includes('string') &&
|
|
369
|
+
!typeInfo.includes('string[]'))) {
|
|
370
|
+
context.addJsxRenderingUsage({
|
|
371
|
+
path: pathStr,
|
|
372
|
+
renderingType: 'text-interpolation',
|
|
373
|
+
valueType: 'string',
|
|
374
|
+
sourceLocation,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Recursively search inside && chains: {showList && items.map(...)}
|
|
380
|
+
else if (ts.isBinaryExpression(unwrapped) &&
|
|
381
|
+
unwrapped.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
382
|
+
// Check the right side of the && chain (where .map() typically appears)
|
|
383
|
+
const rightSide = unwrapExpression(unwrapped.right);
|
|
384
|
+
extractJsxRenderingUsage(rightSide, context);
|
|
385
|
+
// Also check nested && chains on the left
|
|
386
|
+
extractJsxRenderingUsage(unwrapped.left, context);
|
|
387
|
+
}
|
|
388
|
+
// Recursively search inside ternaries: {isEmpty ? null : items.map(...)}
|
|
389
|
+
else if (ts.isConditionalExpression(unwrapped)) {
|
|
390
|
+
extractJsxRenderingUsage(unwrapped.whenTrue, context);
|
|
391
|
+
extractJsxRenderingUsage(unwrapped.whenFalse, context);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
276
394
|
/**
|
|
277
395
|
* Counts the number of conditions in an && chain (excluding JSX consequence)
|
|
278
396
|
*/
|
|
@@ -330,6 +448,9 @@ function extractConditionalsFromJsx(node, context, parentConditions = []) {
|
|
|
330
448
|
// Process JSX expressions: {expr}
|
|
331
449
|
if (ts.isJsxExpression(child) && child.expression) {
|
|
332
450
|
const expr = unwrapExpression(child.expression);
|
|
451
|
+
// Extract JSX rendering usages (array.map, text interpolation)
|
|
452
|
+
// This handles direct usages like {items.map(...)} or {user.name}
|
|
453
|
+
extractJsxRenderingUsage(expr, context);
|
|
333
454
|
// If the expression is an && chain, extract its conditional usages
|
|
334
455
|
if (ts.isBinaryExpression(expr) &&
|
|
335
456
|
expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
@@ -568,8 +689,42 @@ function extractConditionalsFromJsx(node, context, parentConditions = []) {
|
|
|
568
689
|
}
|
|
569
690
|
// Recursively process nested JSX elements - Fix 32: pass parent conditions
|
|
570
691
|
else if (ts.isJsxElement(child)) {
|
|
692
|
+
// Check if this is a user-defined component (vs intrinsic element like div)
|
|
693
|
+
// If it's a component AND there are parent conditions, record the gating conditions
|
|
694
|
+
const componentName = getComponentNameFromJsx(child);
|
|
695
|
+
if (componentName && parentConditions.length > 0) {
|
|
696
|
+
for (const condition of parentConditions) {
|
|
697
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
698
|
+
path: condition.path,
|
|
699
|
+
conditionType: 'truthiness',
|
|
700
|
+
location: 'ternary',
|
|
701
|
+
sourceLocation: condition.sourceLocation,
|
|
702
|
+
controlsJsxRendering: true,
|
|
703
|
+
isNegated: condition.isNegated,
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
}
|
|
571
707
|
extractConditionalsFromJsx(child, context, parentConditions);
|
|
572
708
|
}
|
|
709
|
+
// Handle self-closing JSX elements (e.g., <ScenarioViewer />)
|
|
710
|
+
else if (ts.isJsxSelfClosingElement(child)) {
|
|
711
|
+
// Check if this is a user-defined component (vs intrinsic element like div)
|
|
712
|
+
// If it's a component AND there are parent conditions, record the gating conditions
|
|
713
|
+
const componentName = getComponentNameFromJsx(child);
|
|
714
|
+
if (componentName && parentConditions.length > 0) {
|
|
715
|
+
for (const condition of parentConditions) {
|
|
716
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
717
|
+
path: condition.path,
|
|
718
|
+
conditionType: 'truthiness',
|
|
719
|
+
location: 'ternary',
|
|
720
|
+
sourceLocation: condition.sourceLocation,
|
|
721
|
+
controlsJsxRendering: true,
|
|
722
|
+
isNegated: condition.isNegated,
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
// Self-closing elements have no children, so no recursion needed
|
|
727
|
+
}
|
|
573
728
|
// Recursively process nested JSX fragments - Fix 32: pass parent conditions
|
|
574
729
|
else if (ts.isJsxFragment(child)) {
|
|
575
730
|
extractConditionalsFromJsx(child, context, parentConditions);
|
|
@@ -640,12 +795,33 @@ export function extractConditionalUsage(condition, context, location, options =
|
|
|
640
795
|
return;
|
|
641
796
|
}
|
|
642
797
|
// Handle binary expressions with || (logical OR)
|
|
643
|
-
// OR
|
|
798
|
+
// When OR is inside an && chain, we need to continue chain tracking
|
|
799
|
+
// and mark conditions as OR alternatives
|
|
644
800
|
if (ts.isBinaryExpression(unwrapped) &&
|
|
645
801
|
unwrapped.operatorToken.kind === ts.SyntaxKind.BarBarToken) {
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
802
|
+
if (chainInfo) {
|
|
803
|
+
// We're inside an && chain - continue tracking but mark as OR alternatives
|
|
804
|
+
// Generate an orGroupId so conditions from both sides can be grouped
|
|
805
|
+
const orGroupId = chainInfo.currentOrGroupId ?? `or_${crypto.randomUUID().slice(0, 8)}`;
|
|
806
|
+
// Process left side with OR group tracking
|
|
807
|
+
const leftChainInfo = {
|
|
808
|
+
...chainInfo,
|
|
809
|
+
currentOrGroupId: orGroupId,
|
|
810
|
+
};
|
|
811
|
+
extractWithChainTracking(unwrapped.left, leftChainInfo, false);
|
|
812
|
+
// Process right side with same OR group
|
|
813
|
+
// Note: we use leftChainInfo's currentPosition which may have been updated
|
|
814
|
+
const rightChainInfo = {
|
|
815
|
+
...leftChainInfo,
|
|
816
|
+
currentPosition: chainInfo.currentPosition,
|
|
817
|
+
};
|
|
818
|
+
extractWithChainTracking(unwrapped.right, rightChainInfo, false);
|
|
819
|
+
}
|
|
820
|
+
else {
|
|
821
|
+
// Not inside a chain - OR breaks into independent conditional checks
|
|
822
|
+
extractWithChainTracking(unwrapped.left, null, false);
|
|
823
|
+
extractWithChainTracking(unwrapped.right, null, false);
|
|
824
|
+
}
|
|
649
825
|
return;
|
|
650
826
|
}
|
|
651
827
|
// Handle comparison operators (===, !==, <, >, <=, >=)
|
|
@@ -671,7 +847,7 @@ export function extractConditionalUsage(condition, context, location, options =
|
|
|
671
847
|
return literalValue;
|
|
672
848
|
};
|
|
673
849
|
// Helper to add a condition
|
|
674
|
-
const addCondition = (path, conditionType, comparedValues, requiredValue) => {
|
|
850
|
+
const addCondition = (path, conditionType, comparedValues, requiredValue, sourceExpr) => {
|
|
675
851
|
const usage = {
|
|
676
852
|
path,
|
|
677
853
|
conditionType,
|
|
@@ -681,6 +857,16 @@ export function extractConditionalUsage(condition, context, location, options =
|
|
|
681
857
|
isNegated,
|
|
682
858
|
controlsJsxRendering,
|
|
683
859
|
};
|
|
860
|
+
// Check for inline array-derived patterns (.length) on the source expression
|
|
861
|
+
if (sourceExpr) {
|
|
862
|
+
const arrayDerived = detectArrayDerivedPattern(sourceExpr);
|
|
863
|
+
if (arrayDerived) {
|
|
864
|
+
usage.derivedFrom = {
|
|
865
|
+
operation: arrayDerived.operation,
|
|
866
|
+
sourcePath: arrayDerived.sourcePath,
|
|
867
|
+
};
|
|
868
|
+
}
|
|
869
|
+
}
|
|
684
870
|
// Add chain info if part of a compound conditional
|
|
685
871
|
if (chainInfo) {
|
|
686
872
|
usage.chainId = chainInfo.chainId;
|
|
@@ -695,6 +881,9 @@ export function extractConditionalUsage(condition, context, location, options =
|
|
|
695
881
|
comparedValues,
|
|
696
882
|
isNegated,
|
|
697
883
|
requiredValue,
|
|
884
|
+
...(chainInfo.currentOrGroupId && {
|
|
885
|
+
orGroupId: chainInfo.currentOrGroupId,
|
|
886
|
+
}),
|
|
698
887
|
});
|
|
699
888
|
}
|
|
700
889
|
context.addConditionalUsage(usage);
|
|
@@ -702,21 +891,21 @@ export function extractConditionalUsage(condition, context, location, options =
|
|
|
702
891
|
// Check if left is a variable and right is a literal
|
|
703
892
|
if (leftPath && isLiteralExpression(unwrapped.right)) {
|
|
704
893
|
const literalValue = getLiteralValue(unwrapped.right, context);
|
|
705
|
-
addCondition(leftPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated));
|
|
894
|
+
addCondition(leftPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated), unwrapped.left);
|
|
706
895
|
return;
|
|
707
896
|
}
|
|
708
897
|
// Check if right is a variable and left is a literal
|
|
709
898
|
if (rightPath && isLiteralExpression(unwrapped.left)) {
|
|
710
899
|
const literalValue = getLiteralValue(unwrapped.left, context);
|
|
711
|
-
addCondition(rightPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated));
|
|
900
|
+
addCondition(rightPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated), unwrapped.right);
|
|
712
901
|
return;
|
|
713
902
|
}
|
|
714
903
|
// Both sides are variables - record both as comparisons without specific values
|
|
715
904
|
if (leftPath) {
|
|
716
|
-
addCondition(leftPath.toLeftHandSideString(), 'comparison');
|
|
905
|
+
addCondition(leftPath.toLeftHandSideString(), 'comparison', undefined, undefined, unwrapped.left);
|
|
717
906
|
}
|
|
718
907
|
if (rightPath) {
|
|
719
|
-
addCondition(rightPath.toLeftHandSideString(), 'comparison');
|
|
908
|
+
addCondition(rightPath.toLeftHandSideString(), 'comparison', undefined, undefined, unwrapped.right);
|
|
720
909
|
}
|
|
721
910
|
return;
|
|
722
911
|
}
|
|
@@ -740,6 +929,15 @@ export function extractConditionalUsage(condition, context, location, options =
|
|
|
740
929
|
isNegated,
|
|
741
930
|
controlsJsxRendering,
|
|
742
931
|
};
|
|
932
|
+
// Check for inline array-derived patterns (.some(), .every(), .includes(), .length)
|
|
933
|
+
// This populates derivedFrom so downstream code can resolve to the base array path
|
|
934
|
+
const arrayDerived = detectArrayDerivedPattern(unwrapped);
|
|
935
|
+
if (arrayDerived) {
|
|
936
|
+
usage.derivedFrom = {
|
|
937
|
+
operation: arrayDerived.operation,
|
|
938
|
+
sourcePath: arrayDerived.sourcePath,
|
|
939
|
+
};
|
|
940
|
+
}
|
|
743
941
|
// Add chain info if part of a compound conditional
|
|
744
942
|
if (chainInfo) {
|
|
745
943
|
usage.chainId = chainInfo.chainId;
|
|
@@ -754,6 +952,9 @@ export function extractConditionalUsage(condition, context, location, options =
|
|
|
754
952
|
conditionType: 'truthiness',
|
|
755
953
|
isNegated,
|
|
756
954
|
requiredValue: !isNegated,
|
|
955
|
+
...(chainInfo.currentOrGroupId && {
|
|
956
|
+
orGroupId: chainInfo.currentOrGroupId,
|
|
957
|
+
}),
|
|
757
958
|
});
|
|
758
959
|
}
|
|
759
960
|
context.addConditionalUsage(usage);
|
|
@@ -1229,12 +1430,28 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
1229
1430
|
}
|
|
1230
1431
|
}
|
|
1231
1432
|
else if (operatorKind === ts.SyntaxKind.BarBarToken) {
|
|
1232
|
-
// For ||,
|
|
1433
|
+
// For ||, create equivalences to BOTH sides
|
|
1233
1434
|
// This enables data flow tracing through fallback expressions
|
|
1435
|
+
// e.g., `const item = items.find(...) || null` should trace to both:
|
|
1436
|
+
// - items[] (from the find result)
|
|
1437
|
+
// - null (from the fallback)
|
|
1234
1438
|
if (targetPath) {
|
|
1439
|
+
// Process left side recursively to capture its full equivalency chain
|
|
1440
|
+
processExpression({
|
|
1441
|
+
node: unwrappedNode.left,
|
|
1442
|
+
context,
|
|
1443
|
+
targetPath,
|
|
1444
|
+
});
|
|
1445
|
+
// Process right side recursively for completeness
|
|
1446
|
+
processExpression({
|
|
1447
|
+
node: unwrappedNode.right,
|
|
1448
|
+
context,
|
|
1449
|
+
targetPath,
|
|
1450
|
+
});
|
|
1451
|
+
// Set resultPath to left side for type inference
|
|
1235
1452
|
resultPath = StructuredPath.fromNode(unwrappedNode.left, context.sourceFile);
|
|
1236
1453
|
}
|
|
1237
|
-
// Note:
|
|
1454
|
+
// Note: When there's no targetPath, we don't recursively process
|
|
1238
1455
|
// because || is often used in boolean contexts where the full expression matters
|
|
1239
1456
|
}
|
|
1240
1457
|
}
|