@codeyam/codeyam-cli 0.1.0-staging.d0ad4ae → 0.1.0-staging.d4f25c3
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 +27 -27
- package/analyzer-template/packages/ai/index.ts +21 -5
- package/analyzer-template/packages/ai/package.json +3 -3
- package/analyzer-template/packages/ai/src/lib/__mocks__/completionCall.ts +122 -0
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +226 -24
- package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +217 -13
- package/analyzer-template/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.ts +644 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +181 -23
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.ts +18 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +15 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +181 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +1215 -29
- package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +265 -6
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +247 -66
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +2020 -334
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -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/BatchSchemaProcessor.ts +16 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +54 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +129 -20
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +140 -14
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +393 -90
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +183 -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/generateChangesEntityScenarioData.ts +4 -3
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +86 -149
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +59 -3
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +1458 -65
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +200 -196
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +677 -0
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +528 -0
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +2484 -0
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
- package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +5 -5
- package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +328 -7
- package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +111 -87
- package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +28 -170
- 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 +110 -6
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +14 -89
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.ts +58 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +11 -11
- package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +824 -0
- package/analyzer-template/packages/ai/src/lib/splitOutsideParentheses.ts +5 -1
- package/analyzer-template/packages/ai/src/lib/validateExecutionFlowPaths.ts +531 -0
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +122 -3
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
- package/analyzer-template/packages/analyze/index.ts +2 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +132 -33
- package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
- package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +447 -255
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +39 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -10
- package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +14 -14
- package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +4 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +11 -12
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
- package/analyzer-template/packages/analyze/src/lib/files/enums/steps.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1352 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +193 -76
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +203 -41
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.ts +28 -188
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +355 -23
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +166 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +2 -3
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +845 -72
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
- package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +10 -10
- package/analyzer-template/packages/database/index.ts +1 -0
- package/analyzer-template/packages/database/package.json +4 -4
- package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +22 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +17 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +164 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -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 +58 -19
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -9
- package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
- package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +5 -6
- package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
- package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +96 -152
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
- package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
- package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/index.js +1 -0
- package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +4 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +16 -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 +1 -18
- 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/kysely/tables/debugReportsTable.d.ts +17 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +29 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +6 -6
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.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 +45 -14
- 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 -10
- 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/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +5 -5
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/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 +76 -89
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts +3 -4
- package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.js +0 -1
- package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +71 -27
- 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/ProjectMetadata.d.ts +8 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +13 -54
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.js +1 -21
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +153 -5
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.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/github/package.json +2 -2
- package/analyzer-template/packages/types/index.ts +3 -6
- package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
- package/analyzer-template/packages/types/src/types/Analysis.ts +87 -27
- package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +8 -0
- package/analyzer-template/packages/types/src/types/Scenario.ts +13 -77
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +181 -5
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
- package/analyzer-template/packages/types/src/types/StatementInfo.ts +2 -0
- package/analyzer-template/packages/ui-components/package.json +1 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts +3 -4
- package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/index.js +0 -1
- package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +71 -27
- 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/ProjectMetadata.d.ts +8 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +13 -54
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js +1 -21
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +153 -5
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +98 -3
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.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/fs/rsyncCopy.ts +121 -3
- package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
- package/analyzer-template/playwright/capture.ts +20 -8
- package/analyzer-template/playwright/captureFromUrl.ts +89 -82
- package/analyzer-template/playwright/captureStatic.ts +1 -1
- package/analyzer-template/playwright/getCodeYamInfo.ts +12 -7
- package/analyzer-template/project/analyzeBaselineCommit.ts +9 -0
- package/analyzer-template/project/analyzeBranchCommit.ts +4 -0
- package/analyzer-template/project/analyzeFileEntities.ts +4 -0
- package/analyzer-template/project/analyzeRegularCommit.ts +9 -0
- package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
- package/analyzer-template/project/constructMockCode.ts +593 -91
- package/analyzer-template/project/controller/startController.ts +16 -1
- package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
- package/analyzer-template/project/executeLibraryFunctionDirect.ts +7 -3
- package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
- package/analyzer-template/project/mocks/analyzeFileMock.ts +8 -7
- 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 +75 -7
- package/analyzer-template/project/reconcileMockDataKeys.ts +220 -1
- package/analyzer-template/project/runAnalysis.ts +6 -0
- package/analyzer-template/project/start.ts +49 -12
- package/analyzer-template/project/startScenarioCapture.ts +9 -0
- package/analyzer-template/project/writeClientLogRoute.ts +125 -0
- package/analyzer-template/project/writeMockDataTsx.ts +312 -10
- package/analyzer-template/project/writeScenarioComponents.ts +314 -43
- package/analyzer-template/project/writeSimpleRoot.ts +21 -11
- package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
- package/analyzer-template/tsconfig.json +14 -1
- package/background/src/lib/local/createLocalAnalyzer.js +1 -1
- package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +7 -1
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeBranchCommit.js +2 -1
- package/background/src/lib/virtualized/project/analyzeBranchCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeFileEntities.js +2 -1
- package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js +7 -1
- 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 +493 -52
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/controller/startController.js +11 -1
- package/background/src/lib/virtualized/project/controller/startController.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/executeLibraryFunctionDirect.js +6 -3
- package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.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/mocks/analyzeFileMock.js +7 -7
- package/background/src/lib/virtualized/project/mocks/analyzeFileMock.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 +62 -7
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +184 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runAnalysis.js +5 -0
- package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +44 -12
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
- package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +263 -6
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +237 -41
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +386 -9
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
- package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
- package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
- package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
- package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
- package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
- package/codeyam-cli/src/cli.js +44 -24
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/codeyam-cli.js +18 -2
- package/codeyam-cli/src/codeyam-cli.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
- package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +56 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +21 -9
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/baseline.js +10 -11
- package/codeyam-cli/src/commands/baseline.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +37 -23
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +43 -35
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +4630 -0
- package/codeyam-cli/src/commands/editor.js.map +1 -0
- package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
- package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
- package/codeyam-cli/src/commands/init.js +148 -292
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +278 -0
- package/codeyam-cli/src/commands/memory.js.map +1 -0
- package/codeyam-cli/src/commands/recapture.js +31 -18
- package/codeyam-cli/src/commands/recapture.js.map +1 -1
- package/codeyam-cli/src/commands/report.js +46 -1
- package/codeyam-cli/src/commands/report.js.map +1 -1
- package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
- package/codeyam-cli/src/commands/setup-simulations.js +284 -0
- package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
- package/codeyam-cli/src/commands/start.js +8 -12
- package/codeyam-cli/src/commands/start.js.map +1 -1
- package/codeyam-cli/src/commands/telemetry.js +37 -0
- package/codeyam-cli/src/commands/telemetry.js.map +1 -0
- package/codeyam-cli/src/commands/test-startup.js +2 -0
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/commands/verify.js +14 -2
- package/codeyam-cli/src/commands/verify.js.map +1 -1
- package/codeyam-cli/src/data/techStacks.js +77 -0
- package/codeyam-cli/src/data/techStacks.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js +137 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +2379 -0
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
- package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
- package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +304 -0
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +194 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +315 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +542 -0
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +594 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
- package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
- package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +353 -0
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +221 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1559 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +280 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
- package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
- package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +1857 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
- package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +107 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
- package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
- package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
- package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
- package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +284 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
- package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +672 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js +81 -0
- package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +175 -82
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/telemetry.test.js +159 -0
- package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
- package/codeyam-cli/src/utils/analysisRunner.js +32 -16
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +16 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
- package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
- package/codeyam-cli/src/utils/backgroundServer.js +203 -30
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/buildFlags.js +4 -0
- package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
- package/codeyam-cli/src/utils/database.js +37 -2
- package/codeyam-cli/src/utils/database.js.map +1 -1
- package/codeyam-cli/src/utils/devModeEvents.js +40 -0
- package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
- package/codeyam-cli/src/utils/devServerState.js +71 -0
- package/codeyam-cli/src/utils/devServerState.js.map +1 -0
- package/codeyam-cli/src/utils/editorApi.js +79 -0
- package/codeyam-cli/src/utils/editorApi.js.map +1 -0
- package/codeyam-cli/src/utils/editorAudit.js +480 -0
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
- package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
- package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
- package/codeyam-cli/src/utils/editorCapture.js +102 -0
- package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
- package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
- package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
- package/codeyam-cli/src/utils/editorDevServer.js +197 -0
- package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js +50 -0
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
- package/codeyam-cli/src/utils/editorEntityHelpers.js +144 -0
- package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
- package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
- package/codeyam-cli/src/utils/editorJournal.js +225 -0
- package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js +152 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorMigration.js +224 -0
- package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
- package/codeyam-cli/src/utils/editorMockState.js +248 -0
- package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
- package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
- package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorPreview.js +137 -0
- package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js +112 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarios.js +557 -0
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
- package/codeyam-cli/src/utils/editorSeedAdapter.js +422 -0
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
- package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
- package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js +366 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js +196 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
- package/codeyam-cli/src/utils/fileMetadata.js +5 -0
- package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
- package/codeyam-cli/src/utils/fileWatcher.js +63 -9
- package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +4 -3
- package/codeyam-cli/src/utils/generateReport.js.map +1 -1
- package/codeyam-cli/src/utils/git.js +103 -0
- package/codeyam-cli/src/utils/git.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +134 -39
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
- package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
- package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
- package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
- package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
- package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
- package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
- package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
- package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
- package/codeyam-cli/src/utils/progress.js +8 -1
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/project.js +15 -5
- package/codeyam-cli/src/utils/project.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
- package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +75 -1
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +7 -0
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/requireSimulations.js +10 -0
- package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
- package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
- package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +229 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +74 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +376 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +113 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
- package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
- package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
- package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
- package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/index.js +7 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -0
- package/codeyam-cli/src/utils/rules/parser.js +93 -0
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js +49 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
- package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
- package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
- package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
- package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
- package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +137 -0
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js +77 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
- package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
- package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
- package/codeyam-cli/src/utils/scenariosManifest.js +285 -0
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
- package/codeyam-cli/src/utils/serverState.js +94 -12
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +96 -45
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +166 -0
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
- package/codeyam-cli/src/utils/slugUtils.js +25 -0
- package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
- package/codeyam-cli/src/utils/syncMocksMiddleware.js +7 -26
- package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/telemetry.js +106 -0
- package/codeyam-cli/src/utils/telemetry.js.map +1 -0
- package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
- package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
- package/codeyam-cli/src/utils/testRunner.js +158 -0
- package/codeyam-cli/src/utils/testRunner.js.map +1 -0
- package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
- package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
- package/codeyam-cli/src/utils/versionInfo.js +67 -15
- package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
- package/codeyam-cli/src/utils/webappDetection.js +35 -2
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +35 -0
- package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +80 -0
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
- package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +628 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +217 -0
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js +71 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/database.js +63 -33
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
- package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
- package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
- package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
- package/codeyam-cli/src/webserver/backgroundServer.js +186 -37
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +51 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CLe80MMu.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-Crt_KN_U.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-CD7lGABo.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-CgTNOhnu.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-CKeQT5Ty.js +25 -0
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-D3s1MFkb.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-By5zI316.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-CM5zg40N.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-C2PLkej3.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DanvyBPb.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-DUMfcNVK.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-D0LgAaSa.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-BA_Ry-rs.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/_index-BAWd-Xjf.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BOARiB-g.js +27 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-CHx25PAe.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-Bg3e7q4S.js +22 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.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/api.rule-path-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/book-open-CL-lMgHh.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-GmAjGS9-.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-BAdwhyCx.js +43 -0
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-DFcQkN5j.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/copy-C6iF61Xs.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-4ImjHTVC.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-C1gnJVOL.svg → cy-logo-cli-CCKUIm0S.svg} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C8y4mmyv.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor._tab-Gbk_i5Js.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DN5ouXAl.js +58 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-oepecPae.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-D0-YwkBh.js → entity._sha._-Blfy9UlN.js} +13 -13
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-KTQuL0aj.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C6eeL24i.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DQM8E7L4.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-C1H_a_Y3.js → entity._sha_.edit._scenarioId-CAoXLsQr.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-SuW9syRS.js} +6 -6
- package/codeyam-cli/src/webserver/build/client/assets/executionFlowCoverage-BWhdfn70.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-D-xGrg29.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-Bq_fbXP5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-fAqOD9ex.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-Bp1l4hSv.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-CWV9XZiG.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/index-DE3jI_dv.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/labs-B_IX45ih.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-De-7qQ2u.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/manifest-389033be.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-Cx2xEx7s.js +101 -0
- package/codeyam-cli/src/webserver/build/client/assets/pause-CFxEKL1u.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-DB3O9_9j.js +67 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-BdBb5aqc.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/settings-DdE-Untf.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-DSCdE99u.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/terminal-CrplD4b1.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-DqJ0j69l.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-DhXHbEjP.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BNd5hYuW.js +2 -0
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-Cy5Qg_UR.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/useToast-5HR2j9ZE.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
- package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-D_1MSYeW.js +13 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-ckWaCf_v.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/init-ld124R4Z.js +10 -0
- package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DzzNZGv_.js +551 -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/src/webserver/devServer.js +39 -5
- package/codeyam-cli/src/webserver/devServer.js.map +1 -1
- package/codeyam-cli/src/webserver/editorProxy.js +976 -0
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
- package/codeyam-cli/src/webserver/idleDetector.js +106 -0
- package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
- package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
- package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
- package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
- package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +266 -0
- package/codeyam-cli/src/webserver/server.js +376 -26
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +831 -0
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
- package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
- package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
- package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
- package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
- package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
- package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
- package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
- package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
- package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
- package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +147 -0
- package/codeyam-cli/templates/codeyam-editor-reference.md +214 -0
- package/codeyam-cli/templates/codeyam-memory-hook.sh +199 -0
- package/codeyam-cli/templates/commands/codeyam-diagnose.md +481 -0
- package/codeyam-cli/templates/editor-step-hook.py +321 -0
- package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
- package/codeyam-cli/templates/expo-react-native/README.md +41 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app.json +18 -0
- package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
- package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
- package/codeyam-cli/templates/expo-react-native/global.css +3 -0
- package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
- package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
- package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
- package/codeyam-cli/templates/expo-react-native/package.json +38 -0
- package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
- package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
- package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
- package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
- package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
- package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
- package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
- package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
- package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +24 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +64 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +39 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +40 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +127 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/SUPABASE_SETUP.md +104 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
- package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
- package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
- package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
- package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
- package/codeyam-cli/templates/rule-notification-hook.py +83 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +647 -0
- package/codeyam-cli/templates/rules-instructions.md +78 -0
- package/codeyam-cli/templates/seed-adapters/supabase.ts +282 -0
- package/codeyam-cli/templates/{codeyam-debug-skill.md → skills/codeyam-debug/SKILL.md} +48 -4
- package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +237 -0
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +211 -0
- package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +611 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
- package/codeyam-cli/templates/skills/codeyam-new-rule/SKILL.md +11 -0
- package/codeyam-cli/templates/{codeyam-setup-skill.md → skills/codeyam-setup/SKILL.md} +13 -1
- package/codeyam-cli/templates/{codeyam-sim-skill.md → skills/codeyam-sim/SKILL.md} +1 -1
- package/codeyam-cli/templates/{codeyam-test-skill.md → skills/codeyam-test/SKILL.md} +1 -1
- package/codeyam-cli/templates/{codeyam-verify-skill.md → skills/codeyam-verify/SKILL.md} +1 -1
- package/package.json +33 -22
- package/packages/ai/index.js +8 -6
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +179 -13
- 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 +160 -13
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js +435 -0
- package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js.map +1 -0
- package/packages/ai/src/lib/astScopes/methodSemantics.js +138 -23
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js +8 -0
- package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +7 -0
- package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +138 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +931 -29
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
- package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +188 -38
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1600 -189
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/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/BatchSchemaProcessor.js +13 -3
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +52 -3
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +111 -14
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +333 -81
- 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/dataStructure/helpers/stripNullableMarkers.js +34 -0
- package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
- package/packages/ai/src/lib/dataStructureChunking.js +130 -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/generateChangesEntityScenarioData.js +4 -3
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarios.js +78 -120
- package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +47 -2
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +1153 -60
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +177 -163
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +484 -0
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js +380 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js.map +1 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +1807 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
- package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -2
- package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
- package/packages/ai/src/lib/isolateScopes.js +270 -7
- package/packages/ai/src/lib/isolateScopes.js.map +1 -1
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
- package/packages/ai/src/lib/mergeStatements.js +88 -46
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +21 -119
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
- 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 +83 -6
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +10 -70
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js +45 -0
- package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +9 -9
- package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.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 +677 -0
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -0
- package/packages/ai/src/lib/splitOutsideParentheses.js +3 -1
- package/packages/ai/src/lib/splitOutsideParentheses.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js +29 -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/index.js +1 -0
- package/packages/analyze/index.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +109 -30
- package/packages/analyze/src/lib/ProjectAnalyzer.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/asts/index.js +4 -2
- package/packages/analyze/src/lib/asts/index.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +189 -41
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +28 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -10
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeChange.js +10 -10
- package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeEntity.js +4 -4
- package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeInitial.js +9 -10
- package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/enums/steps.js +1 -1
- package/packages/analyze/src/lib/files/enums/steps.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +907 -0
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +164 -68
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +178 -31
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js +29 -129
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +252 -21
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +104 -0
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +1 -0
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +2 -3
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +686 -55
- 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/analyze/src/lib/files/setImportedExports.js +2 -1
- package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/index.js +1 -0
- package/packages/analyze/src/lib/index.js.map +1 -1
- package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
- package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
- package/packages/database/index.js +1 -0
- package/packages/database/index.js.map +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/packages/database/src/lib/analysisToDb.js +1 -1
- package/packages/database/src/lib/analysisToDb.js.map +1 -1
- package/packages/database/src/lib/branchToDb.js +1 -1
- package/packages/database/src/lib/branchToDb.js.map +1 -1
- package/packages/database/src/lib/commitBranchToDb.js +1 -1
- package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
- package/packages/database/src/lib/commitToDb.js +1 -1
- package/packages/database/src/lib/commitToDb.js.map +1 -1
- package/packages/database/src/lib/fileToDb.js +1 -1
- package/packages/database/src/lib/fileToDb.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +16 -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/kysely/tables/debugReportsTable.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/packages/database/src/lib/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 +45 -14
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +23 -10
- 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/loadReadyToBeCapturedAnalyses.js +5 -5
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/packages/database/src/lib/projectToDb.js +1 -1
- package/packages/database/src/lib/projectToDb.js.map +1 -1
- package/packages/database/src/lib/saveFiles.js +1 -1
- package/packages/database/src/lib/saveFiles.js.map +1 -1
- package/packages/database/src/lib/scenarioToDb.js +1 -1
- package/packages/database/src/lib/scenarioToDb.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +76 -89
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/packages/types/index.js +0 -1
- package/packages/types/index.js.map +1 -1
- package/packages/types/src/enums/ProjectFramework.js +2 -0
- package/packages/types/src/enums/ProjectFramework.js.map +1 -1
- package/packages/types/src/types/Scenario.js +1 -21
- package/packages/types/src/types/Scenario.js.map +1 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js +98 -3
- package/packages/utils/src/lib/fs/rsyncCopy.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/npm-post-install.cjs +34 -0
- package/analyzer-template/packages/ai/src/lib/findMatchingAttribute.ts +0 -109
- package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +0 -584
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +0 -341
- package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +0 -495
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.ts +0 -67
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +0 -120
- package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
- package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
- package/codeyam-cli/src/commands/list.js +0 -31
- package/codeyam-cli/src/commands/list.js.map +0 -1
- package/codeyam-cli/src/commands/webapp-info.js +0 -146
- package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
- package/codeyam-cli/src/utils/universal-mocks.js +0 -152
- package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-Cmysw5OP.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-DLqD3qNt.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-CAneekK2.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-Cu16OUmx.js +0 -25
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CVtiBnY5.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DcAUIpD_.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DuDvi0jm.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-BMKg0SAF.js +0 -15
- package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-DyFZkK0l.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-DSmTpjmK.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BF_aK4y6.js +0 -32
- package/codeyam-cli/src/webserver/build/client/assets/chunk-EPOLDU6W-CXRTFQ3F.js +0 -51
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BdhJEx6B.js +0 -21
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-CKnwPCDr.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-RJCf3Tvw.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-EylcgScH.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DMe7kvgo.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DMJ7zii9.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-BW7Cyeyi.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-CZu4fif0.js +0 -15
- package/codeyam-cli/src/webserver/build/client/assets/globals-wHVy_II5.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/keyAttributeCoverage-CTlFMihX.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-2d191949.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-FHgpM6gc.js +0 -56
- package/codeyam-cli/src/webserver/build/client/assets/settings-6D8k8Jp5.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-CDJZnWhN.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-Dv18q8LD.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useInteractiveMode-0ToGk4K3.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-aSv48UbS.js +0 -2
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-1BX144Eg.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-mBRpZPiu.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-pU0o5t1o.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-YzfkRwdn.js +0 -178
- package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
- package/codeyam-cli/templates/debug-codeyam.md +0 -625
- package/packages/ai/src/lib/findMatchingAttribute.js +0 -81
- package/packages/ai/src/lib/findMatchingAttribute.js.map +0 -1
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +0 -425
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +0 -1
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +0 -267
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +0 -1
- package/packages/ai/src/lib/generateEntityKeyAttributes.js +0 -408
- package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +0 -1
- package/packages/ai/src/lib/isFrontend.js +0 -5
- package/packages/ai/src/lib/isFrontend.js.map +0 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js +0 -40
- package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js.map +0 -1
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +0 -77
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +0 -1
- package/scripts/finalize-analyzer.cjs +0 -81
- /package/codeyam-cli/src/webserver/build/client/assets/{api.link-scenario-value-l0sNRNKZ.js → api.agent-transcripts-l0sNRNKZ.js} +0 -0
- /package/codeyam-cli/src/webserver/build/client/assets/{api.update-key-attributes-l0sNRNKZ.js → api.dev-mode-events-l0sNRNKZ.js} +0 -0
- /package/codeyam-cli/src/webserver/build/client/assets/{api.update-valid-values-l0sNRNKZ.js → api.editor-audit-l0sNRNKZ.js} +0 -0
|
@@ -3,8 +3,245 @@ import * as crypto from 'crypto';
|
|
|
3
3
|
import { StructuredPath } from "./paths.js";
|
|
4
4
|
import { nodeToSource } from "./nodeToSource.js";
|
|
5
5
|
import { methodRegistry, ArrayPushSemantics } from "./methodSemantics.js";
|
|
6
|
-
import { isArithmeticOperator, isAssignmentOperator, isBitwiseCompoundOperator, isComparisonOperator, isDefinedType, isNumericCompoundOperator, leftOrRightType, unwrapExpression, } from "./sharedPatterns.js";
|
|
6
|
+
import { getComparisonOperatorString, isArithmeticOperator, isAssignmentOperator, isBitwiseCompoundOperator, isComparisonOperator, isDefinedType, isNumericCompoundOperator, leftOrRightType, unwrapExpression, } from "./sharedPatterns.js";
|
|
7
7
|
import { processBindingPattern } from "./processBindings.js";
|
|
8
|
+
import { extractConditionalEffectsFromTernary, findUseStateSetters, } from "./conditionalEffectsExtractor.js";
|
|
9
|
+
import { detectArrayDerivedPattern } from "./arrayDerivationDetector.js";
|
|
10
|
+
/**
|
|
11
|
+
* Recursively extracts root variable names from an expression AST node.
|
|
12
|
+
* Used to identify which variables flow into JSX expression children,
|
|
13
|
+
* so we can link them to the return value schema.
|
|
14
|
+
*
|
|
15
|
+
* Examples:
|
|
16
|
+
* - `filteredTopPaths.map(...)` → ['filteredTopPaths']
|
|
17
|
+
* - `a && b` → ['a', 'b']
|
|
18
|
+
* - `condition ? x : y` → ['condition', 'x', 'y']
|
|
19
|
+
*/
|
|
20
|
+
function extractRootVariableNames(node) {
|
|
21
|
+
const ignoredIdentifiers = new Set([
|
|
22
|
+
'undefined',
|
|
23
|
+
'null',
|
|
24
|
+
'true',
|
|
25
|
+
'false',
|
|
26
|
+
'NaN',
|
|
27
|
+
'Infinity',
|
|
28
|
+
]);
|
|
29
|
+
if (ts.isIdentifier(node)) {
|
|
30
|
+
const name = node.text;
|
|
31
|
+
return ignoredIdentifiers.has(name) ? [] : [name];
|
|
32
|
+
}
|
|
33
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
34
|
+
return extractRootVariableNames(node.expression);
|
|
35
|
+
}
|
|
36
|
+
if (ts.isCallExpression(node)) {
|
|
37
|
+
return extractRootVariableNames(node.expression);
|
|
38
|
+
}
|
|
39
|
+
if (ts.isBinaryExpression(node)) {
|
|
40
|
+
return [
|
|
41
|
+
...extractRootVariableNames(node.left),
|
|
42
|
+
...extractRootVariableNames(node.right),
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
if (ts.isPrefixUnaryExpression(node)) {
|
|
46
|
+
return extractRootVariableNames(node.operand);
|
|
47
|
+
}
|
|
48
|
+
if (ts.isConditionalExpression(node)) {
|
|
49
|
+
return [
|
|
50
|
+
...extractRootVariableNames(node.condition),
|
|
51
|
+
...extractRootVariableNames(node.whenTrue),
|
|
52
|
+
...extractRootVariableNames(node.whenFalse),
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
if (ts.isParenthesizedExpression(node)) {
|
|
56
|
+
return extractRootVariableNames(node.expression);
|
|
57
|
+
}
|
|
58
|
+
// Stop recursion at JSX elements and other terminal nodes
|
|
59
|
+
if (ts.isJsxElement(node) ||
|
|
60
|
+
ts.isJsxFragment(node) ||
|
|
61
|
+
ts.isJsxSelfClosingElement(node)) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Checks if a JSX element has props that reference variables from the parent scope.
|
|
68
|
+
* This is used to detect unconditionally-rendered children that should have their
|
|
69
|
+
* execution flows merged into the parent.
|
|
70
|
+
*
|
|
71
|
+
* We want to track children where the parent controls data that affects the child's
|
|
72
|
+
* conditional rendering. Static props (like title="Dashboard") don't need tracking
|
|
73
|
+
* because they don't create variable execution flows.
|
|
74
|
+
*
|
|
75
|
+
* Examples:
|
|
76
|
+
* - <WorkoutsView workouts={workouts} /> → true (workouts is a variable)
|
|
77
|
+
* - <ItemList items={items} count={count} /> → true (items, count are variables)
|
|
78
|
+
* - <Header title="Dashboard" /> → false (static string)
|
|
79
|
+
* - <Footer /> → false (no props)
|
|
80
|
+
* - <Button onClick={handleClick} /> → false (only callback, no data props)
|
|
81
|
+
*
|
|
82
|
+
* @returns true if the component has at least one prop that references a variable
|
|
83
|
+
* (excluding callbacks which typically start with 'on' or 'handle')
|
|
84
|
+
*/
|
|
85
|
+
function hasDataPropsFromParent(node, componentName) {
|
|
86
|
+
const attributes = ts.isJsxElement(node)
|
|
87
|
+
? node.openingElement.attributes.properties
|
|
88
|
+
: node.attributes.properties;
|
|
89
|
+
const dataProps = [];
|
|
90
|
+
for (const attr of attributes) {
|
|
91
|
+
// Spread attributes always reference parent data: {...props}
|
|
92
|
+
if (ts.isJsxSpreadAttribute(attr)) {
|
|
93
|
+
const spreadText = attr.expression?.getText() || '...spread';
|
|
94
|
+
dataProps.push(`{...${spreadText}}`);
|
|
95
|
+
console.log(`[UnconditionalChild] ${componentName}: Found spread attribute {${spreadText}}`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (ts.isJsxAttribute(attr)) {
|
|
99
|
+
const propName = attr.name.getText();
|
|
100
|
+
// Skip callback props - they don't create data-driven execution flows
|
|
101
|
+
// Callbacks typically start with 'on' (onClick, onChange) or 'handle' (handleSubmit)
|
|
102
|
+
if (propName.startsWith('on') ||
|
|
103
|
+
propName.startsWith('handle') ||
|
|
104
|
+
propName === 'ref') {
|
|
105
|
+
console.log(`[UnconditionalChild] ${componentName}: Skipping callback prop '${propName}'`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
// Check if the prop value is a JSX expression (references a variable)
|
|
109
|
+
// vs a string literal which is static
|
|
110
|
+
if (attr.initializer) {
|
|
111
|
+
if (ts.isJsxExpression(attr.initializer)) {
|
|
112
|
+
// JSX expression like prop={value} - this references a variable
|
|
113
|
+
// Could be a simple identifier, property access, or more complex expression
|
|
114
|
+
const expression = attr.initializer.expression;
|
|
115
|
+
if (expression) {
|
|
116
|
+
// Skip if it's just a function/arrow function (callback)
|
|
117
|
+
if (ts.isArrowFunction(expression) ||
|
|
118
|
+
ts.isFunctionExpression(expression)) {
|
|
119
|
+
console.log(`[UnconditionalChild] ${componentName}: Skipping inline callback prop '${propName}'`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// This is a data prop that references parent state/props
|
|
123
|
+
const exprText = expression.getText();
|
|
124
|
+
dataProps.push(`${propName}={${exprText}}`);
|
|
125
|
+
console.log(`[UnconditionalChild] ${componentName}: Found data prop '${propName}' = {${exprText}}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// String literals like prop="value" are static
|
|
130
|
+
console.log(`[UnconditionalChild] ${componentName}: Skipping static prop '${propName}'`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const hasDataProps = dataProps.length > 0;
|
|
136
|
+
if (hasDataProps) {
|
|
137
|
+
console.log(`[UnconditionalChild] ${componentName}: Has ${dataProps.length} data props: [${dataProps.join(', ')}]`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log(`[UnconditionalChild] ${componentName}: No data props found, will NOT track`);
|
|
141
|
+
}
|
|
142
|
+
return { hasDataProps, dataProps };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Extracts the component name from a JSX element.
|
|
146
|
+
* Returns null for intrinsic elements (div, span, etc.) since we only care about
|
|
147
|
+
* custom components for gating condition tracking.
|
|
148
|
+
*
|
|
149
|
+
* Examples:
|
|
150
|
+
* - <ChildViewer /> → "ChildViewer"
|
|
151
|
+
* - <ScenarioViewer scenario={...} /> → "ScenarioViewer"
|
|
152
|
+
* - <div> → null (intrinsic element)
|
|
153
|
+
*/
|
|
154
|
+
function getComponentNameFromJsx(node) {
|
|
155
|
+
let tagName;
|
|
156
|
+
if (ts.isJsxElement(node)) {
|
|
157
|
+
tagName = node.openingElement.tagName;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
tagName = node.tagName;
|
|
161
|
+
}
|
|
162
|
+
// Get the text of the tag name
|
|
163
|
+
const name = tagName.getText();
|
|
164
|
+
// Check if it's a custom component (starts with uppercase) vs intrinsic element
|
|
165
|
+
// Custom components start with uppercase: <MyComponent />
|
|
166
|
+
// Intrinsic elements start with lowercase: <div />
|
|
167
|
+
if (name &&
|
|
168
|
+
name[0] === name[0].toUpperCase() &&
|
|
169
|
+
name[0] !== name[0].toLowerCase()) {
|
|
170
|
+
return name;
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Extracts condition paths from a logical AND chain expression.
|
|
176
|
+
* Used for creating gating conditions for child components.
|
|
177
|
+
*
|
|
178
|
+
* Example: `hasData && isReady && <Component />` returns ['hasData', 'isReady']
|
|
179
|
+
*/
|
|
180
|
+
function extractConditionPathsFromAndChain(expr, sourceFile) {
|
|
181
|
+
const paths = [];
|
|
182
|
+
const unwrapped = unwrapExpression(expr);
|
|
183
|
+
if (ts.isBinaryExpression(unwrapped) &&
|
|
184
|
+
unwrapped.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
185
|
+
// Recursively get conditions from left side
|
|
186
|
+
paths.push(...extractConditionPathsFromAndChain(unwrapped.left, sourceFile));
|
|
187
|
+
// Process right side if it's not JSX (JSX is the consequence, not a condition)
|
|
188
|
+
const rightUnwrapped = unwrapExpression(unwrapped.right);
|
|
189
|
+
if (!ts.isJsxElement(rightUnwrapped) &&
|
|
190
|
+
!ts.isJsxSelfClosingElement(rightUnwrapped) &&
|
|
191
|
+
!ts.isJsxFragment(rightUnwrapped)) {
|
|
192
|
+
paths.push(...extractConditionPathsFromAndChain(unwrapped.right, sourceFile));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Base case: extract path from this expression
|
|
197
|
+
const path = StructuredPath.fromNode(unwrapped, sourceFile);
|
|
198
|
+
if (path) {
|
|
199
|
+
paths.push(path.toString());
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return paths;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Finds the rightmost JSX element in an && chain.
|
|
206
|
+
* Example: `a && b && <Component />` returns <Component />
|
|
207
|
+
*/
|
|
208
|
+
function findJsxInAndChain(expr) {
|
|
209
|
+
const unwrapped = unwrapExpression(expr);
|
|
210
|
+
if (ts.isJsxElement(unwrapped) || ts.isJsxSelfClosingElement(unwrapped)) {
|
|
211
|
+
return unwrapped;
|
|
212
|
+
}
|
|
213
|
+
if (ts.isBinaryExpression(unwrapped) &&
|
|
214
|
+
unwrapped.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
215
|
+
// Check right side first (most common case: condition && <Jsx />)
|
|
216
|
+
const rightResult = findJsxInAndChain(unwrapped.right);
|
|
217
|
+
if (rightResult)
|
|
218
|
+
return rightResult;
|
|
219
|
+
// Also check left side for rare cases
|
|
220
|
+
return findJsxInAndChain(unwrapped.left);
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Fix 32: Finds a JSX fragment in an && chain.
|
|
226
|
+
* Example: `activeTab && <><ChildA /><ChildB /></>` returns the fragment
|
|
227
|
+
* This is needed to propagate parent conditions through fragments.
|
|
228
|
+
*/
|
|
229
|
+
function findJsxFragmentInAndChain(expr) {
|
|
230
|
+
const unwrapped = unwrapExpression(expr);
|
|
231
|
+
if (ts.isJsxFragment(unwrapped)) {
|
|
232
|
+
return unwrapped;
|
|
233
|
+
}
|
|
234
|
+
if (ts.isBinaryExpression(unwrapped) &&
|
|
235
|
+
unwrapped.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
236
|
+
// Check right side first (most common case: condition && <></>)
|
|
237
|
+
const rightResult = findJsxFragmentInAndChain(unwrapped.right);
|
|
238
|
+
if (rightResult)
|
|
239
|
+
return rightResult;
|
|
240
|
+
// Also check left side for rare cases
|
|
241
|
+
return findJsxFragmentInAndChain(unwrapped.left);
|
|
242
|
+
}
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
8
245
|
/**
|
|
9
246
|
* Detects if a property access looks like an environment variable store access.
|
|
10
247
|
* Matches patterns like `env.DATABASE_URL`, `env.IS_FORMBRICKS_CLOUD`, etc.
|
|
@@ -171,6 +408,123 @@ function getSourceLocation(node, sourceFile) {
|
|
|
171
408
|
: codeSnippet,
|
|
172
409
|
};
|
|
173
410
|
}
|
|
411
|
+
/**
|
|
412
|
+
* Extracts the root array path from an expression that ends with .map().
|
|
413
|
+
* Handles chained methods like .filter().map(), .slice().map(), etc.
|
|
414
|
+
*
|
|
415
|
+
* Examples:
|
|
416
|
+
* - items.map(...) → "items"
|
|
417
|
+
* - data.users.map(...) → "data.users"
|
|
418
|
+
* - items.filter(...).map(...) → "items"
|
|
419
|
+
* - items.slice(0, 5).map(...) → "items"
|
|
420
|
+
*/
|
|
421
|
+
function extractArrayPathFromMapCall(expr, sourceFile) {
|
|
422
|
+
// Walk up the chain to find the root array
|
|
423
|
+
let current = expr.expression;
|
|
424
|
+
while (ts.isPropertyAccessExpression(current)) {
|
|
425
|
+
const methodName = current.name.getText(sourceFile);
|
|
426
|
+
// Common array methods that return arrays (so we keep going up)
|
|
427
|
+
const arrayReturningMethods = [
|
|
428
|
+
'map',
|
|
429
|
+
'filter',
|
|
430
|
+
'slice',
|
|
431
|
+
'concat',
|
|
432
|
+
'flat',
|
|
433
|
+
'flatMap',
|
|
434
|
+
'reverse',
|
|
435
|
+
'sort',
|
|
436
|
+
'toReversed',
|
|
437
|
+
'toSorted',
|
|
438
|
+
'toSpliced',
|
|
439
|
+
];
|
|
440
|
+
if (arrayReturningMethods.includes(methodName)) {
|
|
441
|
+
const objectExpr = current.expression;
|
|
442
|
+
// If the object is a call expression (chained method), keep going
|
|
443
|
+
if (ts.isCallExpression(objectExpr)) {
|
|
444
|
+
current = objectExpr.expression;
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
// Found the root - it's an identifier or property access
|
|
448
|
+
const path = StructuredPath.fromNode(objectExpr, sourceFile);
|
|
449
|
+
return path ? path.toString() : null;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
// Not an array method we recognize
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Extracts JSX rendering usages from a JSX expression.
|
|
461
|
+
* Detects:
|
|
462
|
+
* - array.map() calls → 'array-map' type
|
|
463
|
+
* - string interpolations (identifiers/property access) → 'text-interpolation' type
|
|
464
|
+
*
|
|
465
|
+
* Recursively searches inside && chains and ternary expressions.
|
|
466
|
+
*
|
|
467
|
+
* @param expr The expression inside {expr}
|
|
468
|
+
* @param context The analysis context
|
|
469
|
+
*/
|
|
470
|
+
function extractJsxRenderingUsage(expr, context) {
|
|
471
|
+
const unwrapped = unwrapExpression(expr);
|
|
472
|
+
const sourceLocation = getSourceLocation(expr, context.sourceFile);
|
|
473
|
+
// Detect array.map() calls
|
|
474
|
+
if (ts.isCallExpression(unwrapped)) {
|
|
475
|
+
const calleeExpr = unwrapped.expression;
|
|
476
|
+
if (ts.isPropertyAccessExpression(calleeExpr)) {
|
|
477
|
+
const methodName = calleeExpr.name.getText(context.sourceFile);
|
|
478
|
+
if (methodName === 'map') {
|
|
479
|
+
const arrayPath = extractArrayPathFromMapCall(unwrapped, context.sourceFile);
|
|
480
|
+
if (arrayPath) {
|
|
481
|
+
context.addJsxRenderingUsage({
|
|
482
|
+
path: arrayPath,
|
|
483
|
+
renderingType: 'array-map',
|
|
484
|
+
valueType: 'array',
|
|
485
|
+
sourceLocation,
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
// Detect simple string interpolations: {title} or {user.name}
|
|
492
|
+
else if (ts.isIdentifier(unwrapped) ||
|
|
493
|
+
ts.isPropertyAccessExpression(unwrapped)) {
|
|
494
|
+
const path = StructuredPath.fromNode(unwrapped, context.sourceFile);
|
|
495
|
+
if (path) {
|
|
496
|
+
const pathStr = path.toString();
|
|
497
|
+
const typeInfo = context.getTypeInfo(path);
|
|
498
|
+
// Only track as text interpolation if it's a string type
|
|
499
|
+
// Check for 'string' type, or types that contain 'string' (but not 'string[]')
|
|
500
|
+
if (typeInfo === 'string' ||
|
|
501
|
+
(typeInfo &&
|
|
502
|
+
typeInfo.includes('string') &&
|
|
503
|
+
!typeInfo.includes('string[]'))) {
|
|
504
|
+
context.addJsxRenderingUsage({
|
|
505
|
+
path: pathStr,
|
|
506
|
+
renderingType: 'text-interpolation',
|
|
507
|
+
valueType: 'string',
|
|
508
|
+
sourceLocation,
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
// Recursively search inside && chains: {showList && items.map(...)}
|
|
514
|
+
else if (ts.isBinaryExpression(unwrapped) &&
|
|
515
|
+
unwrapped.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
516
|
+
// Check the right side of the && chain (where .map() typically appears)
|
|
517
|
+
const rightSide = unwrapExpression(unwrapped.right);
|
|
518
|
+
extractJsxRenderingUsage(rightSide, context);
|
|
519
|
+
// Also check nested && chains on the left
|
|
520
|
+
extractJsxRenderingUsage(unwrapped.left, context);
|
|
521
|
+
}
|
|
522
|
+
// Recursively search inside ternaries: {isEmpty ? null : items.map(...)}
|
|
523
|
+
else if (ts.isConditionalExpression(unwrapped)) {
|
|
524
|
+
extractJsxRenderingUsage(unwrapped.whenTrue, context);
|
|
525
|
+
extractJsxRenderingUsage(unwrapped.whenFalse, context);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
174
528
|
/**
|
|
175
529
|
* Counts the number of conditions in an && chain (excluding JSX consequence)
|
|
176
530
|
*/
|
|
@@ -191,6 +545,368 @@ function countConditionsInAndChain(expr) {
|
|
|
191
545
|
// Single condition (not an && chain)
|
|
192
546
|
return 1;
|
|
193
547
|
}
|
|
548
|
+
/**
|
|
549
|
+
* Extracts conditionals from JSX elements by recursively traversing children.
|
|
550
|
+
*
|
|
551
|
+
* This is CRITICAL for extracting compound conditionals from JSX expressions
|
|
552
|
+
* like `{hasNewerVersion && !isActive && <Banner />}`.
|
|
553
|
+
*
|
|
554
|
+
* This function is called BEFORE the child boundary check in processExpression
|
|
555
|
+
* because JSX elements are NOT scopes - their expressions use variables from
|
|
556
|
+
* the parent scope and should have their conditionals extracted regardless of
|
|
557
|
+
* whether the JSX is within a child boundary.
|
|
558
|
+
*
|
|
559
|
+
* Fix 32: Added parentConditions parameter to track gating conditions from
|
|
560
|
+
* parent && chains. When we find a component nested inside multiple conditionals
|
|
561
|
+
* like `{activeTab && <>{ternary ? ... : <Component />}</>}`, ALL parent
|
|
562
|
+
* conditions should be added as gating conditions for the component.
|
|
563
|
+
*
|
|
564
|
+
* @param node The JSX element, self-closing element, or fragment to traverse
|
|
565
|
+
* @param context The analysis context
|
|
566
|
+
* @param parentConditions Accumulated gating conditions from parent && chains
|
|
567
|
+
*/
|
|
568
|
+
function extractConditionalsFromJsx(node, context, parentConditions = []) {
|
|
569
|
+
// Get children to process
|
|
570
|
+
let children;
|
|
571
|
+
if (ts.isJsxElement(node)) {
|
|
572
|
+
children = node.children;
|
|
573
|
+
}
|
|
574
|
+
else if (ts.isJsxFragment(node)) {
|
|
575
|
+
children = node.children;
|
|
576
|
+
}
|
|
577
|
+
// JsxSelfClosingElement has no children
|
|
578
|
+
if (!children) {
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
for (const child of children) {
|
|
582
|
+
// Process JSX expressions: {expr}
|
|
583
|
+
if (ts.isJsxExpression(child) && child.expression) {
|
|
584
|
+
const expr = unwrapExpression(child.expression);
|
|
585
|
+
// Extract JSX rendering usages (array.map, text interpolation)
|
|
586
|
+
// This handles direct usages like {items.map(...)} or {user.name}
|
|
587
|
+
extractJsxRenderingUsage(expr, context);
|
|
588
|
+
// If the expression is an && chain, extract its conditional usages
|
|
589
|
+
if (ts.isBinaryExpression(expr) &&
|
|
590
|
+
expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
591
|
+
// Mark nullable variables
|
|
592
|
+
markConditionVariablesAsNullable(expr, context);
|
|
593
|
+
// Extract conditional usage (this handles compound conditionals)
|
|
594
|
+
// Pass controlsJsxRendering: true since this conditional controls JSX rendering
|
|
595
|
+
extractConditionalUsage(expr, context, 'logical-and', {
|
|
596
|
+
controlsJsxRendering: true,
|
|
597
|
+
});
|
|
598
|
+
// Extract all condition paths from the && chain for gating tracking
|
|
599
|
+
const conditionPaths = extractConditionPathsFromAndChain(expr, context.sourceFile);
|
|
600
|
+
const sourceLocation = getSourceLocation(expr, context.sourceFile);
|
|
601
|
+
// Fix 32: Build accumulated conditions including parent conditions
|
|
602
|
+
const accumulatedConditions = [
|
|
603
|
+
...parentConditions,
|
|
604
|
+
...conditionPaths.map((path) => ({
|
|
605
|
+
path,
|
|
606
|
+
sourceLocation,
|
|
607
|
+
isNegated: false,
|
|
608
|
+
})),
|
|
609
|
+
];
|
|
610
|
+
// Track gating conditions for child components
|
|
611
|
+
// Example: {hasAnalysis && <ScenarioViewer />}
|
|
612
|
+
const jsxElement = findJsxInAndChain(expr);
|
|
613
|
+
if (jsxElement) {
|
|
614
|
+
const componentName = getComponentNameFromJsx(jsxElement);
|
|
615
|
+
if (componentName) {
|
|
616
|
+
// Fix 32: Add ALL accumulated conditions (parent + current) as gating conditions
|
|
617
|
+
for (const condition of accumulatedConditions) {
|
|
618
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
619
|
+
path: condition.path,
|
|
620
|
+
conditionType: 'truthiness',
|
|
621
|
+
location: 'logical-and',
|
|
622
|
+
sourceLocation: condition.sourceLocation,
|
|
623
|
+
controlsJsxRendering: true,
|
|
624
|
+
isNegated: condition.isNegated,
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
// Fix 32: Recursively process nested JSX with accumulated conditions
|
|
629
|
+
if (ts.isJsxElement(jsxElement) ||
|
|
630
|
+
ts.isJsxSelfClosingElement(jsxElement)) {
|
|
631
|
+
extractConditionalsFromJsx(jsxElement, context, accumulatedConditions);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
// Fix 32: Also check for nested JSX fragments
|
|
635
|
+
const jsxFragment = findJsxFragmentInAndChain(expr);
|
|
636
|
+
if (jsxFragment) {
|
|
637
|
+
extractConditionalsFromJsx(jsxFragment, context, accumulatedConditions);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
// If the expression is a ternary, extract its conditional
|
|
641
|
+
else if (ts.isConditionalExpression(expr)) {
|
|
642
|
+
// Pass controlsJsxRendering: true since this conditional controls JSX rendering
|
|
643
|
+
extractConditionalUsage(expr.condition, context, 'ternary', {
|
|
644
|
+
controlsJsxRendering: true,
|
|
645
|
+
});
|
|
646
|
+
// Track gating conditions for components in both branches of the ternary
|
|
647
|
+
// Example: {isError ? <ErrorView /> : <SuccessView />}
|
|
648
|
+
const conditionPath = StructuredPath.fromNode(unwrapExpression(expr.condition), context.sourceFile);
|
|
649
|
+
const sourceLocation = getSourceLocation(expr, context.sourceFile);
|
|
650
|
+
// Recursively process the whenTrue and whenFalse branches for JSX
|
|
651
|
+
const whenTrue = unwrapExpression(expr.whenTrue);
|
|
652
|
+
const whenFalse = unwrapExpression(expr.whenFalse);
|
|
653
|
+
// Fix 32: Build conditions for whenTrue branch (parent conditions + ternary condition truthy)
|
|
654
|
+
const whenTrueConditions = [
|
|
655
|
+
...parentConditions,
|
|
656
|
+
...(conditionPath
|
|
657
|
+
? [
|
|
658
|
+
{
|
|
659
|
+
path: conditionPath.toString(),
|
|
660
|
+
sourceLocation,
|
|
661
|
+
isNegated: false,
|
|
662
|
+
},
|
|
663
|
+
]
|
|
664
|
+
: []),
|
|
665
|
+
];
|
|
666
|
+
// Fix 32: Build conditions for whenFalse branch (parent conditions + ternary condition falsy)
|
|
667
|
+
const whenFalseConditions = [
|
|
668
|
+
...parentConditions,
|
|
669
|
+
...(conditionPath
|
|
670
|
+
? [
|
|
671
|
+
{
|
|
672
|
+
path: conditionPath.toString(),
|
|
673
|
+
sourceLocation,
|
|
674
|
+
isNegated: true,
|
|
675
|
+
},
|
|
676
|
+
]
|
|
677
|
+
: []),
|
|
678
|
+
];
|
|
679
|
+
// Handle whenTrue branch (condition is truthy)
|
|
680
|
+
if (ts.isJsxElement(whenTrue) || ts.isJsxSelfClosingElement(whenTrue)) {
|
|
681
|
+
const componentName = getComponentNameFromJsx(whenTrue);
|
|
682
|
+
if (componentName) {
|
|
683
|
+
// Fix 32: Add ALL conditions (parent + ternary) as gating conditions
|
|
684
|
+
for (const condition of whenTrueConditions) {
|
|
685
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
686
|
+
path: condition.path,
|
|
687
|
+
conditionType: 'truthiness',
|
|
688
|
+
location: 'ternary',
|
|
689
|
+
sourceLocation: condition.sourceLocation,
|
|
690
|
+
controlsJsxRendering: true,
|
|
691
|
+
isNegated: condition.isNegated,
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
if (ts.isJsxElement(whenTrue) ||
|
|
697
|
+
ts.isJsxSelfClosingElement(whenTrue) ||
|
|
698
|
+
ts.isJsxFragment(whenTrue)) {
|
|
699
|
+
extractConditionalsFromJsx(whenTrue, context, whenTrueConditions);
|
|
700
|
+
}
|
|
701
|
+
// Handle whenFalse branch (condition is falsy/negated)
|
|
702
|
+
if (ts.isJsxElement(whenFalse) ||
|
|
703
|
+
ts.isJsxSelfClosingElement(whenFalse)) {
|
|
704
|
+
const componentName = getComponentNameFromJsx(whenFalse);
|
|
705
|
+
if (componentName) {
|
|
706
|
+
// Fix 32: Add ALL conditions (parent + ternary) as gating conditions
|
|
707
|
+
for (const condition of whenFalseConditions) {
|
|
708
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
709
|
+
path: condition.path,
|
|
710
|
+
conditionType: 'truthiness',
|
|
711
|
+
location: 'ternary',
|
|
712
|
+
sourceLocation: condition.sourceLocation,
|
|
713
|
+
controlsJsxRendering: true,
|
|
714
|
+
isNegated: condition.isNegated,
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
if (ts.isJsxElement(whenFalse) ||
|
|
720
|
+
ts.isJsxSelfClosingElement(whenFalse) ||
|
|
721
|
+
ts.isJsxFragment(whenFalse)) {
|
|
722
|
+
extractConditionalsFromJsx(whenFalse, context, whenFalseConditions);
|
|
723
|
+
}
|
|
724
|
+
// Handle chained ternaries: a ? <A/> : b ? <B/> : <C/>
|
|
725
|
+
// When whenFalse is another ConditionalExpression, recursively process it
|
|
726
|
+
else if (ts.isConditionalExpression(whenFalse)) {
|
|
727
|
+
// Extract conditional usage for the nested ternary's condition
|
|
728
|
+
extractConditionalUsage(whenFalse.condition, context, 'ternary', {
|
|
729
|
+
controlsJsxRendering: true,
|
|
730
|
+
});
|
|
731
|
+
// Get the nested condition path
|
|
732
|
+
const nestedConditionPath = StructuredPath.fromNode(unwrapExpression(whenFalse.condition), context.sourceFile);
|
|
733
|
+
const nestedSourceLocation = getSourceLocation(whenFalse, context.sourceFile);
|
|
734
|
+
const nestedWhenTrue = unwrapExpression(whenFalse.whenTrue);
|
|
735
|
+
const nestedWhenFalse = unwrapExpression(whenFalse.whenFalse);
|
|
736
|
+
// Fix 32: Build conditions for nested whenTrue (parent falsy + nested truthy)
|
|
737
|
+
const nestedWhenTrueConditions = [
|
|
738
|
+
...whenFalseConditions, // Parent ternary was falsy to get here
|
|
739
|
+
...(nestedConditionPath
|
|
740
|
+
? [
|
|
741
|
+
{
|
|
742
|
+
path: nestedConditionPath.toString(),
|
|
743
|
+
sourceLocation: nestedSourceLocation,
|
|
744
|
+
isNegated: false,
|
|
745
|
+
},
|
|
746
|
+
]
|
|
747
|
+
: []),
|
|
748
|
+
];
|
|
749
|
+
// Fix 32: Build conditions for nested whenFalse (parent falsy + nested falsy)
|
|
750
|
+
const nestedWhenFalseConditions = [
|
|
751
|
+
...whenFalseConditions, // Parent ternary was falsy to get here
|
|
752
|
+
...(nestedConditionPath
|
|
753
|
+
? [
|
|
754
|
+
{
|
|
755
|
+
path: nestedConditionPath.toString(),
|
|
756
|
+
sourceLocation: nestedSourceLocation,
|
|
757
|
+
isNegated: true,
|
|
758
|
+
},
|
|
759
|
+
]
|
|
760
|
+
: []),
|
|
761
|
+
];
|
|
762
|
+
// Handle nested whenTrue branch
|
|
763
|
+
if (ts.isJsxElement(nestedWhenTrue) ||
|
|
764
|
+
ts.isJsxSelfClosingElement(nestedWhenTrue)) {
|
|
765
|
+
const componentName = getComponentNameFromJsx(nestedWhenTrue);
|
|
766
|
+
if (componentName) {
|
|
767
|
+
// Fix 32: Add ALL accumulated conditions
|
|
768
|
+
for (const condition of nestedWhenTrueConditions) {
|
|
769
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
770
|
+
path: condition.path,
|
|
771
|
+
conditionType: 'truthiness',
|
|
772
|
+
location: 'ternary',
|
|
773
|
+
sourceLocation: condition.sourceLocation,
|
|
774
|
+
controlsJsxRendering: true,
|
|
775
|
+
isNegated: condition.isNegated,
|
|
776
|
+
});
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
if (ts.isJsxElement(nestedWhenTrue) ||
|
|
781
|
+
ts.isJsxSelfClosingElement(nestedWhenTrue) ||
|
|
782
|
+
ts.isJsxFragment(nestedWhenTrue)) {
|
|
783
|
+
extractConditionalsFromJsx(nestedWhenTrue, context, nestedWhenTrueConditions);
|
|
784
|
+
}
|
|
785
|
+
// Handle nested whenFalse branch (this could be another chained ternary or JSX)
|
|
786
|
+
if (ts.isJsxElement(nestedWhenFalse) ||
|
|
787
|
+
ts.isJsxSelfClosingElement(nestedWhenFalse)) {
|
|
788
|
+
const componentName = getComponentNameFromJsx(nestedWhenFalse);
|
|
789
|
+
if (componentName) {
|
|
790
|
+
// Fix 32: Add ALL accumulated conditions
|
|
791
|
+
for (const condition of nestedWhenFalseConditions) {
|
|
792
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
793
|
+
path: condition.path,
|
|
794
|
+
conditionType: 'truthiness',
|
|
795
|
+
location: 'ternary',
|
|
796
|
+
sourceLocation: condition.sourceLocation,
|
|
797
|
+
controlsJsxRendering: true,
|
|
798
|
+
isNegated: condition.isNegated,
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
if (ts.isJsxElement(nestedWhenFalse) ||
|
|
804
|
+
ts.isJsxSelfClosingElement(nestedWhenFalse) ||
|
|
805
|
+
ts.isJsxFragment(nestedWhenFalse)) {
|
|
806
|
+
extractConditionalsFromJsx(nestedWhenFalse, context, nestedWhenFalseConditions);
|
|
807
|
+
}
|
|
808
|
+
// If nestedWhenFalse is yet another ConditionalExpression, the recursion
|
|
809
|
+
// will handle it on the next iteration when this function processes it
|
|
810
|
+
else if (ts.isConditionalExpression(nestedWhenFalse)) {
|
|
811
|
+
// Recursively handle deeper nesting by wrapping in a synthetic process
|
|
812
|
+
// We create a fake JsxExpression context to reuse the same logic
|
|
813
|
+
const syntheticChild = {
|
|
814
|
+
kind: ts.SyntaxKind.JsxExpression,
|
|
815
|
+
expression: nestedWhenFalse,
|
|
816
|
+
};
|
|
817
|
+
// Process via the main JSX expression handler by recursing
|
|
818
|
+
// For now, just extract conditionals directly
|
|
819
|
+
extractConditionalUsage(nestedWhenFalse.condition, context, 'ternary', { controlsJsxRendering: true });
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
// Recursively process nested JSX elements - Fix 32: pass parent conditions
|
|
825
|
+
else if (ts.isJsxElement(child)) {
|
|
826
|
+
// Check if this is a user-defined component (vs intrinsic element like div)
|
|
827
|
+
const componentName = getComponentNameFromJsx(child);
|
|
828
|
+
if (componentName) {
|
|
829
|
+
if (parentConditions.length > 0) {
|
|
830
|
+
// If there are parent conditions, record them as gating conditions
|
|
831
|
+
console.log(`[ChildBoundary] ${componentName}: Conditionally rendered with ${parentConditions.length} gating conditions`);
|
|
832
|
+
for (const condition of parentConditions) {
|
|
833
|
+
console.log(`[ChildBoundary] ${componentName}: Adding gating condition path='${condition.path}' isNegated=${condition.isNegated}`);
|
|
834
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
835
|
+
path: condition.path,
|
|
836
|
+
conditionType: 'truthiness',
|
|
837
|
+
location: 'ternary',
|
|
838
|
+
sourceLocation: condition.sourceLocation,
|
|
839
|
+
controlsJsxRendering: true,
|
|
840
|
+
isNegated: condition.isNegated,
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
else {
|
|
845
|
+
// No parent conditions - check if it has data props for unconditional tracking
|
|
846
|
+
console.log(`[ChildBoundary] ${componentName}: Checking for unconditional rendering with data props...`);
|
|
847
|
+
const { hasDataProps, dataProps } = hasDataPropsFromParent(child, componentName);
|
|
848
|
+
if (hasDataProps) {
|
|
849
|
+
// Fix: Track unconditionally-rendered children that receive data props
|
|
850
|
+
// These need to be tracked for flow merging even without gating conditions
|
|
851
|
+
// Example: <WorkoutsView workouts={workouts} /> - parent controls workouts data
|
|
852
|
+
console.log(`[ChildBoundary] ${componentName}: TRACKING as unconditionally-rendered with data props: [${dataProps.join(', ')}]`);
|
|
853
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
854
|
+
path: '__unconditional__',
|
|
855
|
+
conditionType: 'truthiness',
|
|
856
|
+
location: 'unconditional',
|
|
857
|
+
controlsJsxRendering: true,
|
|
858
|
+
isNegated: false,
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
extractConditionalsFromJsx(child, context, parentConditions);
|
|
864
|
+
}
|
|
865
|
+
// Handle self-closing JSX elements (e.g., <ScenarioViewer />)
|
|
866
|
+
else if (ts.isJsxSelfClosingElement(child)) {
|
|
867
|
+
// Check if this is a user-defined component (vs intrinsic element like div)
|
|
868
|
+
const componentName = getComponentNameFromJsx(child);
|
|
869
|
+
if (componentName) {
|
|
870
|
+
if (parentConditions.length > 0) {
|
|
871
|
+
// If there are parent conditions, record them as gating conditions
|
|
872
|
+
console.log(`[ChildBoundary] ${componentName}: Conditionally rendered (self-closing) with ${parentConditions.length} gating conditions`);
|
|
873
|
+
for (const condition of parentConditions) {
|
|
874
|
+
console.log(`[ChildBoundary] ${componentName}: Adding gating condition path='${condition.path}' isNegated=${condition.isNegated}`);
|
|
875
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
876
|
+
path: condition.path,
|
|
877
|
+
conditionType: 'truthiness',
|
|
878
|
+
location: 'ternary',
|
|
879
|
+
sourceLocation: condition.sourceLocation,
|
|
880
|
+
controlsJsxRendering: true,
|
|
881
|
+
isNegated: condition.isNegated,
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
else {
|
|
886
|
+
// No parent conditions - check if it has data props for unconditional tracking
|
|
887
|
+
console.log(`[ChildBoundary] ${componentName}: Checking for unconditional rendering (self-closing) with data props...`);
|
|
888
|
+
const { hasDataProps, dataProps } = hasDataPropsFromParent(child, componentName);
|
|
889
|
+
if (hasDataProps) {
|
|
890
|
+
// Fix: Track unconditionally-rendered children that receive data props
|
|
891
|
+
console.log(`[ChildBoundary] ${componentName}: TRACKING as unconditionally-rendered (self-closing) with data props: [${dataProps.join(', ')}]`);
|
|
892
|
+
context.addChildBoundaryGatingCondition(componentName, {
|
|
893
|
+
path: '__unconditional__',
|
|
894
|
+
conditionType: 'truthiness',
|
|
895
|
+
location: 'unconditional',
|
|
896
|
+
controlsJsxRendering: true,
|
|
897
|
+
isNegated: false,
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
// Self-closing elements have no children, so no recursion needed
|
|
903
|
+
}
|
|
904
|
+
// Recursively process nested JSX fragments - Fix 32: pass parent conditions
|
|
905
|
+
else if (ts.isJsxFragment(child)) {
|
|
906
|
+
extractConditionalsFromJsx(child, context, parentConditions);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
}
|
|
194
910
|
/**
|
|
195
911
|
* Extracts conditional usages from a condition expression for key attribute detection.
|
|
196
912
|
* This function identifies which attributes are used in conditionals and how they're used.
|
|
@@ -199,8 +915,10 @@ function countConditionsInAndChain(expr) {
|
|
|
199
915
|
* @param condition The condition expression to analyze
|
|
200
916
|
* @param context The analysis context
|
|
201
917
|
* @param location Where this condition appears (if, ternary, logical-and, switch)
|
|
918
|
+
* @param options Additional options including controlsJsxRendering flag
|
|
202
919
|
*/
|
|
203
|
-
export function extractConditionalUsage(condition, context, location) {
|
|
920
|
+
export function extractConditionalUsage(condition, context, location, options = {}) {
|
|
921
|
+
const { controlsJsxRendering } = options;
|
|
204
922
|
// Internal recursive function with chain tracking
|
|
205
923
|
function extractWithChainTracking(expr, chainInfo, isNegated) {
|
|
206
924
|
const unwrapped = unwrapExpression(expr);
|
|
@@ -225,6 +943,7 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
225
943
|
conditions: [],
|
|
226
944
|
location,
|
|
227
945
|
sourceLocation: getSourceLocation(unwrapped, context.sourceFile),
|
|
946
|
+
controlsJsxRendering,
|
|
228
947
|
};
|
|
229
948
|
chainInfo = {
|
|
230
949
|
chainId,
|
|
@@ -252,12 +971,33 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
252
971
|
return;
|
|
253
972
|
}
|
|
254
973
|
// Handle binary expressions with || (logical OR)
|
|
255
|
-
// OR
|
|
974
|
+
// When OR is inside an && chain, we need to continue chain tracking
|
|
975
|
+
// and mark conditions as OR alternatives
|
|
256
976
|
if (ts.isBinaryExpression(unwrapped) &&
|
|
257
977
|
unwrapped.operatorToken.kind === ts.SyntaxKind.BarBarToken) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
978
|
+
if (chainInfo) {
|
|
979
|
+
// We're inside an && chain - continue tracking but mark as OR alternatives
|
|
980
|
+
// Generate an orGroupId so conditions from both sides can be grouped
|
|
981
|
+
const orGroupId = chainInfo.currentOrGroupId ?? `or_${crypto.randomUUID().slice(0, 8)}`;
|
|
982
|
+
// Process left side with OR group tracking
|
|
983
|
+
const leftChainInfo = {
|
|
984
|
+
...chainInfo,
|
|
985
|
+
currentOrGroupId: orGroupId,
|
|
986
|
+
};
|
|
987
|
+
extractWithChainTracking(unwrapped.left, leftChainInfo, false);
|
|
988
|
+
// Process right side with same OR group
|
|
989
|
+
// Note: we use leftChainInfo's currentPosition which may have been updated
|
|
990
|
+
const rightChainInfo = {
|
|
991
|
+
...leftChainInfo,
|
|
992
|
+
currentPosition: chainInfo.currentPosition,
|
|
993
|
+
};
|
|
994
|
+
extractWithChainTracking(unwrapped.right, rightChainInfo, false);
|
|
995
|
+
}
|
|
996
|
+
else {
|
|
997
|
+
// Not inside a chain - OR breaks into independent conditional checks
|
|
998
|
+
extractWithChainTracking(unwrapped.left, null, false);
|
|
999
|
+
extractWithChainTracking(unwrapped.right, null, false);
|
|
1000
|
+
}
|
|
261
1001
|
return;
|
|
262
1002
|
}
|
|
263
1003
|
// Handle comparison operators (===, !==, <, >, <=, >=)
|
|
@@ -282,8 +1022,10 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
282
1022
|
}
|
|
283
1023
|
return literalValue;
|
|
284
1024
|
};
|
|
1025
|
+
// Get the comparison operator string for the compound condition
|
|
1026
|
+
const comparisonOperator = getComparisonOperatorString(unwrapped.operatorToken.kind);
|
|
285
1027
|
// Helper to add a condition
|
|
286
|
-
const addCondition = (path, conditionType, comparedValues, requiredValue) => {
|
|
1028
|
+
const addCondition = (path, conditionType, comparedValues, requiredValue, sourceExpr) => {
|
|
287
1029
|
const usage = {
|
|
288
1030
|
path,
|
|
289
1031
|
conditionType,
|
|
@@ -291,7 +1033,18 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
291
1033
|
location,
|
|
292
1034
|
sourceLocation: getSourceLocation(unwrapped, context.sourceFile),
|
|
293
1035
|
isNegated,
|
|
1036
|
+
controlsJsxRendering,
|
|
294
1037
|
};
|
|
1038
|
+
// Check for inline array-derived patterns (.length) on the source expression
|
|
1039
|
+
if (sourceExpr) {
|
|
1040
|
+
const arrayDerived = detectArrayDerivedPattern(sourceExpr);
|
|
1041
|
+
if (arrayDerived) {
|
|
1042
|
+
usage.derivedFrom = {
|
|
1043
|
+
operation: arrayDerived.operation,
|
|
1044
|
+
sourcePath: arrayDerived.sourcePath,
|
|
1045
|
+
};
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
295
1048
|
// Add chain info if part of a compound conditional
|
|
296
1049
|
if (chainInfo) {
|
|
297
1050
|
usage.chainId = chainInfo.chainId;
|
|
@@ -306,6 +1059,10 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
306
1059
|
comparedValues,
|
|
307
1060
|
isNegated,
|
|
308
1061
|
requiredValue,
|
|
1062
|
+
...(comparisonOperator && { comparisonOperator }),
|
|
1063
|
+
...(chainInfo.currentOrGroupId && {
|
|
1064
|
+
orGroupId: chainInfo.currentOrGroupId,
|
|
1065
|
+
}),
|
|
309
1066
|
});
|
|
310
1067
|
}
|
|
311
1068
|
context.addConditionalUsage(usage);
|
|
@@ -313,21 +1070,21 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
313
1070
|
// Check if left is a variable and right is a literal
|
|
314
1071
|
if (leftPath && isLiteralExpression(unwrapped.right)) {
|
|
315
1072
|
const literalValue = getLiteralValue(unwrapped.right, context);
|
|
316
|
-
addCondition(leftPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated));
|
|
1073
|
+
addCondition(leftPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated), unwrapped.left);
|
|
317
1074
|
return;
|
|
318
1075
|
}
|
|
319
1076
|
// Check if right is a variable and left is a literal
|
|
320
1077
|
if (rightPath && isLiteralExpression(unwrapped.left)) {
|
|
321
1078
|
const literalValue = getLiteralValue(unwrapped.left, context);
|
|
322
|
-
addCondition(rightPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated));
|
|
1079
|
+
addCondition(rightPath.toLeftHandSideString(), 'comparison', literalValue !== undefined ? [literalValue] : undefined, getRequiredValue(literalValue, isNegated), unwrapped.right);
|
|
323
1080
|
return;
|
|
324
1081
|
}
|
|
325
1082
|
// Both sides are variables - record both as comparisons without specific values
|
|
326
1083
|
if (leftPath) {
|
|
327
|
-
addCondition(leftPath.toLeftHandSideString(), 'comparison');
|
|
1084
|
+
addCondition(leftPath.toLeftHandSideString(), 'comparison', undefined, undefined, unwrapped.left);
|
|
328
1085
|
}
|
|
329
1086
|
if (rightPath) {
|
|
330
|
-
addCondition(rightPath.toLeftHandSideString(), 'comparison');
|
|
1087
|
+
addCondition(rightPath.toLeftHandSideString(), 'comparison', undefined, undefined, unwrapped.right);
|
|
331
1088
|
}
|
|
332
1089
|
return;
|
|
333
1090
|
}
|
|
@@ -349,7 +1106,17 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
349
1106
|
location,
|
|
350
1107
|
sourceLocation: getSourceLocation(unwrapped, context.sourceFile),
|
|
351
1108
|
isNegated,
|
|
1109
|
+
controlsJsxRendering,
|
|
352
1110
|
};
|
|
1111
|
+
// Check for inline array-derived patterns (.some(), .every(), .includes(), .length)
|
|
1112
|
+
// This populates derivedFrom so downstream code can resolve to the base array path
|
|
1113
|
+
const arrayDerived = detectArrayDerivedPattern(unwrapped);
|
|
1114
|
+
if (arrayDerived) {
|
|
1115
|
+
usage.derivedFrom = {
|
|
1116
|
+
operation: arrayDerived.operation,
|
|
1117
|
+
sourcePath: arrayDerived.sourcePath,
|
|
1118
|
+
};
|
|
1119
|
+
}
|
|
353
1120
|
// Add chain info if part of a compound conditional
|
|
354
1121
|
if (chainInfo) {
|
|
355
1122
|
usage.chainId = chainInfo.chainId;
|
|
@@ -364,6 +1131,9 @@ export function extractConditionalUsage(condition, context, location) {
|
|
|
364
1131
|
conditionType: 'truthiness',
|
|
365
1132
|
isNegated,
|
|
366
1133
|
requiredValue: !isNegated,
|
|
1134
|
+
...(chainInfo.currentOrGroupId && {
|
|
1135
|
+
orGroupId: chainInfo.currentOrGroupId,
|
|
1136
|
+
}),
|
|
367
1137
|
});
|
|
368
1138
|
}
|
|
369
1139
|
context.addConditionalUsage(usage);
|
|
@@ -458,6 +1228,15 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
458
1228
|
extractConditionalUsage(unwrappedNode, context, 'logical-and');
|
|
459
1229
|
}
|
|
460
1230
|
}
|
|
1231
|
+
// CRITICAL: Extract conditionals from JSX BEFORE checking child boundaries
|
|
1232
|
+
// JSX elements are NOT scopes - their expressions use variables from the parent scope.
|
|
1233
|
+
// Even if the JSX element is within a child boundary (e.g., because it contains callbacks),
|
|
1234
|
+
// we must still extract conditionals from JSX expression children like {x && <div>...</div>}
|
|
1235
|
+
if (ts.isJsxElement(unwrappedNode) ||
|
|
1236
|
+
ts.isJsxSelfClosingElement(unwrappedNode) ||
|
|
1237
|
+
ts.isJsxFragment(unwrappedNode)) {
|
|
1238
|
+
extractConditionalsFromJsx(unwrappedNode, context);
|
|
1239
|
+
}
|
|
461
1240
|
// If the node falls within an excluded child scope, stop processing it.
|
|
462
1241
|
if (context.isChildBoundary(node)) {
|
|
463
1242
|
return true;
|
|
@@ -486,15 +1265,21 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
486
1265
|
const equivalentVariables = context.getEquivalentVariables();
|
|
487
1266
|
const structure = context.getStructure();
|
|
488
1267
|
// Propagate existing equivalencies for sub-properties
|
|
489
|
-
for (const [key,
|
|
1268
|
+
for (const [key, rawValue] of Object.entries(equivalentVariables)) {
|
|
490
1269
|
// Check if this equivalency is for a sub-property of the identifier
|
|
491
1270
|
// e.g., completeDataStructure['Function Arguments'] or completeDataStructure.foo
|
|
492
1271
|
if (key.startsWith(nodePathStr + '.') ||
|
|
493
1272
|
key.startsWith(nodePathStr + '[')) {
|
|
494
1273
|
const subPath = key.substring(nodePathStr.length);
|
|
495
1274
|
const newTargetPath = StructuredPath.fromBase(targetPath.toString() + subPath);
|
|
496
|
-
|
|
497
|
-
|
|
1275
|
+
// Handle both string and string[] values
|
|
1276
|
+
const values = Array.isArray(rawValue) ? rawValue : [rawValue];
|
|
1277
|
+
for (const value of values) {
|
|
1278
|
+
if (typeof value === 'string') {
|
|
1279
|
+
const valuePath = StructuredPath.fromBase(value);
|
|
1280
|
+
context.addEquivalence(newTargetPath, valuePath);
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
498
1283
|
}
|
|
499
1284
|
}
|
|
500
1285
|
// Propagate existing structure entries for sub-properties
|
|
@@ -813,6 +1598,13 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
813
1598
|
// e.g., `const tab = segments[0] || 'default'` should trace tab back to segments[0]
|
|
814
1599
|
if (operatorKind === ts.SyntaxKind.QuestionQuestionToken) {
|
|
815
1600
|
// specifically for ?? we create an equivalence to the left side
|
|
1601
|
+
// IMPORTANT: Also process the left side recursively to apply method semantics
|
|
1602
|
+
// (e.g., for `const segments = splat?.split('/') ?? []`, we need split semantics)
|
|
1603
|
+
processExpression({
|
|
1604
|
+
node: unwrappedNode.left,
|
|
1605
|
+
context,
|
|
1606
|
+
// Don't pass targetPath here - we'll establish equivalence separately below
|
|
1607
|
+
});
|
|
816
1608
|
if (targetPath) {
|
|
817
1609
|
resultPath = StructuredPath.fromNode(unwrappedNode.left, context.sourceFile);
|
|
818
1610
|
}
|
|
@@ -823,12 +1615,46 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
823
1615
|
}
|
|
824
1616
|
}
|
|
825
1617
|
else if (operatorKind === ts.SyntaxKind.BarBarToken) {
|
|
826
|
-
// For ||,
|
|
1618
|
+
// For ||, create equivalences to BOTH sides
|
|
827
1619
|
// This enables data flow tracing through fallback expressions
|
|
1620
|
+
// e.g., `const item = items.find(...) || null` should trace to both:
|
|
1621
|
+
// - items[] (from the find result)
|
|
1622
|
+
// - null (from the fallback)
|
|
828
1623
|
if (targetPath) {
|
|
829
|
-
|
|
1624
|
+
// Get paths for both sides
|
|
1625
|
+
const leftPath = StructuredPath.fromNode(unwrappedNode.left, context.sourceFile);
|
|
1626
|
+
const rightPath = StructuredPath.fromNode(unwrappedNode.right, context.sourceFile);
|
|
1627
|
+
// Collect all valid paths
|
|
1628
|
+
const allPaths = [];
|
|
1629
|
+
if (leftPath)
|
|
1630
|
+
allPaths.push(leftPath);
|
|
1631
|
+
if (rightPath)
|
|
1632
|
+
allPaths.push(rightPath);
|
|
1633
|
+
// Add multiple equivalencies to track both sources
|
|
1634
|
+
if (allPaths.length > 0) {
|
|
1635
|
+
context.addMultipleEquivalencies(targetPath, allPaths);
|
|
1636
|
+
}
|
|
1637
|
+
// Process both sides to capture their internal structures
|
|
1638
|
+
processExpression({
|
|
1639
|
+
node: unwrappedNode.left,
|
|
1640
|
+
context,
|
|
1641
|
+
});
|
|
1642
|
+
processExpression({
|
|
1643
|
+
node: unwrappedNode.right,
|
|
1644
|
+
context,
|
|
1645
|
+
});
|
|
1646
|
+
// Register the type for the target path
|
|
1647
|
+
const leftType = context.inferTypeFromNode(unwrappedNode.left);
|
|
1648
|
+
const rightType = context.inferTypeFromNode(unwrappedNode.right);
|
|
1649
|
+
const orResultType = isDefinedType(leftType)
|
|
1650
|
+
? leftType
|
|
1651
|
+
: rightType || 'unknown';
|
|
1652
|
+
context.addType(targetPath, orResultType);
|
|
1653
|
+
// Return early - we've already handled equivalencies with addMultipleEquivalencies
|
|
1654
|
+
// Don't fall through to the generic addEquivalence call below
|
|
1655
|
+
return true;
|
|
830
1656
|
}
|
|
831
|
-
// Note:
|
|
1657
|
+
// Note: When there's no targetPath, we don't recursively process
|
|
832
1658
|
// because || is often used in boolean contexts where the full expression matters
|
|
833
1659
|
}
|
|
834
1660
|
}
|
|
@@ -906,18 +1732,44 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
906
1732
|
const semantics = semanticsList[0];
|
|
907
1733
|
// Get the source expression path (e.g., the object for obj.method())
|
|
908
1734
|
const sourceExpr = unwrappedNode.expression.expression;
|
|
909
|
-
const
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
const
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
1735
|
+
const unwrappedSourceExpr = unwrapExpression(sourceExpr);
|
|
1736
|
+
// When the source is a ternary expression like (cond ? arr : arr.slice()),
|
|
1737
|
+
// apply method semantics to BOTH branches directly. The ternary itself isn't
|
|
1738
|
+
// a variable - it's just a choice between two paths that both flow to the result.
|
|
1739
|
+
if (ts.isConditionalExpression(unwrappedSourceExpr)) {
|
|
1740
|
+
const branches = [
|
|
1741
|
+
unwrappedSourceExpr.whenTrue,
|
|
1742
|
+
unwrappedSourceExpr.whenFalse,
|
|
1743
|
+
];
|
|
1744
|
+
for (const branch of branches) {
|
|
1745
|
+
const branchPath = StructuredPath.fromNode(branch, context.sourceFile);
|
|
1746
|
+
if (branchPath) {
|
|
1747
|
+
const isArraySemantics = semantics instanceof ArrayPushSemantics;
|
|
1748
|
+
const shouldApply = !isArraySemantics ||
|
|
1749
|
+
isLikelyArrayType(branch, context.typeChecker);
|
|
1750
|
+
if (shouldApply) {
|
|
1751
|
+
semantics.addEquivalences(callPath, branchPath, context);
|
|
1752
|
+
returnType = semantics.getReturnType();
|
|
1753
|
+
handledBySemantics = true;
|
|
1754
|
+
}
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
else {
|
|
1759
|
+
// Regular (non-ternary) source expression
|
|
1760
|
+
const sourcePath = StructuredPath.fromNode(sourceExpr, context.sourceFile);
|
|
1761
|
+
if (sourcePath) {
|
|
1762
|
+
// For array-specific semantics (like push), verify the source is actually an array
|
|
1763
|
+
// This prevents router.push() from being mistakenly treated as Array.push()
|
|
1764
|
+
const isArraySemantics = semantics instanceof ArrayPushSemantics;
|
|
1765
|
+
const shouldApply = !isArraySemantics ||
|
|
1766
|
+
isLikelyArrayType(sourceExpr, context.typeChecker);
|
|
1767
|
+
if (shouldApply) {
|
|
1768
|
+
// Apply method semantics
|
|
1769
|
+
semantics.addEquivalences(callPath, sourcePath, context);
|
|
1770
|
+
returnType = semantics.getReturnType();
|
|
1771
|
+
handledBySemantics = true;
|
|
1772
|
+
}
|
|
921
1773
|
}
|
|
922
1774
|
}
|
|
923
1775
|
}
|
|
@@ -1242,6 +2094,12 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
1242
2094
|
markConditionVariablesAsNullable(unwrappedNode.condition, context);
|
|
1243
2095
|
// Extract conditional usages for key attribute detection
|
|
1244
2096
|
extractConditionalUsage(unwrappedNode.condition, context, 'ternary');
|
|
2097
|
+
// Extract conditional effects (setter calls in ternary branches)
|
|
2098
|
+
const knownSetters = findUseStateSetters(context.sourceFile);
|
|
2099
|
+
const effects = extractConditionalEffectsFromTernary(unwrappedNode, context, knownSetters);
|
|
2100
|
+
for (const effect of effects) {
|
|
2101
|
+
context.addConditionalEffect(effect);
|
|
2102
|
+
}
|
|
1245
2103
|
// Process all parts recursively
|
|
1246
2104
|
processExpression({
|
|
1247
2105
|
node: unwrappedNode.condition,
|
|
@@ -1340,6 +2198,32 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
1340
2198
|
}
|
|
1341
2199
|
// Handle Arrow Functions: (p) => p.prop, (a, b) => { ... }
|
|
1342
2200
|
if (ts.isArrowFunction(unwrappedNode)) {
|
|
2201
|
+
// If this arrow function is a child boundary (e.g., a .map() callback),
|
|
2202
|
+
// don't process its parameters here - they will be processed when the
|
|
2203
|
+
// child scope is analyzed separately. This prevents parameter variables
|
|
2204
|
+
// from leaking into the parent scope's equivalencies.
|
|
2205
|
+
// Check if this arrow function is a child boundary (i.e., should be processed
|
|
2206
|
+
// as a separate child scope, not here in the parent scope).
|
|
2207
|
+
//
|
|
2208
|
+
// We use two checks because childBoundary positions can be unreliable:
|
|
2209
|
+
// 1. Position-based check (standard isChildBoundary)
|
|
2210
|
+
// 2. Text-based check: if the arrow function text doesn't appear in the
|
|
2211
|
+
// statement text, it was replaced with a cyScope placeholder
|
|
2212
|
+
const isChildBoundary = context.isChildBoundary(unwrappedNode);
|
|
2213
|
+
// Text-based child scope detection for when positions are unreliable
|
|
2214
|
+
const arrowFnText = unwrappedNode.getText(context.sourceFile);
|
|
2215
|
+
const firstLine = arrowFnText.split('\n')[0].trim();
|
|
2216
|
+
const searchText = firstLine.substring(0, Math.min(20, firstLine.length));
|
|
2217
|
+
const isInStatementText = context.statementInfo.text.includes(searchText);
|
|
2218
|
+
const isChildScope = !isInStatementText && arrowFnText.length > 10;
|
|
2219
|
+
if (isChildBoundary || isChildScope) {
|
|
2220
|
+
// The method semantics (e.g., ArrayMapSemantics) have already established
|
|
2221
|
+
// the necessary equivalences between the child scope placeholder and array elements
|
|
2222
|
+
if (targetPath) {
|
|
2223
|
+
context.addType(targetPath, 'function');
|
|
2224
|
+
}
|
|
2225
|
+
return true;
|
|
2226
|
+
}
|
|
1343
2227
|
// Create a path for the function
|
|
1344
2228
|
const functionPath = StructuredPath.empty();
|
|
1345
2229
|
// Process parameters
|
|
@@ -1631,6 +2515,15 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
1631
2515
|
for (const child of unwrappedNode.children) {
|
|
1632
2516
|
// Process expressions in JSX children: <div>{expr}</div>
|
|
1633
2517
|
if (ts.isJsxExpression(child) && child.expression) {
|
|
2518
|
+
// When processing return value JSX, link root variables to return value schema
|
|
2519
|
+
if (targetPath && targetPath.base !== '') {
|
|
2520
|
+
const varNames = [
|
|
2521
|
+
...new Set(extractRootVariableNames(child.expression)),
|
|
2522
|
+
];
|
|
2523
|
+
for (const varName of varNames) {
|
|
2524
|
+
context.addEquivalence(targetPath.withProperty(varName), StructuredPath.fromBase(varName));
|
|
2525
|
+
}
|
|
2526
|
+
}
|
|
1634
2527
|
// Process the expression with StructuredPath.empty() as targetPath
|
|
1635
2528
|
// to trigger type registration without imposing prefix
|
|
1636
2529
|
processExpression({
|
|
@@ -1661,6 +2554,15 @@ export function processExpression({ node, context, targetPath, typeHint, }) {
|
|
|
1661
2554
|
for (const child of unwrappedNode.children) {
|
|
1662
2555
|
// Process expressions in JSX children: <>{expr}</>
|
|
1663
2556
|
if (ts.isJsxExpression(child) && child.expression) {
|
|
2557
|
+
// When processing return value JSX, link root variables to return value schema
|
|
2558
|
+
if (targetPath && targetPath.base !== '') {
|
|
2559
|
+
const varNames = [
|
|
2560
|
+
...new Set(extractRootVariableNames(child.expression)),
|
|
2561
|
+
];
|
|
2562
|
+
for (const varName of varNames) {
|
|
2563
|
+
context.addEquivalence(targetPath.withProperty(varName), StructuredPath.fromBase(varName));
|
|
2564
|
+
}
|
|
2565
|
+
}
|
|
1664
2566
|
// Process the expression to extract structure
|
|
1665
2567
|
processExpression({
|
|
1666
2568
|
node: child.expression,
|