@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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"buildTimestamp": "2026-01-
|
|
3
|
-
"buildTime":
|
|
4
|
-
"gitCommit": "
|
|
5
|
-
"nodeVersion": "v20.
|
|
6
|
-
"contentHash": "
|
|
7
|
-
"buildNumber":
|
|
8
|
-
"semanticVersion": "0.1.
|
|
9
|
-
"version": "0.1.
|
|
2
|
+
"buildTimestamp": "2026-01-30T00:55:52.181Z",
|
|
3
|
+
"buildTime": 1769734552181,
|
|
4
|
+
"gitCommit": "03236865a7602ab6d30df31e0ad3bee876906fb9",
|
|
5
|
+
"nodeVersion": "v20.20.0",
|
|
6
|
+
"contentHash": "05d53efd18fbc545b72ac5e31193346a32efa60861ecfb3bf24454bef6533f43",
|
|
7
|
+
"buildNumber": 549,
|
|
8
|
+
"semanticVersion": "0.1.549",
|
|
9
|
+
"version": "0.1.549 (2026-01-30T00:55+05d53ef)"
|
|
10
10
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
[1/
|
|
3
|
-
[1/
|
|
2
|
+
[1/30/2026, 12:55:52 AM] > codeyam-combo@1.0.0 mergeDependencies
|
|
3
|
+
[1/30/2026, 12:55:52 AM] > node ./scripts/mergePackageJsonFiles.cjs
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
[1/
|
|
6
|
+
[1/30/2026, 12:55:52 AM] Merged dependencies into root package.json
|
|
7
7
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@aws-sdk/client-ecs": "^3.956.0",
|
|
17
17
|
"@aws-sdk/client-s3": "^3.940.0",
|
|
18
18
|
"@aws-sdk/client-sqs": "^3.956.0",
|
|
19
|
-
"@aws-sdk/lib-storage": "^3.
|
|
19
|
+
"@aws-sdk/lib-storage": "^3.975.0",
|
|
20
20
|
"@aws-sdk/util-dynamodb": "^3.971.0",
|
|
21
21
|
"@octokit/auth-app": "^8.1.0",
|
|
22
22
|
"@octokit/rest": "^22.0.0",
|
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"p-retry": "^7.1.1",
|
|
37
37
|
"piscina": "^5.1.4",
|
|
38
38
|
"pixelmatch": "^5.3.0",
|
|
39
|
-
"playwright": "
|
|
39
|
+
"playwright": "1.58.0",
|
|
40
40
|
"sharp": "^0.34.5",
|
|
41
41
|
"simple-git": "^3.28.0",
|
|
42
|
-
"undici": "^7.
|
|
42
|
+
"undici": "^7.18.2",
|
|
43
43
|
"uuid": "^11.1.0",
|
|
44
44
|
"pluralize": "^8.0.0",
|
|
45
45
|
"yargs": "^18.0.0",
|
|
@@ -40,7 +40,10 @@ export { default as describeCodeChange } from './src/lib/describeCodeChange';
|
|
|
40
40
|
export { default as validateTypeStructure } from './src/lib/validateTypeStructure';
|
|
41
41
|
export { default as validateDataStructure } from './src/lib/validateDataStructure';
|
|
42
42
|
export { default as isolateScopes } from './src/lib/isolateScopes';
|
|
43
|
-
export {
|
|
43
|
+
export {
|
|
44
|
+
default as analyzeScope,
|
|
45
|
+
destroyWorkerPool,
|
|
46
|
+
} from './src/lib/analyzeScope';
|
|
44
47
|
export { default as logOrderedMap } from './src/lib/logOrderedMap';
|
|
45
48
|
export {
|
|
46
49
|
default as splitOutsideParentheses,
|
|
@@ -81,10 +84,15 @@ export {
|
|
|
81
84
|
getConditionalEffects,
|
|
82
85
|
getCompoundConditionals,
|
|
83
86
|
getChildBoundaryGatingConditions,
|
|
87
|
+
getJsxRenderingUsages,
|
|
84
88
|
} from './src/lib/worker/SerializableDataStructure';
|
|
85
89
|
export { parseJsonSafe } from './src/lib/parsers/parseJsonSafe';
|
|
86
90
|
export { default as completionCall } from './src/lib/completionCall';
|
|
87
91
|
|
|
92
|
+
// NOTE: E2E data tracking utilities (e2eDataTracking.ts) are NOT exported here
|
|
93
|
+
// because they use Node.js 'crypto' module which breaks browser builds.
|
|
94
|
+
// Import directly from '~codeyam/ai/src/lib/e2eDataTracking' when needed in Node.js tests.
|
|
95
|
+
|
|
88
96
|
// Wrapper detection
|
|
89
97
|
export { default as detectWrapperRequirements } from './src/lib/wrapperDetection/detectWrapperRequirements';
|
|
90
98
|
export { KNOWN_LIBRARY_HOOKS } from './src/lib/wrapperDetection/knownLibraryHooks';
|
|
@@ -49,6 +49,7 @@ let workerPool: Piscina<
|
|
|
49
49
|
AnalyzeScopeWorkerInput,
|
|
50
50
|
AnalyzeScopeWorkerOutput
|
|
51
51
|
> | null = null;
|
|
52
|
+
let workerPoolDestroyed = false;
|
|
52
53
|
|
|
53
54
|
/**
|
|
54
55
|
* Check if we're in Node.js main thread
|
|
@@ -65,11 +66,48 @@ function getIsMainThread(): boolean {
|
|
|
65
66
|
return isMainThread;
|
|
66
67
|
}
|
|
67
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Destroy the worker pool, freeing its ~2GB heap.
|
|
71
|
+
* Called after data structure preparation completes (the producing phase transition).
|
|
72
|
+
* The worker is not needed after this point — subsequent calls to ensureWorkerPool() will throw.
|
|
73
|
+
*/
|
|
74
|
+
export async function destroyWorkerPool() {
|
|
75
|
+
if (workerPool) {
|
|
76
|
+
const memBefore = process.memoryUsage();
|
|
77
|
+
console.log('CodeYam: Destroying worker pool...', {
|
|
78
|
+
rssBefore: `${Math.round(memBefore.rss / 1024 / 1024)}MB`,
|
|
79
|
+
heapBefore: `${Math.round(memBefore.heapUsed / 1024 / 1024)}MB`,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
await workerPool.destroy();
|
|
83
|
+
workerPool = null;
|
|
84
|
+
|
|
85
|
+
// Force GC if available to reclaim worker memory faster
|
|
86
|
+
if (global.gc) {
|
|
87
|
+
global.gc();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const memAfter = process.memoryUsage();
|
|
91
|
+
console.log('CodeYam: Worker pool destroyed', {
|
|
92
|
+
rssAfter: `${Math.round(memAfter.rss / 1024 / 1024)}MB`,
|
|
93
|
+
heapAfter: `${Math.round(memAfter.heapUsed / 1024 / 1024)}MB`,
|
|
94
|
+
rssDelta: `${Math.round((memAfter.rss - memBefore.rss) / 1024 / 1024)}MB`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
workerPoolDestroyed = true;
|
|
98
|
+
}
|
|
99
|
+
|
|
68
100
|
/**
|
|
69
101
|
* Lazy initialization of worker pool.
|
|
70
102
|
* Called on first use to ensure environment variables are set.
|
|
71
103
|
*/
|
|
72
104
|
function ensureWorkerPool() {
|
|
105
|
+
if (workerPoolDestroyed) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
'CodeYam: Worker pool was destroyed (post-producing phase). ' +
|
|
108
|
+
'analyzeScope should not be called after data structure preparation completes.',
|
|
109
|
+
);
|
|
110
|
+
}
|
|
73
111
|
if (workerPool !== null) return;
|
|
74
112
|
|
|
75
113
|
// Only initialize worker pool in Node.js environment
|
|
@@ -182,6 +220,9 @@ export async function analyzeScopeLocal({
|
|
|
182
220
|
string,
|
|
183
221
|
import('./astScopes/types').ConditionalUsage[]
|
|
184
222
|
> = {};
|
|
223
|
+
// Collect JSX rendering usages (arrays via .map(), strings via interpolation)
|
|
224
|
+
const allJsxRenderingUsages: import('./astScopes/types').JsxRenderingUsage[] =
|
|
225
|
+
[];
|
|
185
226
|
|
|
186
227
|
const astAnalysisResultWithStatements = statementScopes.map(
|
|
187
228
|
(statementScope) => {
|
|
@@ -204,16 +245,6 @@ export async function analyzeScopeLocal({
|
|
|
204
245
|
}
|
|
205
246
|
// Collect conditional effects from AST analysis
|
|
206
247
|
if (astAnalysisResult.conditionalEffects?.length > 0) {
|
|
207
|
-
console.log(
|
|
208
|
-
`[ConditionalEffects] analyzeScope collecting from statement "${statementScope.name}":`,
|
|
209
|
-
astAnalysisResult.conditionalEffects.map((e) => ({
|
|
210
|
-
setter: e.effect.setterName,
|
|
211
|
-
value: e.effect.value,
|
|
212
|
-
condition:
|
|
213
|
-
e.condition?.path ||
|
|
214
|
-
e.conditions?.map((c) => c.path).join(' && '),
|
|
215
|
-
})),
|
|
216
|
-
);
|
|
217
248
|
allConditionalEffects.push(...astAnalysisResult.conditionalEffects);
|
|
218
249
|
}
|
|
219
250
|
// Collect compound conditionals from AST analysis
|
|
@@ -241,6 +272,10 @@ export async function analyzeScopeLocal({
|
|
|
241
272
|
allChildBoundaryGatingConditions[childName].push(...usages);
|
|
242
273
|
}
|
|
243
274
|
}
|
|
275
|
+
// Collect JSX rendering usages from AST analysis
|
|
276
|
+
if (astAnalysisResult.jsxRenderingUsages?.length) {
|
|
277
|
+
allJsxRenderingUsages.push(...astAnalysisResult.jsxRenderingUsages);
|
|
278
|
+
}
|
|
244
279
|
return {
|
|
245
280
|
statementScope,
|
|
246
281
|
astAnalysisResult,
|
|
@@ -561,14 +596,7 @@ export async function analyzeScopeLocal({
|
|
|
561
596
|
|
|
562
597
|
// Add conditional effects from this scope's analysis
|
|
563
598
|
if (allConditionalEffects.length > 0) {
|
|
564
|
-
console.log(
|
|
565
|
-
`[ConditionalEffects] analyzeScope adding ${allConditionalEffects.length} effects to scopeDataStructure for scope "${scope.name}"`,
|
|
566
|
-
);
|
|
567
599
|
scopeDataStructure.addConditionalEffects(allConditionalEffects);
|
|
568
|
-
} else {
|
|
569
|
-
console.log(
|
|
570
|
-
`[ConditionalEffects] analyzeScope: no conditional effects found for scope "${scope.name}"`,
|
|
571
|
-
);
|
|
572
600
|
}
|
|
573
601
|
|
|
574
602
|
// Add compound conditionals from this scope's analysis
|
|
@@ -620,13 +648,9 @@ export async function analyzeScopeLocal({
|
|
|
620
648
|
);
|
|
621
649
|
}
|
|
622
650
|
|
|
623
|
-
//
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
console.log(
|
|
627
|
-
`[ConditionalEffects] analyzeScope will process ${childScopeNames.length} child scopes:`,
|
|
628
|
-
childScopeNames,
|
|
629
|
-
);
|
|
651
|
+
// Add JSX rendering usages from this scope's analysis
|
|
652
|
+
if (allJsxRenderingUsages.length > 0) {
|
|
653
|
+
scopeDataStructure.addJsxRenderingUsages(allJsxRenderingUsages);
|
|
630
654
|
}
|
|
631
655
|
|
|
632
656
|
await Promise.all(
|
|
@@ -719,16 +743,6 @@ export default async function analyzeScope(
|
|
|
719
743
|
try {
|
|
720
744
|
const result = await workerPool.run(workerInput);
|
|
721
745
|
|
|
722
|
-
// Log the conditional effects from the worker result
|
|
723
|
-
const workerConditionalEffects =
|
|
724
|
-
result.dataStructure?.conditionalEffects || [];
|
|
725
|
-
console.log(
|
|
726
|
-
`[ConditionalEffects] Worker returned ${workerConditionalEffects.length} conditional effects for ${entity.name}:`,
|
|
727
|
-
workerConditionalEffects.map(
|
|
728
|
-
(e: any) => `${e.effect?.setterName}(${e.effect?.value})`,
|
|
729
|
-
),
|
|
730
|
-
);
|
|
731
|
-
|
|
732
746
|
// Store the serializable data structure in the scope
|
|
733
747
|
scope.dataStructure = result.dataStructure as any;
|
|
734
748
|
return;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for detecting array-derived expressions in conditionals.
|
|
3
|
+
*
|
|
4
|
+
* These utilities detect patterns like:
|
|
5
|
+
* - arr.some(fn) → { sourcePath: 'arr', operation: 'arraySome' }
|
|
6
|
+
* - arr.every(fn) → { sourcePath: 'arr', operation: 'arrayEvery' }
|
|
7
|
+
* - arr.includes(x) → { sourcePath: 'arr', operation: 'arrayIncludes' }
|
|
8
|
+
* - arr.length → { sourcePath: 'arr', operation: 'arrayLength' }
|
|
9
|
+
*
|
|
10
|
+
* Used by both:
|
|
11
|
+
* - variableDeclarationHandler.ts (for variable assignments)
|
|
12
|
+
* - processExpression.ts (for inline conditionals)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import ts from 'typescript';
|
|
16
|
+
|
|
17
|
+
/** Array predicate method operations */
|
|
18
|
+
export type ArrayPredicateOperation =
|
|
19
|
+
| 'arrayIncludes'
|
|
20
|
+
| 'arraySome'
|
|
21
|
+
| 'arrayEvery';
|
|
22
|
+
|
|
23
|
+
/** Array length operation */
|
|
24
|
+
export type ArrayLengthOperation = 'arrayLength';
|
|
25
|
+
|
|
26
|
+
/** All array-derived operations */
|
|
27
|
+
export type ArrayDerivedOperation =
|
|
28
|
+
| ArrayPredicateOperation
|
|
29
|
+
| ArrayLengthOperation;
|
|
30
|
+
|
|
31
|
+
/** Result of detecting an array derivation pattern */
|
|
32
|
+
export interface ArrayDerivationResult {
|
|
33
|
+
sourcePath: string;
|
|
34
|
+
operation: ArrayDerivedOperation;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Extracts a simple path string from an expression.
|
|
39
|
+
* Returns the path for identifiers and property access chains.
|
|
40
|
+
*/
|
|
41
|
+
export function getSimplePath(node: ts.Expression): string | null {
|
|
42
|
+
if (ts.isIdentifier(node)) {
|
|
43
|
+
return node.text;
|
|
44
|
+
}
|
|
45
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
46
|
+
const objectPath = getSimplePath(node.expression);
|
|
47
|
+
if (objectPath) {
|
|
48
|
+
return `${objectPath}.${node.name.text}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Handle optional chaining: a?.b
|
|
52
|
+
if (ts.isNonNullExpression(node)) {
|
|
53
|
+
return getSimplePath(node.expression);
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Maps array method names to derivation operation names
|
|
60
|
+
*/
|
|
61
|
+
function getArrayPredicateOperation(
|
|
62
|
+
methodName: string,
|
|
63
|
+
): ArrayPredicateOperation | null {
|
|
64
|
+
switch (methodName) {
|
|
65
|
+
case 'includes':
|
|
66
|
+
return 'arrayIncludes';
|
|
67
|
+
case 'some':
|
|
68
|
+
return 'arraySome';
|
|
69
|
+
case 'every':
|
|
70
|
+
return 'arrayEvery';
|
|
71
|
+
default:
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Detects if an expression is an array predicate call and extracts the array path.
|
|
78
|
+
* Patterns detected:
|
|
79
|
+
* - arr.includes(x) → { sourcePath: 'arr', operation: 'arrayIncludes' }
|
|
80
|
+
* - arr?.includes(x) → { sourcePath: 'arr', operation: 'arrayIncludes' }
|
|
81
|
+
* - arr.some(fn) → { sourcePath: 'arr', operation: 'arraySome' }
|
|
82
|
+
* - arr.every(fn) → { sourcePath: 'arr', operation: 'arrayEvery' }
|
|
83
|
+
* - Boolean(x && arr?.includes(y)) → { sourcePath: 'arr', operation: 'arrayIncludes' }
|
|
84
|
+
*/
|
|
85
|
+
export function detectArrayPredicatePattern(
|
|
86
|
+
expr: ts.Expression,
|
|
87
|
+
): ArrayDerivationResult | null {
|
|
88
|
+
// Unwrap Boolean() calls: Boolean(x) → x
|
|
89
|
+
if (
|
|
90
|
+
ts.isCallExpression(expr) &&
|
|
91
|
+
ts.isIdentifier(expr.expression) &&
|
|
92
|
+
expr.expression.text === 'Boolean' &&
|
|
93
|
+
expr.arguments.length === 1
|
|
94
|
+
) {
|
|
95
|
+
return detectArrayPredicatePattern(expr.arguments[0]);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Handle logical AND: a && b - check both sides for array predicates
|
|
99
|
+
if (
|
|
100
|
+
ts.isBinaryExpression(expr) &&
|
|
101
|
+
expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken
|
|
102
|
+
) {
|
|
103
|
+
// Try the right side first (more likely to have the predicate)
|
|
104
|
+
const rightResult = detectArrayPredicatePattern(expr.right);
|
|
105
|
+
if (rightResult) return rightResult;
|
|
106
|
+
// Try the left side
|
|
107
|
+
const leftResult = detectArrayPredicatePattern(expr.left);
|
|
108
|
+
if (leftResult) return leftResult;
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Handle parenthesized expressions
|
|
113
|
+
if (ts.isParenthesizedExpression(expr)) {
|
|
114
|
+
return detectArrayPredicatePattern(expr.expression);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (!ts.isCallExpression(expr)) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const callExpr = expr.expression;
|
|
122
|
+
|
|
123
|
+
// Handle both regular property access (arr.includes) and optional chaining (arr?.includes)
|
|
124
|
+
let objectExpr: ts.Expression | null = null;
|
|
125
|
+
let methodName: string | null = null;
|
|
126
|
+
|
|
127
|
+
if (ts.isPropertyAccessExpression(callExpr)) {
|
|
128
|
+
objectExpr = callExpr.expression;
|
|
129
|
+
methodName = callExpr.name.text;
|
|
130
|
+
} else if (
|
|
131
|
+
ts.isElementAccessExpression(callExpr) &&
|
|
132
|
+
ts.isStringLiteral(callExpr.argumentExpression)
|
|
133
|
+
) {
|
|
134
|
+
// Handle arr["includes"]() syntax (rare but possible)
|
|
135
|
+
objectExpr = callExpr.expression;
|
|
136
|
+
methodName = callExpr.argumentExpression.text;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (!objectExpr || !methodName) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const operation = getArrayPredicateOperation(methodName);
|
|
144
|
+
if (!operation) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Get the source path for the array
|
|
149
|
+
const sourcePath = getSimplePath(objectExpr);
|
|
150
|
+
if (!sourcePath) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return { sourcePath, operation };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Detects if an expression is an array.length access.
|
|
159
|
+
* Patterns detected:
|
|
160
|
+
* - arr.length → { sourcePath: 'arr', operation: 'arrayLength' }
|
|
161
|
+
* - arr?.length → { sourcePath: 'arr', operation: 'arrayLength' }
|
|
162
|
+
*/
|
|
163
|
+
export function detectArrayLengthPattern(
|
|
164
|
+
expr: ts.Expression,
|
|
165
|
+
): ArrayDerivationResult | null {
|
|
166
|
+
// Handle property access: arr.length
|
|
167
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
168
|
+
if (expr.name.text === 'length') {
|
|
169
|
+
const sourcePath = getSimplePath(expr.expression);
|
|
170
|
+
if (sourcePath) {
|
|
171
|
+
return { sourcePath, operation: 'arrayLength' };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Detects any array-derived pattern (predicate methods or .length).
|
|
181
|
+
* This is the main entry point for inline conditional detection.
|
|
182
|
+
*/
|
|
183
|
+
export function detectArrayDerivedPattern(
|
|
184
|
+
expr: ts.Expression,
|
|
185
|
+
): ArrayDerivationResult | null {
|
|
186
|
+
// Check for array predicate methods first (.some, .every, .includes)
|
|
187
|
+
const predicateResult = detectArrayPredicatePattern(expr);
|
|
188
|
+
if (predicateResult) {
|
|
189
|
+
return predicateResult;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Check for .length access
|
|
193
|
+
const lengthResult = detectArrayLengthPattern(expr);
|
|
194
|
+
if (lengthResult) {
|
|
195
|
+
return lengthResult;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
@@ -109,6 +109,7 @@ export class ASTScopeAnalyzer {
|
|
|
109
109
|
private conditionalEffects: import('./types').ConditionalEffect[] = [];
|
|
110
110
|
private childBoundaryGatingConditions: Record<string, ConditionalUsage[]> =
|
|
111
111
|
{};
|
|
112
|
+
private jsxRenderingUsages: import('./types').JsxRenderingUsage[] = [];
|
|
112
113
|
/**
|
|
113
114
|
* Tracks derived boolean variables and their source expressions.
|
|
114
115
|
* Maps variable name to derivation info.
|
|
@@ -219,6 +220,7 @@ export class ASTScopeAnalyzer {
|
|
|
219
220
|
conditionalEffects: this.conditionalEffects,
|
|
220
221
|
derivedVariables: this.derivedVariables,
|
|
221
222
|
childBoundaryGatingConditions: this.childBoundaryGatingConditions,
|
|
223
|
+
jsxRenderingUsages: this.jsxRenderingUsages,
|
|
222
224
|
isComplete:
|
|
223
225
|
completeness.equivalences === 'full' &&
|
|
224
226
|
completeness.structures === 'full',
|
|
@@ -273,6 +275,8 @@ export class ASTScopeAnalyzer {
|
|
|
273
275
|
updateSchemaType: (path, newType) => this.updateSchemaType(path, newType),
|
|
274
276
|
addConditionalEffect: (effect) => this.addConditionalEffect(effect),
|
|
275
277
|
getConditionalEffects: () => this.conditionalEffects,
|
|
278
|
+
addJsxRenderingUsage: (usage) => this.addJsxRenderingUsage(usage),
|
|
279
|
+
getJsxRenderingUsages: () => this.jsxRenderingUsages,
|
|
276
280
|
};
|
|
277
281
|
return context;
|
|
278
282
|
}
|
|
@@ -603,6 +607,17 @@ export class ASTScopeAnalyzer {
|
|
|
603
607
|
const rightSideStr = rightSide?.toRightHandSideString();
|
|
604
608
|
|
|
605
609
|
if (leftSideStr && rightSideStr && leftSideStr !== rightSideStr) {
|
|
610
|
+
const existingValue = this.equivalentVariables[leftSideStr];
|
|
611
|
+
// Don't overwrite a meaningful value with 'undefined' or 'null'.
|
|
612
|
+
// This is critical for ternary conditionals like `const x = cond ? func() : undefined`
|
|
613
|
+
// or `const x = items.find(...) || null` where we want to preserve
|
|
614
|
+
// the equivalency to the more meaningful value (func()'s return value, items[]).
|
|
615
|
+
if (
|
|
616
|
+
existingValue &&
|
|
617
|
+
(rightSideStr === 'undefined' || rightSideStr === 'null')
|
|
618
|
+
) {
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
606
621
|
this.equivalentVariables[leftSideStr] = rightSideStr;
|
|
607
622
|
}
|
|
608
623
|
}
|
|
@@ -734,6 +749,22 @@ export class ASTScopeAnalyzer {
|
|
|
734
749
|
this.conditionalEffects.push(effect);
|
|
735
750
|
}
|
|
736
751
|
|
|
752
|
+
/**
|
|
753
|
+
* Add a JSX rendering usage (array.map() or text interpolation)
|
|
754
|
+
* Deduplicates by path and rendering type
|
|
755
|
+
*/
|
|
756
|
+
private addJsxRenderingUsage(
|
|
757
|
+
usage: import('./types').JsxRenderingUsage,
|
|
758
|
+
): void {
|
|
759
|
+
// Deduplicate: don't add if we already have the same path + renderingType
|
|
760
|
+
const exists = this.jsxRenderingUsages.some(
|
|
761
|
+
(u) => u.path === usage.path && u.renderingType === usage.renderingType,
|
|
762
|
+
);
|
|
763
|
+
if (!exists) {
|
|
764
|
+
this.jsxRenderingUsages.push(usage);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
737
768
|
/**
|
|
738
769
|
* Updates the schema type for a path, typically used when switch statements
|
|
739
770
|
* reveal the valid values for a parameter (creating a union type like "'a' | 'b' | 'c'")
|