@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.4813bf3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +5 -5
- package/analyzer-template/packages/ai/index.ts +7 -1
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +62 -18
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +409 -50
- package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +21 -6
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +992 -249
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +31 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +37 -15
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +126 -11
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +367 -96
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +33 -15
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +315 -6
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +49 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +649 -142
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
- package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
- package/analyzer-template/packages/analyze/index.ts +2 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +89 -9
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +37 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +459 -39
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
- package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +6 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
- package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
- package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +3 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/package.json +1 -1
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/project/constructMockCode.ts +90 -10
- package/analyzer-template/project/writeMockDataTsx.ts +181 -8
- package/analyzer-template/project/writeScenarioComponents.ts +60 -12
- package/analyzer-template/project/writeSimpleRoot.ts +21 -11
- package/background/src/lib/local/createLocalAnalyzer.js +1 -1
- package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +180 -0
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/codeyam-cli.js +18 -2
- package/codeyam-cli/src/codeyam-cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +4 -2
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/baseline.js +2 -0
- package/codeyam-cli/src/commands/baseline.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +9 -5
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +31 -20
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
- package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +49 -257
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +17 -26
- package/codeyam-cli/src/commands/memory.js.map +1 -1
- package/codeyam-cli/src/commands/recapture.js +2 -0
- package/codeyam-cli/src/commands/recapture.js.map +1 -1
- package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
- package/codeyam-cli/src/commands/setup-simulations.js +284 -0
- package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
- package/codeyam-cli/src/commands/test-startup.js +2 -0
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/commands/verify.js +14 -2
- package/codeyam-cli/src/commands/verify.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +7 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +5 -0
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +2 -2
- package/codeyam-cli/src/utils/install-skills.js +70 -45
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
- package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
- package/codeyam-cli/src/utils/progress.js +7 -0
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +4 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/requireSimulations.js +10 -0
- package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/index.js +1 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -1
- package/codeyam-cli/src/utils/rules/parser.js +2 -25
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
- package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +16 -11
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js +37 -10
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/backgroundServer.js +24 -0
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-B86KKU7e.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-CgMEzchJ.js} +3 -8
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-CBui0id_.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-BtBFH820.js} +6 -11
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CN61MOMa.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-C0epRiVn.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-BVnB8a9L.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-0N0YJQv7.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-DXnyr8uP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-CKT08Djd.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-BLJ7HxOC.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-b171b9d3.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-CCQd4aZA.js +78 -0
- package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-CHhiHoo_.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-BejnUJ6R.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-8Fv-lH1-.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-Akn3iYFP.js +257 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
- package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
- package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
- package/codeyam-cli/templates/codeyam-memory.md +392 -0
- package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
- package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
- package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
- package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
- package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
- package/codeyam-cli/templates/rule-notification-hook.py +56 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
- package/codeyam-cli/templates/rules-instructions.md +132 -0
- package/package.json +2 -2
- package/packages/ai/index.js +3 -2
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +50 -13
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
- package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +763 -171
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +33 -3
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +113 -11
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +309 -84
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructureChunking.js +26 -11
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/isolateScopes.js +39 -3
- package/packages/ai/src/lib/isolateScopes.js.map +1 -1
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
- package/packages/ai/src/lib/mergeStatements.js +70 -51
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/analyze/index.js +1 -0
- package/packages/analyze/index.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +65 -7
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +33 -8
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +399 -31
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
- package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/index.js +1 -0
- package/packages/analyze/src/lib/index.js.map +1 -1
- package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
- package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
- package/packages/database/src/lib/analysisBranchToDb.js +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/packages/database/src/lib/analysisToDb.js +1 -1
- package/packages/database/src/lib/analysisToDb.js.map +1 -1
- package/packages/database/src/lib/branchToDb.js +1 -1
- package/packages/database/src/lib/branchToDb.js.map +1 -1
- package/packages/database/src/lib/commitBranchToDb.js +1 -1
- package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
- package/packages/database/src/lib/commitToDb.js +1 -1
- package/packages/database/src/lib/commitToDb.js.map +1 -1
- package/packages/database/src/lib/fileToDb.js +1 -1
- package/packages/database/src/lib/fileToDb.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +3 -0
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
- package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
- package/packages/database/src/lib/projectToDb.js +1 -1
- package/packages/database/src/lib/projectToDb.js.map +1 -1
- package/packages/database/src/lib/saveFiles.js +1 -1
- package/packages/database/src/lib/saveFiles.js.map +1 -1
- package/packages/database/src/lib/scenarioToDb.js +1 -1
- package/packages/database/src/lib/scenarioToDb.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +8 -76
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
- package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
- package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
- package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
- package/codeyam-cli/templates/codeyam:memory.md +0 -462
- package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
|
@@ -14,8 +14,8 @@ export interface ConditionalUsage {
|
|
|
14
14
|
conditionType: 'truthiness' | 'comparison' | 'switch';
|
|
15
15
|
/** For comparison conditions, the literal values being compared against */
|
|
16
16
|
comparedValues?: string[];
|
|
17
|
-
/** Where this conditional usage occurs */
|
|
18
|
-
location: 'if' | 'ternary' | 'logical-and' | 'switch';
|
|
17
|
+
/** Where this conditional usage occurs. 'unconditional' is for always-rendered children with data props. */
|
|
18
|
+
location: 'if' | 'ternary' | 'logical-and' | 'switch' | 'unconditional';
|
|
19
19
|
/** Source location information for this conditional usage */
|
|
20
20
|
sourceLocation?: {
|
|
21
21
|
/** Line number (1-based) */
|
|
@@ -91,8 +91,8 @@ export interface CompoundConditional {
|
|
|
91
91
|
/** Required value for this condition to be true */
|
|
92
92
|
requiredValue?: string | boolean;
|
|
93
93
|
}[];
|
|
94
|
-
/** Where this compound conditional occurs */
|
|
95
|
-
location: 'if' | 'ternary' | 'logical-and' | 'switch';
|
|
94
|
+
/** Where this compound conditional occurs. 'unconditional' is for always-rendered children. */
|
|
95
|
+
location: 'if' | 'ternary' | 'logical-and' | 'switch' | 'unconditional';
|
|
96
96
|
/** Source location for the entire compound expression */
|
|
97
97
|
sourceLocation: {
|
|
98
98
|
lineNumber: number;
|
|
@@ -175,7 +175,7 @@ export interface DataStructure {
|
|
|
175
175
|
[key: string]: string;
|
|
176
176
|
};
|
|
177
177
|
equivalentSignatureVariables: {
|
|
178
|
-
[key: string]: string;
|
|
178
|
+
[key: string]: string | string[];
|
|
179
179
|
};
|
|
180
180
|
usageEquivalencies?: {
|
|
181
181
|
[key: string]: {
|
package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScenariosDataStructure.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScenariosDataStructure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,aAAa,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IACtD,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"ScenariosDataStructure.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScenariosDataStructure.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,13 @@ export interface ScopeAnalysis {
|
|
|
4
4
|
isolatedStructure: {
|
|
5
5
|
[key: string]: string;
|
|
6
6
|
};
|
|
7
|
+
/**
|
|
8
|
+
* Maps variable names to their equivalent paths.
|
|
9
|
+
* Supports multiple equivalencies per key (e.g., for OR expressions like `x = a || b`
|
|
10
|
+
* where x is equivalent to both a and b).
|
|
11
|
+
*/
|
|
7
12
|
isolatedEquivalentVariables: {
|
|
8
|
-
[key: string]: string;
|
|
13
|
+
[key: string]: string | string[];
|
|
9
14
|
};
|
|
10
15
|
llmCalls: LlmCall[];
|
|
11
16
|
environmentVariables: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScopeAnalysis.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScopeAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7C,2BAA2B,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ScopeAnalysis.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScopeAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7C;;;;OAIG;IACH,2BAA2B,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC;IAClE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC"}
|
|
@@ -1189,11 +1189,20 @@ export default function constructMockCode(
|
|
|
1189
1189
|
// Valid patterns where arrow function is NOT bare:
|
|
1190
1190
|
// 1. Property value: "key: (arg) => ..." - ends with ':'
|
|
1191
1191
|
// 2. Function argument: ".map((arg) => ..." - ends with '('
|
|
1192
|
+
// 3. Method call: "?.map" followed directly by the arrow function
|
|
1193
|
+
// In this case, the '(' is consumed by the arrow function regex match,
|
|
1194
|
+
// so beforeTrimmed ends with the method name (e.g., 'map'), not '('.
|
|
1195
|
+
// We detect this by checking if beforeTrimmed ends with an identifier
|
|
1196
|
+
// that could be a method name (preceded by '.' or '?.').
|
|
1192
1197
|
// NOTE: We don't include ',' because "{ prop, () => {} }" is invalid
|
|
1193
1198
|
// (can't distinguish function argument from object property context)
|
|
1194
1199
|
const isPropertyValue = beforeTrimmed.endsWith(':');
|
|
1195
1200
|
const isFunctionArg = beforeTrimmed.endsWith('(');
|
|
1196
|
-
|
|
1201
|
+
// Check if before ends with a method call pattern like ".map" or "?.map"
|
|
1202
|
+
// The '(' after the method name is consumed by the arrow function regex
|
|
1203
|
+
const isMethodCallArg = /\??\.\w+$/.test(beforeTrimmed);
|
|
1204
|
+
const hasPropertyName =
|
|
1205
|
+
isPropertyValue || isFunctionArg || isMethodCallArg;
|
|
1197
1206
|
|
|
1198
1207
|
if (!hasPropertyName) {
|
|
1199
1208
|
// This is a bare arrow function - filter it out
|
|
@@ -1404,6 +1413,17 @@ export default function constructMockCode(
|
|
|
1404
1413
|
.replace(/,\s*$/, '');
|
|
1405
1414
|
returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => (\n${indent(trimmedContent)}\n))`;
|
|
1406
1415
|
} else {
|
|
1416
|
+
// When generating object-wrapped .map(), ensure original item data is preserved.
|
|
1417
|
+
// If no data spread was included (e.g., because this is a plain array property,
|
|
1418
|
+
// not a function return), add ...__item__ to spread the original item properties.
|
|
1419
|
+
// Without this, the .map() would create new objects with only nested function
|
|
1420
|
+
// properties, losing data like filePath, frontmatter, body, etc.
|
|
1421
|
+
const hasDataSpread =
|
|
1422
|
+
mappedContents.includes('...scenarios()') ||
|
|
1423
|
+
mappedContents.includes('...__item__');
|
|
1424
|
+
if (!hasDataSpread) {
|
|
1425
|
+
mappedContents = `...__item__,\n${mappedContents}`;
|
|
1426
|
+
}
|
|
1407
1427
|
returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => ({\n${indent(mappedContents)}\n}))`;
|
|
1408
1428
|
}
|
|
1409
1429
|
} // Close the empty content check else block
|
|
@@ -1470,6 +1490,17 @@ export default function constructMockCode(
|
|
|
1470
1490
|
mappedContents = filterOutArrowFunctions(mappedContents);
|
|
1471
1491
|
mappedContents = filterOutBareObjects(mappedContents, true);
|
|
1472
1492
|
mappedContents = cleanupContent(mappedContents);
|
|
1493
|
+
// Same as needsWrapper branch: ensure item data is preserved in .map()
|
|
1494
|
+
const hasDataSpreadInner =
|
|
1495
|
+
mappedContents.includes('...scenarios()') ||
|
|
1496
|
+
mappedContents.includes('...__item__');
|
|
1497
|
+
if (!hasDataSpreadInner && mappedContents.trim().length > 0) {
|
|
1498
|
+
// Insert ...__item__ after the opening brace
|
|
1499
|
+
mappedContents = mappedContents.replace(
|
|
1500
|
+
/^\s*\{/,
|
|
1501
|
+
'{\n...__item__,',
|
|
1502
|
+
);
|
|
1503
|
+
}
|
|
1473
1504
|
returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => (\n${indent(mappedContents)}\n))`;
|
|
1474
1505
|
}
|
|
1475
1506
|
} else {
|
|
@@ -1693,6 +1724,42 @@ export default function constructMockCode(
|
|
|
1693
1724
|
return 0;
|
|
1694
1725
|
});
|
|
1695
1726
|
|
|
1727
|
+
// OPTIMIZATION: Pre-compute prefix indexes for O(1) lookups instead of O(n) scans.
|
|
1728
|
+
// This reduces complexity from O(n²) to O(n) for large schemas (9k+ keys).
|
|
1729
|
+
//
|
|
1730
|
+
// 1. extendedReturnValuePrefixes: Set of all path prefixes that have a .functionCallReturnValue extension
|
|
1731
|
+
// Used by hasExtendedFunctionCallReturnValue check at line ~1754
|
|
1732
|
+
// 2. functionCallsWithReturnValue: Set of function call paths where .functionCallReturnValue IMMEDIATELY follows
|
|
1733
|
+
// Used by hasProperFunctionCallPath check at line ~1787
|
|
1734
|
+
// IMPORTANT: Only includes paths where the function call is directly followed by .functionCallReturnValue
|
|
1735
|
+
// e.g., "a.b().functionCallReturnValue" -> adds "a.b()" but NOT "a" even if "a" ends with ")"
|
|
1736
|
+
const extendedReturnValuePrefixes = new Set<string>();
|
|
1737
|
+
const functionCallsWithReturnValue = new Set<string>();
|
|
1738
|
+
|
|
1739
|
+
for (const k of relevantKeys) {
|
|
1740
|
+
const parts = splitOutsideParenthesesAndArrays(k);
|
|
1741
|
+
const returnValueIndex = parts.findIndex((part) =>
|
|
1742
|
+
part.startsWith(RETURN_VALUE),
|
|
1743
|
+
);
|
|
1744
|
+
if (returnValueIndex !== -1) {
|
|
1745
|
+
// Add all prefixes of k up to (but not including) functionCallReturnValue
|
|
1746
|
+
const prefix = joinParenthesesAndArrays(parts.slice(0, returnValueIndex));
|
|
1747
|
+
extendedReturnValuePrefixes.add(prefix);
|
|
1748
|
+
|
|
1749
|
+
// ONLY add to functionCallsWithReturnValue if functionCallReturnValue IMMEDIATELY follows
|
|
1750
|
+
if (prefix.endsWith(')')) {
|
|
1751
|
+
functionCallsWithReturnValue.add(prefix);
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
// Also add intermediate prefixes for nested paths to extendedReturnValuePrefixes
|
|
1755
|
+
// This helps hasExtendedFunctionCallReturnValue which checks key + '.'
|
|
1756
|
+
for (let i = 1; i < returnValueIndex; i++) {
|
|
1757
|
+
const partialPrefix = joinParenthesesAndArrays(parts.slice(0, i));
|
|
1758
|
+
extendedReturnValuePrefixes.add(partialPrefix);
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1696
1763
|
for (const key of sortedKeys) {
|
|
1697
1764
|
const value = relevantReturnValueSchema[key];
|
|
1698
1765
|
const parts = splitOutsideParenthesesAndArrays(key);
|
|
@@ -1749,9 +1816,10 @@ export default function constructMockCode(
|
|
|
1749
1816
|
// nested inside (e.g., methods on array elements passed as arguments).
|
|
1750
1817
|
if (hasSignaturePath) continue;
|
|
1751
1818
|
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1819
|
+
// OPTIMIZATION: Use pre-computed index instead of O(n) scan
|
|
1820
|
+
// Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes('.functionCallReturnValue'))
|
|
1821
|
+
const hasExtendedFunctionCallReturnValue =
|
|
1822
|
+
extendedReturnValuePrefixes.has(key);
|
|
1755
1823
|
|
|
1756
1824
|
// Skip JSX components - they look like function calls (e.g., Context.Provider())
|
|
1757
1825
|
// but they're React components used in JSX, not functions that need mocking
|
|
@@ -1780,11 +1848,10 @@ export default function constructMockCode(
|
|
|
1780
1848
|
const functionCallPath = joinParenthesesAndArrays(
|
|
1781
1849
|
parts.slice(0, i + 1),
|
|
1782
1850
|
);
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
);
|
|
1851
|
+
// OPTIMIZATION: Use pre-computed index instead of O(n) scan
|
|
1852
|
+
// Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'))
|
|
1853
|
+
const hasProperFunctionCallPath =
|
|
1854
|
+
functionCallsWithReturnValue.has(functionCallPath);
|
|
1788
1855
|
if (hasProperFunctionCallPath) {
|
|
1789
1856
|
// Skip this path - the .functionCallReturnValue path will handle it correctly
|
|
1790
1857
|
shouldSkipKey = true;
|
|
@@ -2383,7 +2450,20 @@ export default function constructMockCode(
|
|
|
2383
2450
|
const safeReturnValue = isSimpleDataPath
|
|
2384
2451
|
? `${returnValue} ?? {}`
|
|
2385
2452
|
: returnValue;
|
|
2386
|
-
|
|
2453
|
+
const refName = `_${safeFunctionName}Ref`;
|
|
2454
|
+
const assignment = `${refName}.current = ${safeReturnValue};`;
|
|
2455
|
+
const ifBlock = `if (!${refName}.current) {\n${indent(assignment)}\n}`;
|
|
2456
|
+
const body = `${ifBlock}\nreturn ${refName}.current;`;
|
|
2457
|
+
|
|
2458
|
+
return [
|
|
2459
|
+
`// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)`,
|
|
2460
|
+
`const ${refName} = {`,
|
|
2461
|
+
` current: null,`,
|
|
2462
|
+
`};`,
|
|
2463
|
+
`${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}(...args) {`,
|
|
2464
|
+
indent(body),
|
|
2465
|
+
`}`,
|
|
2466
|
+
].join('\n');
|
|
2387
2467
|
} else {
|
|
2388
2468
|
// Generate safe const name:
|
|
2389
2469
|
// 1. For call signatures: use derivedFunctionName
|
|
@@ -192,6 +192,36 @@ const safeString = (s: string, level: number) => {
|
|
|
192
192
|
return s?.replace ? s.replace(/"/g, "'").replace(/\n/g, '\\n') : s;
|
|
193
193
|
};
|
|
194
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Clean up malformed LLM-generated function values.
|
|
197
|
+
* The LLM sometimes generates function values with an invalid "(function)" prefix like:
|
|
198
|
+
* - "(function)() => {}"
|
|
199
|
+
* - "(function)(event) => {}"
|
|
200
|
+
* - "(function)(id) => {}"
|
|
201
|
+
*
|
|
202
|
+
* This strips the prefix and adds TypeScript `any` type annotations to parameters.
|
|
203
|
+
* Returns null if the value doesn't match the malformed pattern.
|
|
204
|
+
*/
|
|
205
|
+
const cleanMalformedFunctionValue = (value: string): string | null => {
|
|
206
|
+
// Match "(function)" followed by optional params in parens, then "=>"
|
|
207
|
+
const match = value.match(/^\(function\)(\([^)]*\))\s*=>\s*(.*)$/);
|
|
208
|
+
if (!match) return null;
|
|
209
|
+
|
|
210
|
+
const [, paramsWithParens, body] = match;
|
|
211
|
+
|
|
212
|
+
// Extract parameter names and add `: any` type annotation
|
|
213
|
+
// e.g., "(event)" -> "(event: any)", "()" -> "()"
|
|
214
|
+
const params = paramsWithParens.slice(1, -1).trim(); // Remove outer parens
|
|
215
|
+
const typedParams = params
|
|
216
|
+
? params
|
|
217
|
+
.split(',')
|
|
218
|
+
.map((p) => `${p.trim()}: any`)
|
|
219
|
+
.join(', ')
|
|
220
|
+
: '';
|
|
221
|
+
|
|
222
|
+
return `(${typedParams}) => ${body}`;
|
|
223
|
+
};
|
|
224
|
+
|
|
195
225
|
/**
|
|
196
226
|
* Check if a mock key's schema indicates it should be instantiated as a Map.
|
|
197
227
|
* A Map is indicated by:
|
|
@@ -310,6 +340,38 @@ function extractAllKeys(obj: JsonTypeDefinition | undefined): string[] {
|
|
|
310
340
|
*/
|
|
311
341
|
const BARE_TYPE_MARKERS = ['function', 'async-function'];
|
|
312
342
|
|
|
343
|
+
/**
|
|
344
|
+
* Check if a string is a TypeScript arrow function type annotation rather than
|
|
345
|
+
* a valid JavaScript arrow function expression.
|
|
346
|
+
*
|
|
347
|
+
* TypeScript arrow types look like function expressions (they contain '=>') but
|
|
348
|
+
* their "body" is a type name, not a JS expression:
|
|
349
|
+
* - "() => void"
|
|
350
|
+
* - "(event: MouseEvent) => void"
|
|
351
|
+
* - "() => string"
|
|
352
|
+
* - "() => Promise<void>"
|
|
353
|
+
* - "(id: string, name: string) => boolean"
|
|
354
|
+
*
|
|
355
|
+
* Valid JS arrow functions have actual expression bodies:
|
|
356
|
+
* - "() => {}"
|
|
357
|
+
* - "() => 'hello'"
|
|
358
|
+
* - "(x) => x + 1"
|
|
359
|
+
* - "() => { console.log('hi'); }"
|
|
360
|
+
*/
|
|
361
|
+
const ARROW_TYPE_RETURN_TYPES =
|
|
362
|
+
/^(void|string|number|boolean|any|unknown|never|null|undefined|object|Date|Promise<\w+>)$/i;
|
|
363
|
+
|
|
364
|
+
const isArrowFunctionTypeAnnotation = (value: string): boolean => {
|
|
365
|
+
const arrowIndex = value.indexOf('=>');
|
|
366
|
+
if (arrowIndex === -1) return false;
|
|
367
|
+
|
|
368
|
+
const body = value.slice(arrowIndex + 2).trim();
|
|
369
|
+
|
|
370
|
+
// A real JS function would have {}, an expression, a string literal, etc.
|
|
371
|
+
// A type annotation has a bare type keyword as the "body".
|
|
372
|
+
return ARROW_TYPE_RETURN_TYPES.test(body);
|
|
373
|
+
};
|
|
374
|
+
|
|
313
375
|
/**
|
|
314
376
|
* Check if a value is a bare function type marker that should be filtered out.
|
|
315
377
|
* These markers indicate the LLM detected a function but couldn't generate meaningful mock data.
|
|
@@ -336,6 +398,59 @@ const isBareTypeMarker = (value: unknown): boolean => {
|
|
|
336
398
|
return false;
|
|
337
399
|
};
|
|
338
400
|
|
|
401
|
+
/**
|
|
402
|
+
* Escape newlines that appear inside string literals within a code string,
|
|
403
|
+
* while preserving structural newlines (those between statements/lines of code).
|
|
404
|
+
*
|
|
405
|
+
* This handles cases where LLM generates function bodies like:
|
|
406
|
+
* - "() => { console.log('line1\nline2'); }" - escape the \n inside the string
|
|
407
|
+
* - "() => {\n console.log('x');\n}" - preserve structural \n between statements
|
|
408
|
+
* - "() => Promise.resolve('a\nb')" - escape the \n inside the string argument
|
|
409
|
+
*
|
|
410
|
+
* The algorithm tracks whether we're inside a string literal (single, double, or
|
|
411
|
+
* backtick quotes) and only escapes newlines that appear within quotes.
|
|
412
|
+
*/
|
|
413
|
+
const escapeNewlinesInStringLiterals = (code: string): string => {
|
|
414
|
+
let result = '';
|
|
415
|
+
let inString = false;
|
|
416
|
+
let stringChar = ''; // The quote character that started the current string
|
|
417
|
+
|
|
418
|
+
for (let i = 0; i < code.length; i++) {
|
|
419
|
+
const char = code[i];
|
|
420
|
+
const prevChar = i > 0 ? code[i - 1] : '';
|
|
421
|
+
|
|
422
|
+
// Check for string literal boundaries (single, double, or backtick quotes)
|
|
423
|
+
// Skip escaped quotes (preceded by backslash)
|
|
424
|
+
if ((char === '"' || char === "'" || char === '`') && prevChar !== '\\') {
|
|
425
|
+
if (!inString) {
|
|
426
|
+
// Starting a string literal
|
|
427
|
+
inString = true;
|
|
428
|
+
stringChar = char;
|
|
429
|
+
} else if (char === stringChar) {
|
|
430
|
+
// Ending the current string literal
|
|
431
|
+
inString = false;
|
|
432
|
+
stringChar = '';
|
|
433
|
+
}
|
|
434
|
+
// If char is a different quote type while in a string, it's just a character
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Escape newlines only when inside a string literal
|
|
438
|
+
if (char === '\n') {
|
|
439
|
+
if (inString) {
|
|
440
|
+
// Inside a string literal - escape the newline
|
|
441
|
+
result += '\\n';
|
|
442
|
+
} else {
|
|
443
|
+
// Outside string - keep the structural newline
|
|
444
|
+
result += char;
|
|
445
|
+
}
|
|
446
|
+
} else {
|
|
447
|
+
result += char;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
return result;
|
|
452
|
+
};
|
|
453
|
+
|
|
339
454
|
/**
|
|
340
455
|
* Normalize mock data by merging entries that have the same normalized function name.
|
|
341
456
|
* e.g., "useLastLogLine(projectSlug, !!simulatingEntitySha)" and
|
|
@@ -734,13 +849,19 @@ const jsonToCode = (
|
|
|
734
849
|
stringValue.startsWith('Promise.') ||
|
|
735
850
|
stringValue.startsWith('new Promise');
|
|
736
851
|
|
|
852
|
+
// Check if the string contains newlines (potential issue for string literals)
|
|
853
|
+
const hasNewlines = stringValue.includes('\n');
|
|
854
|
+
|
|
737
855
|
// Handle special type indicators that need transformation
|
|
738
856
|
let outputValue: string;
|
|
739
857
|
if (stringValue === 'promise' || looksLikePromise) {
|
|
740
858
|
// The key is a function call (e.g., "revalidate()"), so output a function
|
|
741
859
|
// that returns a Promise, not the Promise itself
|
|
860
|
+
// Important: Escape newlines inside Promise expressions to avoid
|
|
861
|
+
// "unterminated string literal" errors when the Promise contains
|
|
862
|
+
// multi-line string arguments like Promise.resolve('line1\nline2')
|
|
742
863
|
const promiseExpr = looksLikePromise
|
|
743
|
-
? stringValue
|
|
864
|
+
? stringValue.replace(/\n/g, '\\n')
|
|
744
865
|
: 'Promise.resolve()';
|
|
745
866
|
outputValue = `() => ${promiseExpr}`;
|
|
746
867
|
console.log(
|
|
@@ -752,10 +873,49 @@ const jsonToCode = (
|
|
|
752
873
|
`CodeYam: Nested func transform (string->function): "${key}" -> "${funcName}": () => {}`,
|
|
753
874
|
);
|
|
754
875
|
} else if (looksLikeFunction) {
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
)
|
|
876
|
+
// Check for "[native code]" in function body — this is what
|
|
877
|
+
// Function.prototype.toString() returns for built-in functions.
|
|
878
|
+
// The LLM sometimes generates "function () { [native code] }" which
|
|
879
|
+
// is not valid JavaScript (the "[" is parsed as array destructuring).
|
|
880
|
+
if (stringValue.includes('[native code]')) {
|
|
881
|
+
outputValue = '() => {}';
|
|
882
|
+
console.log(
|
|
883
|
+
`CodeYam: Nested func transform (native-code->noop): "${key}" -> "${funcName}": () => {}`,
|
|
884
|
+
);
|
|
885
|
+
} else if (cleanMalformedFunctionValue(stringValue)) {
|
|
886
|
+
// Check for malformed LLM-generated function values like "(function)() => {}"
|
|
887
|
+
// These have an invalid "(function)" prefix that must be stripped
|
|
888
|
+
outputValue = cleanMalformedFunctionValue(stringValue)!;
|
|
889
|
+
console.log(
|
|
890
|
+
`CodeYam: Nested func transform (malformed->clean): "${key}" -> "${funcName}": ${outputValue}`,
|
|
891
|
+
);
|
|
892
|
+
} else if (isArrowFunctionTypeAnnotation(stringValue)) {
|
|
893
|
+
// TypeScript arrow function type annotations like "() => void",
|
|
894
|
+
// "(event: MouseEvent) => void", "() => Promise<void>" contain '=>'
|
|
895
|
+
// so they pass the looksLikeFunction check, but they are TYPE syntax,
|
|
896
|
+
// not valid JavaScript expressions. Convert to a no-op function.
|
|
897
|
+
outputValue = '() => {}';
|
|
898
|
+
console.log(
|
|
899
|
+
`CodeYam: Nested func transform (type-annotation->function): "${key}" -> "${funcName}": () => {}`,
|
|
900
|
+
);
|
|
901
|
+
} else {
|
|
902
|
+
// Handle newlines in function expressions:
|
|
903
|
+
// - Newlines inside string literals must be escaped to avoid
|
|
904
|
+
// "unterminated string literal" errors
|
|
905
|
+
// - Structural newlines (between statements) should be kept as-is
|
|
906
|
+
// to produce valid multi-line JavaScript
|
|
907
|
+
//
|
|
908
|
+
// We escape ONLY newlines that appear inside string literals (single,
|
|
909
|
+
// double, or template quotes). Structural newlines are preserved.
|
|
910
|
+
if (hasNewlines) {
|
|
911
|
+
outputValue = escapeNewlinesInStringLiterals(stringValue);
|
|
912
|
+
} else {
|
|
913
|
+
outputValue = stringValue;
|
|
914
|
+
}
|
|
915
|
+
console.log(
|
|
916
|
+
`CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
|
|
917
|
+
);
|
|
918
|
+
}
|
|
759
919
|
} else {
|
|
760
920
|
// Plain string value - must be quoted
|
|
761
921
|
outputValue = `"${safeString(stringValue, level)}"`;
|
|
@@ -783,9 +943,22 @@ const jsonToCode = (
|
|
|
783
943
|
if (isBareTypeMarker(stringValue)) {
|
|
784
944
|
continue;
|
|
785
945
|
}
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
946
|
+
// Check for malformed LLM-generated function values like "(function)(id) => {}"
|
|
947
|
+
// These can appear on plain keys (e.g., "closeToast") and need to be output as
|
|
948
|
+
// actual functions, not quoted strings
|
|
949
|
+
const cleanedPlainKeyFn = cleanMalformedFunctionValue(stringValue);
|
|
950
|
+
if (cleanedPlainKeyFn) {
|
|
951
|
+
keyStrings.push(
|
|
952
|
+
`${levelSpacing}"${safeString(key, level)}": ${cleanedPlainKeyFn}`,
|
|
953
|
+
);
|
|
954
|
+
console.log(
|
|
955
|
+
`CodeYam: Plain key func transform (malformed->clean): "${key}": ${cleanedPlainKeyFn}`,
|
|
956
|
+
);
|
|
957
|
+
} else {
|
|
958
|
+
keyStrings.push(
|
|
959
|
+
`${levelSpacing}"${safeString(key, level)}": "${safeString(stringValue, level)}"`,
|
|
960
|
+
);
|
|
961
|
+
}
|
|
789
962
|
}
|
|
790
963
|
} else {
|
|
791
964
|
// Skip plain keys that have function-call versions (at the same nesting level where
|
|
@@ -987,10 +987,19 @@ function addMockToContent(
|
|
|
987
987
|
/[.*+?^${}()|[\]\\]/g,
|
|
988
988
|
'\\$&',
|
|
989
989
|
);
|
|
990
|
-
// Create regex that matches the call (with optional whitespace variations)
|
|
990
|
+
// Create regex that matches the call (with optional whitespace variations).
|
|
991
|
+
// TypeScript formatters commonly break type parameters across lines, e.g.:
|
|
992
|
+
// useLoaderData<
|
|
993
|
+
// typeof loader
|
|
994
|
+
// >()
|
|
995
|
+
// So we allow optional whitespace around < and > delimiters, not just
|
|
996
|
+
// where whitespace already exists in the call signature string.
|
|
991
997
|
const callRegex = new RegExp(
|
|
992
|
-
escapedCallSignature
|
|
993
|
-
|
|
998
|
+
escapedCallSignature
|
|
999
|
+
.replace(/\s+/g, '\\s*')
|
|
1000
|
+
.replace(/</g, '\\s*<\\s*')
|
|
1001
|
+
.replace(/>/g, '\\s*>\\s*'),
|
|
1002
|
+
'gs',
|
|
994
1003
|
);
|
|
995
1004
|
fileContent = fileContent.replace(callRegex, `${mockFunctionName}()`);
|
|
996
1005
|
}
|
|
@@ -1012,15 +1021,29 @@ function addMockToContent(
|
|
|
1012
1021
|
rootAnalysis.metadata?.scenariosDataStructure?.dataForMocks;
|
|
1013
1022
|
|
|
1014
1023
|
// Find matching call signature key in dataForMocks
|
|
1024
|
+
// IMPORTANT: First try exact match with type parameters (e.g., "useLoaderData<LoaderData>()")
|
|
1025
|
+
// to avoid picking the wrong variant (e.g., "useLoaderData<typeof loader>()" which may
|
|
1026
|
+
// have different properties). Fall back to base name matching only if exact match fails.
|
|
1015
1027
|
const hookBaseName = importedExport.name.split(/[<(]/)[0];
|
|
1016
|
-
const
|
|
1017
|
-
|
|
1028
|
+
const expectedKey = importedExport.calls?.[0];
|
|
1029
|
+
let callSignatureKey: string | undefined;
|
|
1030
|
+
|
|
1031
|
+
if (dataForMocks) {
|
|
1032
|
+
const keys = Object.keys(dataForMocks);
|
|
1033
|
+
|
|
1034
|
+
// First try exact match with the expected call signature
|
|
1035
|
+
if (expectedKey && keys.includes(expectedKey)) {
|
|
1036
|
+
callSignatureKey = expectedKey;
|
|
1037
|
+
} else {
|
|
1038
|
+
// Fall back to base name matching
|
|
1039
|
+
callSignatureKey = keys.find((key) => {
|
|
1018
1040
|
// Split on ., <, or ( to get the true base name
|
|
1019
1041
|
// This handles both "useFlags()" -> "useFlags" and "trpc.useUtils()" -> "trpc"
|
|
1020
1042
|
const keyBaseName = key.split(/[.<(]/)[0];
|
|
1021
1043
|
return keyBaseName === hookBaseName;
|
|
1022
|
-
})
|
|
1023
|
-
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1024
1047
|
|
|
1025
1048
|
// Use the call signature if found, otherwise construct it
|
|
1026
1049
|
const dataKey =
|
|
@@ -1061,18 +1084,36 @@ function addMockToContent(
|
|
|
1061
1084
|
// IMPORTANT: We inline scenarios().data() inside the function rather than
|
|
1062
1085
|
// storing in a const - see comment in constructMockCode.ts for why.
|
|
1063
1086
|
if (!mockCode) {
|
|
1064
|
-
mockCode =
|
|
1065
|
-
|
|
1087
|
+
mockCode = `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)
|
|
1088
|
+
const _${importedExport.name}Ref = {
|
|
1089
|
+
current: null,
|
|
1090
|
+
};
|
|
1091
|
+
function ${importedExport.name}(...args) {
|
|
1092
|
+
if (!_${importedExport.name}Ref.current) {
|
|
1093
|
+
_${importedExport.name}Ref.current = scenarios().data()?.["${dataKey}"];
|
|
1094
|
+
}
|
|
1095
|
+
return _${importedExport.name}Ref.current;
|
|
1066
1096
|
}`;
|
|
1067
1097
|
}
|
|
1068
1098
|
} else {
|
|
1069
1099
|
// Helper to find matching call signature key from dataForMocks
|
|
1100
|
+
// IMPORTANT: First try exact match with type parameters (e.g., "useLoaderData<LoaderData>()")
|
|
1101
|
+
// to avoid picking the wrong variant. Fall back to base name matching only if needed.
|
|
1070
1102
|
const hookBaseName = importedExport.name.split(/[<(]/)[0];
|
|
1103
|
+
const expectedKey = importedExport.calls?.[0];
|
|
1071
1104
|
const findMatchingKey = (
|
|
1072
1105
|
dataForMocks: Record<string, unknown> | undefined,
|
|
1073
1106
|
): string | undefined => {
|
|
1074
1107
|
if (!dataForMocks) return undefined;
|
|
1075
|
-
|
|
1108
|
+
const keys = Object.keys(dataForMocks);
|
|
1109
|
+
|
|
1110
|
+
// First try exact match with the expected call signature
|
|
1111
|
+
if (expectedKey && keys.includes(expectedKey)) {
|
|
1112
|
+
return expectedKey;
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
// Fall back to base name matching
|
|
1116
|
+
return keys.find((key) => {
|
|
1076
1117
|
// Split on ., <, or ( to get the true base name
|
|
1077
1118
|
// This handles both "useFlags()" -> "useFlags" and "trpc.useUtils()" -> "trpc"
|
|
1078
1119
|
const keyBaseName = key.split(/[.<(]/)[0];
|
|
@@ -1131,8 +1172,15 @@ function addMockToContent(
|
|
|
1131
1172
|
// IMPORTANT: We inline scenarios().data() inside the function rather than
|
|
1132
1173
|
// storing in a const - see comment in constructMockCode.ts for why.
|
|
1133
1174
|
if (!mockCode && dataKey) {
|
|
1134
|
-
mockCode =
|
|
1135
|
-
|
|
1175
|
+
mockCode = `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)
|
|
1176
|
+
const _${importedExport.name}Ref = {
|
|
1177
|
+
current: null,
|
|
1178
|
+
};
|
|
1179
|
+
function ${importedExport.name}(...args) {
|
|
1180
|
+
if (!_${importedExport.name}Ref.current) {
|
|
1181
|
+
_${importedExport.name}Ref.current = scenarios().data()?.["${dataKey}"];
|
|
1182
|
+
}
|
|
1183
|
+
return _${importedExport.name}Ref.current;
|
|
1136
1184
|
}`;
|
|
1137
1185
|
}
|
|
1138
1186
|
}
|
|
@@ -277,16 +277,17 @@ export default async function writeSimpleRoot(
|
|
|
277
277
|
let mockKey: string | undefined;
|
|
278
278
|
|
|
279
279
|
if (matchingKeys.length > 1) {
|
|
280
|
-
// Parse root.tsx to find how this hook is used
|
|
281
|
-
// Look for patterns like: const { prop1, prop2 } = useLoaderData()
|
|
282
|
-
// or: const result = useLoaderData()
|
|
280
|
+
// Parse root.tsx to find how this hook is used, INCLUDING type parameters
|
|
281
|
+
// Look for patterns like: const { prop1, prop2 } = useLoaderData<LoaderData>()
|
|
282
|
+
// or: const result = useLoaderData<typeof loader>()
|
|
283
283
|
const hookUsageRegex = new RegExp(
|
|
284
|
-
`(?:const|let|var)\\s+(?:\\{([^}]+)\\}|([a-zA-Z_][a-zA-Z0-9_]*))\\s*=\\s*${entityName}(
|
|
284
|
+
`(?:const|let|var)\\s+(?:\\{([^}]+)\\}|([a-zA-Z_][a-zA-Z0-9_]*))\\s*=\\s*${entityName}(<[^>]+>)?\\s*\\(`,
|
|
285
285
|
'g',
|
|
286
286
|
);
|
|
287
287
|
|
|
288
288
|
const matches = [...newContent.matchAll(hookUsageRegex)];
|
|
289
289
|
const rootPropertyNames: string[] = [];
|
|
290
|
+
const typeParamsUsed: Set<string> = new Set();
|
|
290
291
|
|
|
291
292
|
for (const match of matches) {
|
|
292
293
|
if (match[1]) {
|
|
@@ -300,17 +301,26 @@ export default async function writeSimpleRoot(
|
|
|
300
301
|
// Simple assignment: const result = ...
|
|
301
302
|
rootPropertyNames.push(match[2]);
|
|
302
303
|
}
|
|
304
|
+
// Capture type parameters used (e.g., "<LoaderData>", "<typeof loader>")
|
|
305
|
+
if (match[3]) {
|
|
306
|
+
typeParamsUsed.add(match[3]);
|
|
307
|
+
}
|
|
303
308
|
}
|
|
304
309
|
|
|
305
|
-
//
|
|
306
|
-
//
|
|
307
|
-
|
|
310
|
+
// First, try to find a key that matches the exact type parameters used in the source
|
|
311
|
+
// e.g., if source has useLoaderData<LoaderData>(), prefer "useLoaderData<LoaderData>()" key
|
|
312
|
+
if (typeParamsUsed.size > 0) {
|
|
313
|
+
for (const typeParam of typeParamsUsed) {
|
|
314
|
+
const exactKey = `${entityName}${typeParam}()`;
|
|
315
|
+
if (matchingKeys.includes(exactKey)) {
|
|
316
|
+
mockKey = exactKey;
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
308
321
|
|
|
309
|
-
// Fallback: if no
|
|
310
|
-
// exclude the route's key (which we can identify from mockedImports variable names)
|
|
322
|
+
// Fallback: if no exact type parameter match, use the first match
|
|
311
323
|
if (!mockKey) {
|
|
312
|
-
// The route's variable names would be in its own analysis
|
|
313
|
-
// For simplicity, just use the first key that's different from the most common pattern
|
|
314
324
|
mockKey = matchingKeys[0];
|
|
315
325
|
}
|
|
316
326
|
} else if (matchingKeys.length === 1) {
|
|
@@ -16,7 +16,7 @@ export async function createAnalyzerTemplate(absoluteCodeyamRootPath) {
|
|
|
16
16
|
await copyFolderToArchive({
|
|
17
17
|
source: folder,
|
|
18
18
|
destination: `${absoluteCodeyamRootPath}/${folderName}`,
|
|
19
|
-
exclude: ['__tests__'],
|
|
19
|
+
exclude: ['__tests__', 'node_modules'],
|
|
20
20
|
recursive: true,
|
|
21
21
|
});
|
|
22
22
|
}
|