@codeyam/codeyam-cli 0.1.0-staging.596f0eb → 0.1.0-staging.76566f9
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 +2 -1
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +2 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +22 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +23 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +401 -106
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +60 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +734 -45
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +2 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +715 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +233 -75
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +19 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +34 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +23 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +34 -1
- package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +236 -24
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +18 -1
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +41 -0
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +37 -4
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +213 -12
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +36 -25
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +114 -11
- package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +143 -31
- package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +8 -2
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +7 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +42 -2
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +38 -2
- package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +28 -2
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +8 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +127 -43
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +158 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +405 -45
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +260 -133
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +10 -5
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +77 -83
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +2 -5
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +196 -86
- package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts +15 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts.map +1 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js +31 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js.map +1 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/aws/s3/index.ts +1 -0
- package/analyzer-template/packages/aws/src/lib/s3/checkS3ObjectExists.ts +47 -0
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +4 -4
- package/analyzer-template/packages/database/src/lib/kysely/tableRelations.ts +2 -2
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +20 -9
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +9 -4
- package/analyzer-template/packages/generate/src/lib/deepMerge.ts +26 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tableRelations.d.ts +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts +8 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +14 -7
- 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 +9 -3
- 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/scenariosTable.d.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.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 +8 -4
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js +27 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts +4 -3
- package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.js +1 -0
- package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +31 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +51 -1
- 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 +21 -1
- 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 +48 -0
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
- package/analyzer-template/packages/types/index.ts +8 -0
- package/analyzer-template/packages/types/src/types/Analysis.ts +32 -1
- package/analyzer-template/packages/types/src/types/Scenario.ts +75 -6
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +49 -0
- package/analyzer-template/packages/ui-components/src/components/ScenarioDetailInteractiveView.tsx +23 -7
- package/analyzer-template/packages/utils/dist/types/index.d.ts +4 -3
- package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/index.js +1 -0
- package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +31 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +51 -1
- 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 +21 -1
- 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 +48 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/lightweightEntityExtractor.ts +27 -0
- package/analyzer-template/playwright/takeElementScreenshot.ts +26 -11
- package/analyzer-template/playwright/takeScreenshot.ts +9 -7
- package/analyzer-template/project/constructMockCode.ts +286 -84
- package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +77 -37
- package/analyzer-template/project/reconcileMockDataKeys.ts +5 -2
- package/analyzer-template/project/runMultiScenarioServer.ts +11 -10
- package/analyzer-template/project/serverOnlyModules.ts +71 -23
- package/analyzer-template/project/start.ts +10 -0
- package/analyzer-template/project/startScenarioCapture.ts +73 -41
- package/analyzer-template/project/writeMockDataTsx.ts +115 -54
- package/analyzer-template/project/writeScenarioComponents.ts +571 -162
- package/analyzer-template/project/writeSimpleRoot.ts +11 -13
- package/background/src/lib/virtualized/project/constructMockCode.js +265 -75
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +67 -32
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +5 -2
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js +11 -9
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
- package/background/src/lib/virtualized/project/serverOnlyModules.js +62 -25
- package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +6 -0
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +54 -31
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +106 -46
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +399 -106
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +11 -11
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/src/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +14 -2
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/recapture.js +215 -0
- package/codeyam-cli/src/commands/recapture.js.map +1 -0
- package/codeyam-cli/src/commands/report.js +26 -23
- package/codeyam-cli/src/commands/report.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +2 -2
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +252 -106
- package/codeyam-cli/src/utils/generateReport.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +2 -2
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +38 -0
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +140 -16
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +19 -7
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +47 -0
- 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/backgroundServer.js +5 -10
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +9 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-wXL1Z2Aq.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-efWKDYMr.js → EntityTypeBadge-CzGX-miz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-CXFKsCOD.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-D-9pXIaY.js +25 -0
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CBQPrpT0.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/LoadingDots-D1CdlbrV.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/LogViewer-wDPcZNKx.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-4lcOlid-.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BfmDgXxG.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-CUxUNEEC.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-COPstp9J.js → TruncatedFilePath-6J7zDUD5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-DHImXdXq.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CVP_WGQ3.js +32 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.link-scenario-value-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.update-key-attributes-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.update-valid-values-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/chevron-down-BYimnrHg.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/chunk-JMJ3UQ3L-BambyYE_.js +51 -0
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-CaVsIRxt.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CgUsG7ib.js +21 -0
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-CKnwPCDr.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DW_hdGUc.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-Dt-SjPsw.js +23 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DyB90fWk.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D_3ero5o.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-CfLCUi9S.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-DKJyZfAY.js +29 -0
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DAtOlaWE.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-ClR0d32A.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-D62Lxxmv.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-C9s7Lhdl.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-fmIEn3Bc.js +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-BosqDOlH.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-CzNNiTkw.js +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/keyAttributeCoverage-CTlFMihX.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-CNp9QFCX.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/manifest-0d27da29.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/preload-helper-ckwbz45p.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-B_wIKCIf.js +56 -0
- package/codeyam-cli/src/webserver/build/client/assets/scenarioStatus-B_8jpV3e.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/search-DDGjYAMJ.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/settings-DgTyB-Wg.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-CoNWGt0K.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-CBc5dE1s.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BMIGFP-m.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/useInteractiveMode-Dk_FQqWJ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-3pmpUQB-.js → useLastLogLine-BqPPNjAl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DsJbgMY9.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-DEyawJ8r.js → useToast-DWHcCcl1.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-CU58-Ttc.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-D35o2uae.js +175 -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 +1 -3
- package/codeyam-cli/src/webserver/devServer.js.map +1 -1
- package/codeyam-cli/templates/codeyam-setup-skill.md +138 -3
- package/codeyam-cli/templates/debug-codeyam.md +625 -0
- package/package.json +14 -14
- package/packages/ai/src/lib/analyzeScope.js +2 -0
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +16 -0
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +16 -0
- package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +305 -88
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +582 -41
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +2 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +454 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +173 -55
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +16 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +30 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +20 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js +86 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +28 -2
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +179 -17
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +6 -0
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js +41 -0
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarios.js +37 -4
- package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +4 -0
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityKeyAttributes.js +176 -9
- package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +29 -25
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +105 -9
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js +84 -14
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
- package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -1
- package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +6 -0
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +38 -2
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +38 -2
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +16 -3
- package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js +4 -0
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +100 -23
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +125 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +298 -45
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +201 -80
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +10 -5
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +55 -69
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +2 -5
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +171 -81
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +2 -2
- package/packages/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
- package/packages/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/packages/generate/src/lib/deepMerge.js +27 -1
- package/packages/generate/src/lib/deepMerge.js.map +1 -1
- package/packages/types/index.js +1 -0
- package/packages/types/index.js.map +1 -1
- package/packages/types/src/types/Scenario.js +21 -1
- package/packages/types/src/types/Scenario.js.map +1 -1
- package/packages/utils/src/lib/lightweightEntityExtractor.js +25 -0
- package/packages/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +3 -1
- package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +0 -238
- package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-CVbSvOjo.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-DcwcHyl5.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-WgwC1GfJ.js +0 -26
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-IEKom9O2.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/LogViewer-BYnfxbUG.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-_lBPJCzG.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-lHVhvsu_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-d_TBk4GQ.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/_index-kGT7VUqj.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-DDGmhu7P.js +0 -7
- package/codeyam-cli/src/webserver/build/client/assets/chevron-down-n_HPRfM_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-CbVoyx1U.js +0 -26
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-D1VOYveA.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-YR8jjAlu.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-B8vP3V_s.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-CN6aLCT1.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DA5Jeu2P.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-BTeitalf.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-du6UEYD-.js +0 -13
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-BpjkhMoi.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-BQGvk4lJ.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-DVdYRT-I.js +0 -12
- package/codeyam-cli/src/webserver/build/client/assets/globals-CO-U8Bpo.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/index-DCG-vks0.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-GazdNeLl.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-0b694d28.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-D3tQP7hx.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/search-CIY6XmtE.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/server-build-CMKNK2uU.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-CoMDgElu.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-agkniXp2.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-B2VUcygF.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-EvdK-zXP.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-DGVHQEXD.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CghkTkIL.js +0 -166
- package/codeyam-cli/templates/debug-command.md +0 -303
- /package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CMKNK2uU.css → styles-CMKNK2uU.css} +0 -0
|
@@ -255,19 +255,19 @@ export default async function writeSimpleRoot(
|
|
|
255
255
|
|
|
256
256
|
if (!newContent.match(importRegex)) continue;
|
|
257
257
|
|
|
258
|
-
// Find the correct
|
|
259
|
-
// The mock data is stored under keys like "
|
|
260
|
-
// For root.tsx, we need to find the key that corresponds to ROOT's usage,
|
|
261
|
-
// NOT the route's (Settings') usage.
|
|
258
|
+
// Find the correct mock key for ROOT's usage
|
|
259
|
+
// The mock data is stored under call signature keys like "useLoaderData()"
|
|
262
260
|
const dataForMocks =
|
|
263
261
|
options.routeAnalysis?.metadata?.scenariosDataStructure
|
|
264
262
|
?.dataForMocks;
|
|
265
263
|
|
|
266
|
-
// Find all keys that
|
|
264
|
+
// Find all keys that match this entity/hook by base name
|
|
265
|
+
const entityBaseName = entityName.split(/[<(]/)[0];
|
|
267
266
|
const matchingKeys = dataForMocks
|
|
268
|
-
? Object.keys(dataForMocks).filter((key) =>
|
|
269
|
-
key.
|
|
270
|
-
|
|
267
|
+
? Object.keys(dataForMocks).filter((key) => {
|
|
268
|
+
const keyBaseName = key.split(/[<(]/)[0];
|
|
269
|
+
return keyBaseName === entityBaseName;
|
|
270
|
+
})
|
|
271
271
|
: [];
|
|
272
272
|
|
|
273
273
|
// If there are multiple keys (e.g., one for root.tsx and one for Settings),
|
|
@@ -302,11 +302,9 @@ export default async function writeSimpleRoot(
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
|
|
305
|
-
// Find a key that
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
return rootPropertyNames.includes(varName);
|
|
309
|
-
});
|
|
305
|
+
// Find a key that matches by call signature
|
|
306
|
+
// For call signature format (e.g., "useLoaderData()"), just use the first match
|
|
307
|
+
mockKey = matchingKeys[0];
|
|
310
308
|
|
|
311
309
|
// Fallback: if no match found but there are multiple keys,
|
|
312
310
|
// exclude the route's key (which we can identify from mockedImports variable names)
|
|
@@ -1,12 +1,93 @@
|
|
|
1
1
|
import { joinParenthesesAndArrays, splitOutsideParenthesesAndArrays, functionArguments, cleanOutBoundary, fillInDirectSchemaGapsAndUnknowns, removeDuplicateFunctionCalls, } from "../../../../../packages/ai/index.js";
|
|
2
2
|
/**
|
|
3
|
-
* Converts a
|
|
4
|
-
*
|
|
3
|
+
* Converts a call signature to a valid JavaScript identifier (function name).
|
|
4
|
+
* The original signature is preserved for data access - this only creates the function name.
|
|
5
|
+
*
|
|
6
|
+
* Examples:
|
|
7
|
+
* - "useAuth()" → "useAuth"
|
|
8
|
+
* - "db.select(usersQuery)" → "db_select_usersQuery"
|
|
9
|
+
* - "db.select(postsQuery)" → "db_select_postsQuery"
|
|
10
|
+
* - "useFetcher<User>()" → "useFetcher_User"
|
|
11
|
+
* - "useFetcher<{ data: UserData | null }>()" → "useFetcher_data_UserData_null"
|
|
12
|
+
* - "eq('user_id', value)" → "eq_user_id_value"
|
|
13
|
+
* - "from('workouts')" → "from_workouts"
|
|
5
14
|
*/
|
|
6
|
-
function
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
15
|
+
function callSignatureToFunctionName(signature) {
|
|
16
|
+
// Extract components from the signature
|
|
17
|
+
const components = [];
|
|
18
|
+
// 1. Extract function path (parts separated by dots outside parens/brackets)
|
|
19
|
+
const pathMatch = signature.match(/^([^<(]+)/);
|
|
20
|
+
if (pathMatch) {
|
|
21
|
+
const path = pathMatch[1];
|
|
22
|
+
// Split on dots but preserve the parts
|
|
23
|
+
components.push(...path.split('.').filter(Boolean));
|
|
24
|
+
}
|
|
25
|
+
// 2. Extract generic type parameters (content between < and >)
|
|
26
|
+
const genericMatch = signature.match(/<([^>]+)>/);
|
|
27
|
+
if (genericMatch) {
|
|
28
|
+
const genericContent = genericMatch[1];
|
|
29
|
+
// Extract meaningful identifiers from generic type
|
|
30
|
+
// Handle complex types like "{ data: UserData | null }"
|
|
31
|
+
const typeIdentifiers = genericContent
|
|
32
|
+
.replace(/[{}:;,]/g, ' ') // Remove structural chars
|
|
33
|
+
.replace(/\|/g, ' ') // Handle union types
|
|
34
|
+
.split(/\s+/)
|
|
35
|
+
.filter(Boolean)
|
|
36
|
+
.filter((s) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(s)) // Only valid identifiers
|
|
37
|
+
.filter((s) => ![
|
|
38
|
+
'null',
|
|
39
|
+
'undefined',
|
|
40
|
+
'void',
|
|
41
|
+
'never',
|
|
42
|
+
'any',
|
|
43
|
+
'unknown',
|
|
44
|
+
'data',
|
|
45
|
+
'typeof',
|
|
46
|
+
].includes(s)); // Skip common non-meaningful keywords
|
|
47
|
+
if (typeIdentifiers.length > 0) {
|
|
48
|
+
components.push(...typeIdentifiers.slice(0, 2)); // Limit to first 2 for reasonable length
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// 3. Extract function arguments (first 2 for disambiguation)
|
|
52
|
+
const argsMatch = signature.match(/\(([^)]*)\)/);
|
|
53
|
+
if (argsMatch && argsMatch[1]) {
|
|
54
|
+
const argsContent = argsMatch[1].trim();
|
|
55
|
+
if (argsContent) {
|
|
56
|
+
const args = argsContent.split(',').map((arg) => arg.trim());
|
|
57
|
+
for (const arg of args.slice(0, 2)) {
|
|
58
|
+
// For quoted strings, extract the content
|
|
59
|
+
const stringMatch = arg.match(/^['"`](.+)['"`]$/);
|
|
60
|
+
if (stringMatch) {
|
|
61
|
+
// Split on dots for string paths like 'users.id'
|
|
62
|
+
const parts = stringMatch[1].split('.').filter(Boolean);
|
|
63
|
+
components.push(...parts);
|
|
64
|
+
}
|
|
65
|
+
else if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(arg)) {
|
|
66
|
+
// Valid identifier - use as-is
|
|
67
|
+
components.push(arg);
|
|
68
|
+
}
|
|
69
|
+
else if (/^\d+$/.test(arg)) {
|
|
70
|
+
// Number - use as-is
|
|
71
|
+
components.push(arg);
|
|
72
|
+
}
|
|
73
|
+
// Skip complex expressions
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Build the function name from components
|
|
78
|
+
const functionName = components
|
|
79
|
+
.join('_')
|
|
80
|
+
.replace(/[^a-zA-Z0-9_]/g, '_') // Sanitize special chars
|
|
81
|
+
.replace(/_+/g, '_') // Collapse multiple underscores
|
|
82
|
+
.replace(/^_|_$/g, ''); // Trim underscores
|
|
83
|
+
return functionName || 'mock';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a mock name is a call signature (e.g., "useFetcher<User>()", "db.select(query)")
|
|
87
|
+
*/
|
|
88
|
+
function isCallSignature(mockName) {
|
|
89
|
+
// Call signatures contain parentheses (function calls)
|
|
90
|
+
return mockName.includes('(');
|
|
10
91
|
}
|
|
11
92
|
/**
|
|
12
93
|
* Extract property names that are jsx-components and should be preserved from original.
|
|
@@ -140,17 +221,20 @@ function isValidKey(key) {
|
|
|
140
221
|
const keyWithOutArguments = key.split('(')[0];
|
|
141
222
|
return !/\s/.test(keyWithOutArguments);
|
|
142
223
|
}
|
|
143
|
-
export default function constructMockCode(mockName, dependencySchemas, entityType,
|
|
144
|
-
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
224
|
+
export default function constructMockCode(mockName, dependencySchemas, entityType, _canonicalKey, // DEPRECATED: No longer used, kept for API compatibility
|
|
225
|
+
options) {
|
|
226
|
+
// Check if mockName is a call signature (e.g., "useFetcher<User>()", "db.select(query)")
|
|
227
|
+
const mockNameIsCallSignature = isCallSignature(mockName);
|
|
228
|
+
// For call signatures, use the original signature for data access but generate
|
|
229
|
+
// a valid JS function name from it
|
|
230
|
+
const derivedFunctionName = mockNameIsCallSignature
|
|
231
|
+
? callSignatureToFunctionName(mockName)
|
|
150
232
|
: null;
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
233
|
+
// The baseMockName is the function name without type params and args
|
|
234
|
+
// e.g., "useFetcher<User>()" -> "useFetcher", "db.select(query)" -> "db"
|
|
235
|
+
const baseMockName = mockName.split(/[<(]/)[0];
|
|
236
|
+
// The data key is the mockName (call signature) for data access
|
|
237
|
+
let dataKey;
|
|
154
238
|
const mockNameParts = splitOutsideParenthesesAndArrays(baseMockName);
|
|
155
239
|
let relevantReturnValueSchema;
|
|
156
240
|
let dataStructurePath;
|
|
@@ -159,26 +243,9 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
159
243
|
let signatureSchema;
|
|
160
244
|
for (const filePath in dependencySchemas) {
|
|
161
245
|
for (const entityName in dependencySchemas[filePath]) {
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
? `${variableQualifier} <- ${baseMockName}`
|
|
166
|
-
: mockNameParts[0];
|
|
167
|
-
// Check for direct match
|
|
168
|
-
let matches = entityName === targetEntityName || entityName === mockNameParts[0];
|
|
169
|
-
// If no direct match and no qualifier was provided, check if the entity
|
|
170
|
-
// is stored under a variable-qualified key (e.g., "stateBadge <- getStateBadge")
|
|
171
|
-
// This handles the case where gatherDataForMocks stored the entity with a variable
|
|
172
|
-
// qualifier but writeScenarioComponents called constructMockCode without one.
|
|
173
|
-
if (!matches && !variableQualifier) {
|
|
174
|
-
const qualifiedKeyMatch = entityName.match(new RegExp(`^([a-zA-Z_][a-zA-Z0-9_]*)\\s*<-\\s*${mockNameParts[0]}$`));
|
|
175
|
-
if (qualifiedKeyMatch) {
|
|
176
|
-
matches = true;
|
|
177
|
-
// Extract the variable qualifier from the entity name so we can use
|
|
178
|
-
// it for the data lookup key later
|
|
179
|
-
variableQualifier = qualifiedKeyMatch[1];
|
|
180
|
-
}
|
|
181
|
-
}
|
|
246
|
+
// Match entity by base name (without generics/args)
|
|
247
|
+
const entityBaseName = entityName.split(/[<(]/)[0];
|
|
248
|
+
const matches = entityBaseName === baseMockName || entityName === mockNameParts[0];
|
|
182
249
|
if (!matches)
|
|
183
250
|
continue;
|
|
184
251
|
// Track if we found the entity and it has a signature (is a function)
|
|
@@ -210,6 +277,37 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
210
277
|
}
|
|
211
278
|
}
|
|
212
279
|
}
|
|
280
|
+
// Check if the entity is used as a function (called with ()) vs an object/namespace.
|
|
281
|
+
// Look for paths in the schema that start with "baseMockName(" or "baseMockName<" indicating function calls.
|
|
282
|
+
// The "<" handles generic type parameters like useLoaderData<T>().
|
|
283
|
+
// Also check dataStructurePath === 'returnValue' which indicates a function return value.
|
|
284
|
+
const entityIsFunction = foundEntityWithSignature ||
|
|
285
|
+
dataStructurePath === 'returnValue' ||
|
|
286
|
+
Object.keys(relevantReturnValueSchema ?? {}).some((key) => key.startsWith(`${baseMockName}(`) ||
|
|
287
|
+
key.startsWith(`${baseMockName}<`));
|
|
288
|
+
// Calculate the data key - use the call signature (mockName) for data access
|
|
289
|
+
// For simple names without parentheses:
|
|
290
|
+
// - Append () ONLY if the entity is a function/hook (detected above)
|
|
291
|
+
// - Don't append () for object/namespace mocks like "supabase"
|
|
292
|
+
if (mockNameIsCallSignature || mockName.includes('(')) {
|
|
293
|
+
dataKey = mockName;
|
|
294
|
+
}
|
|
295
|
+
else if (entityIsFunction) {
|
|
296
|
+
// Entity is a function/hook - append () to match call signature format
|
|
297
|
+
dataKey = `${mockName}()`;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
// Entity is an object/namespace - use bare name as key
|
|
301
|
+
dataKey = mockName;
|
|
302
|
+
}
|
|
303
|
+
// LOGGING: Track data key generation for debugging key mismatch issues
|
|
304
|
+
console.log('CODEYAM DEBUG [constructMockCode]: Generated dataKey:', JSON.stringify({
|
|
305
|
+
mockName,
|
|
306
|
+
dataKey,
|
|
307
|
+
mockNameIsCallSignature,
|
|
308
|
+
entityIsFunction,
|
|
309
|
+
baseMockName,
|
|
310
|
+
}));
|
|
213
311
|
// Check if the return value schema only contains function type markers
|
|
214
312
|
// (e.g., "validateInputs()": "function") without actual return data
|
|
215
313
|
// (no functionCallReturnValue entries)
|
|
@@ -287,17 +385,16 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
287
385
|
// Strip type parameters like <typeof loader> from function names
|
|
288
386
|
// so "useLoaderData<typeof loader>()" becomes "useLoaderData()"
|
|
289
387
|
name = cleanOutTypes(name);
|
|
290
|
-
// For
|
|
291
|
-
// This
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
//
|
|
295
|
-
|
|
296
|
-
|
|
388
|
+
// For root data access, use the dataKey (original call signature or canonical key)
|
|
389
|
+
// This preserves the original call signature for LLM clarity
|
|
390
|
+
if (isRootAccess) {
|
|
391
|
+
// For call signature format, use the original mockName as the data key
|
|
392
|
+
// e.g., scenarios().data()?.["useFetcher<User>()"]
|
|
393
|
+
// e.g., scenarios().data()?.["db.select(usersQuery)"]
|
|
394
|
+
return `?.["${dataKey.replace(/\n/g, '\\n')}"]`;
|
|
297
395
|
}
|
|
298
396
|
// Only use unquoted array access syntax for pure array indices like [0], [1]
|
|
299
|
-
|
|
300
|
-
if (name.match(/^\[\d+\]$/) && !name.includes(' <- ')) {
|
|
397
|
+
if (name.match(/^\[\d+\]$/)) {
|
|
301
398
|
return `?.${name}`;
|
|
302
399
|
}
|
|
303
400
|
return `?.["${name.replace(/\n/g, '\\n')}"]`;
|
|
@@ -499,9 +596,17 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
499
596
|
// When GENERIC array (using []) has nested content (like functions that need wrapping),
|
|
500
597
|
// use .map() to transform ALL elements instead of just creating [0]
|
|
501
598
|
// For DIFFERENTIATED arrays (using [0], [1], etc.), keep the static array structure
|
|
599
|
+
//
|
|
600
|
+
// IMPORTANT: If the nested content contains differentiated indices like [0], [1],
|
|
601
|
+
// we MUST use static array pattern, not .map(). The presence of differentiated
|
|
602
|
+
// indices means the array elements have different types/structures, so .map()
|
|
603
|
+
// would generate invalid code trying to treat them uniformly.
|
|
604
|
+
const hasDifferentiatedIndices = nested &&
|
|
605
|
+
nested.some((n) => n.name.match(/^\[\d+\]$/) && n.name !== '[0]');
|
|
502
606
|
if (isGenericArray &&
|
|
503
607
|
nestedContent.length > 0 &&
|
|
504
|
-
dataPaths.length > 0
|
|
608
|
+
dataPaths.length > 0 &&
|
|
609
|
+
!hasDifferentiatedIndices) {
|
|
505
610
|
// Get the array base path (without the [0])
|
|
506
611
|
const arrayBasePath = dataPaths[0].replace(/\?\.\[0\]$/, '');
|
|
507
612
|
// Replace [0] references with [__idx__] in level contents
|
|
@@ -531,6 +636,12 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
531
636
|
if (args && args.length > 0) {
|
|
532
637
|
if (!isValidKey(name))
|
|
533
638
|
return;
|
|
639
|
+
// Skip array index patterns like [], [0], [1] when they have args
|
|
640
|
+
// These represent function calls on array elements, not property keys
|
|
641
|
+
// e.g., customSizes[].(args) means each array element is callable, not a property named "[]"
|
|
642
|
+
if (name.match(/^\[\d*\]$/)) {
|
|
643
|
+
return;
|
|
644
|
+
}
|
|
534
645
|
const mostArgs = args.sort((a, b) => b.length - a.length)[0];
|
|
535
646
|
const argsString = mostArgs
|
|
536
647
|
.map((_, index) => `arg${index + 1}`)
|
|
@@ -570,8 +681,19 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
570
681
|
fallbackContent = `return ${returnValueContents}`;
|
|
571
682
|
}
|
|
572
683
|
else {
|
|
573
|
-
//
|
|
574
|
-
|
|
684
|
+
// No explicit fallback paths - return the first literal's value as default
|
|
685
|
+
// Returning spread of all values is dangerous because if values are primitives (strings),
|
|
686
|
+
// spreading them creates objects with numeric keys like {0:'a', 1:'b', ...}
|
|
687
|
+
// which causes "Objects are not valid as React child" errors
|
|
688
|
+
const firstLiteralValue = literalKeys[0];
|
|
689
|
+
const firstGroupPaths = argGroups.get(firstLiteralValue);
|
|
690
|
+
if (firstGroupPaths && firstGroupPaths.length === 1) {
|
|
691
|
+
fallbackContent = `return ${firstGroupPaths[0]}`;
|
|
692
|
+
}
|
|
693
|
+
else {
|
|
694
|
+
// Multiple paths for first literal - return undefined as safe fallback
|
|
695
|
+
fallbackContent = `return undefined`;
|
|
696
|
+
}
|
|
575
697
|
}
|
|
576
698
|
const funcContents = conditionalBranches.join('\n') +
|
|
577
699
|
'\n// Fallback for unmatched arguments\n' +
|
|
@@ -653,8 +775,8 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
653
775
|
parts.splice(i, 1);
|
|
654
776
|
}
|
|
655
777
|
}
|
|
656
|
-
//
|
|
657
|
-
//
|
|
778
|
+
// Compare against baseMockName (without generics/args), not the full mockName
|
|
779
|
+
// e.g., for "useFetcher<User>()", baseMockName is "useFetcher"
|
|
658
780
|
if (parts[0].split('(')[0] !== baseMockName)
|
|
659
781
|
continue;
|
|
660
782
|
// Include paths with functionCallReturnValue OR function-typed paths that need mocking
|
|
@@ -1047,16 +1169,17 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
1047
1169
|
// For headers() and cookies() from next/headers, add common iterator methods
|
|
1048
1170
|
// These are needed when the mock is passed to functions that use .entries(), .keys(), etc.
|
|
1049
1171
|
// (e.g., Object.fromEntries(headers.entries()) in buildLegacyHeaders)
|
|
1050
|
-
const needsIteratorMethods =
|
|
1172
|
+
const needsIteratorMethods = baseMockName === 'headers' || baseMockName === 'cookies';
|
|
1051
1173
|
let enhancedContents = contents;
|
|
1052
1174
|
if (needsIteratorMethods && contents.trim().startsWith('{')) {
|
|
1053
1175
|
// Add iterator methods that operate on the scenario data
|
|
1176
|
+
// Use the dataKey (original call signature or canonical key)
|
|
1054
1177
|
const iteratorMethods = `,
|
|
1055
|
-
entries: () => Object.entries(scenarios().data()?.["${
|
|
1056
|
-
keys: () => Object.keys(scenarios().data()?.["${
|
|
1057
|
-
values: () => Object.values(scenarios().data()?.["${
|
|
1058
|
-
forEach: (fn) => Object.entries(scenarios().data()?.["${
|
|
1059
|
-
has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${
|
|
1178
|
+
entries: () => Object.entries(scenarios().data()?.["${dataKey}"] || {}),
|
|
1179
|
+
keys: () => Object.keys(scenarios().data()?.["${dataKey}"] || {}),
|
|
1180
|
+
values: () => Object.values(scenarios().data()?.["${dataKey}"] || {}),
|
|
1181
|
+
forEach: (fn) => Object.entries(scenarios().data()?.["${dataKey}"] || {}).forEach(([k, v]) => fn(v, k)),
|
|
1182
|
+
has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${dataKey}"] || {}, key)`;
|
|
1060
1183
|
// Insert before the closing brace (handle trailing whitespace)
|
|
1061
1184
|
enhancedContents = contents.replace(/\}\s*$/, iteratorMethods + '\n}');
|
|
1062
1185
|
}
|
|
@@ -1066,36 +1189,103 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
|
|
|
1066
1189
|
// `new ClassName("arg")` wouldn't create the expected instance.
|
|
1067
1190
|
// For Error subclasses (detected by name ending in "Error"), extend Error for proper error handling.
|
|
1068
1191
|
if (entityType === 'class') {
|
|
1069
|
-
const isErrorSubclass =
|
|
1070
|
-
const baseClass = isErrorSubclass ? 'Error' : 'Object';
|
|
1192
|
+
const isErrorSubclass = baseMockName.endsWith('Error');
|
|
1071
1193
|
const superCall = isErrorSubclass ? 'super(message);' : '';
|
|
1072
1194
|
const nameAssignment = isErrorSubclass
|
|
1073
|
-
? `this.name = '${
|
|
1195
|
+
? `this.name = '${baseMockName}';`
|
|
1074
1196
|
: '';
|
|
1075
|
-
|
|
1197
|
+
// Use the safe function name for the class definition
|
|
1198
|
+
const className = mockNameIsCallSignature
|
|
1199
|
+
? derivedFunctionName
|
|
1200
|
+
: baseMockName;
|
|
1201
|
+
return `class ${className}${isErrorSubclass ? ' extends Error' : ''} {
|
|
1076
1202
|
constructor(message) {
|
|
1077
1203
|
${superCall}
|
|
1078
1204
|
${nameAssignment}
|
|
1079
|
-
Object.assign(this, scenarios().data()?.["${
|
|
1205
|
+
Object.assign(this, scenarios().data()?.["${dataKey}"] || {});
|
|
1080
1206
|
}
|
|
1081
1207
|
}`;
|
|
1082
1208
|
}
|
|
1083
|
-
//
|
|
1084
|
-
//
|
|
1085
|
-
//
|
|
1086
|
-
//
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1209
|
+
// Generate safe function name:
|
|
1210
|
+
// 1. For call signatures: use derivedFunctionName
|
|
1211
|
+
// e.g., "useFetcher<User>()" becomes "useFetcher_User"
|
|
1212
|
+
// e.g., "db.select(usersQuery)" becomes "db_select_usersQuery"
|
|
1213
|
+
// 2. With uniqueFunctionSuffix option: append suffix for unique naming
|
|
1214
|
+
// e.g., baseMockName = "useFetcher", suffix = "entityDiffFetcher" -> "useFetcher_entityDiffFetcher"
|
|
1215
|
+
// 3. EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
|
|
1216
|
+
let safeFunctionName;
|
|
1217
|
+
if (options?.keepOriginalFunctionName) {
|
|
1218
|
+
safeFunctionName = baseMockName;
|
|
1219
|
+
}
|
|
1220
|
+
else if (options?.uniqueFunctionSuffix) {
|
|
1221
|
+
safeFunctionName = `${baseMockName}_${options.uniqueFunctionSuffix}`;
|
|
1222
|
+
}
|
|
1223
|
+
else if (mockNameIsCallSignature && derivedFunctionName) {
|
|
1224
|
+
safeFunctionName = derivedFunctionName;
|
|
1225
|
+
}
|
|
1226
|
+
else {
|
|
1227
|
+
safeFunctionName = baseMockName;
|
|
1228
|
+
}
|
|
1229
|
+
// Check if this function returns a function (detected by double-call pattern: mockName(args)())
|
|
1230
|
+
// This happens when the schema has keys like "wrapThrows(() => JSON.parse(savedFilters))()"
|
|
1231
|
+
// where the function call is immediately followed by another call.
|
|
1232
|
+
// Example usage: const result = wrapThrows(() => JSON.parse(x))(); // double call
|
|
1233
|
+
const isHigherOrderFunction = Object.keys(relevantReturnValueSchema ?? {}).some((key) => {
|
|
1234
|
+
if (!key.startsWith(baseMockName))
|
|
1235
|
+
return false;
|
|
1236
|
+
// Find the first ( after baseMockName (the start of the function call)
|
|
1237
|
+
const firstOpenParen = key.indexOf('(', baseMockName.length);
|
|
1238
|
+
if (firstOpenParen === -1)
|
|
1239
|
+
return false;
|
|
1240
|
+
// Skip if the ( is not immediately after the mock name
|
|
1241
|
+
// (there might be type params like func<T>() - handle by checking for < or ()
|
|
1242
|
+
const between = key.slice(baseMockName.length, firstOpenParen);
|
|
1243
|
+
if (between.length > 0 && !between.startsWith('<'))
|
|
1244
|
+
return false;
|
|
1245
|
+
// Find the matching ) for the first ( using depth counting
|
|
1246
|
+
let depth = 1;
|
|
1247
|
+
let i = firstOpenParen + 1;
|
|
1248
|
+
while (i < key.length && depth > 0) {
|
|
1249
|
+
if (key[i] === '(')
|
|
1250
|
+
depth++;
|
|
1251
|
+
if (key[i] === ')')
|
|
1252
|
+
depth--;
|
|
1253
|
+
i++;
|
|
1254
|
+
}
|
|
1255
|
+
if (depth !== 0)
|
|
1256
|
+
return false; // Unbalanced parentheses
|
|
1257
|
+
// Now i points just after the matching )
|
|
1258
|
+
// Check if there's another ( immediately (indicating double call)
|
|
1259
|
+
const remaining = key.slice(i);
|
|
1260
|
+
if (remaining.startsWith('('))
|
|
1261
|
+
return true;
|
|
1262
|
+
return false;
|
|
1263
|
+
});
|
|
1264
|
+
// For higher-order functions, wrap the return in an arrow function
|
|
1265
|
+
// so that mockFunc(arg)() works correctly (outer call returns a function, inner call gets the data)
|
|
1266
|
+
const returnValue = isHigherOrderFunction
|
|
1267
|
+
? `() => ${safeFunctionName}ReturnValue`
|
|
1268
|
+
: `${safeFunctionName}ReturnValue`;
|
|
1269
|
+
return `const ${safeFunctionName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}() {\n${indent(`return ${returnValue};`)}\n}`;
|
|
1091
1270
|
}
|
|
1092
1271
|
else {
|
|
1093
|
-
//
|
|
1094
|
-
//
|
|
1095
|
-
//
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1272
|
+
// Generate safe const name:
|
|
1273
|
+
// 1. For call signatures: use derivedFunctionName
|
|
1274
|
+
// 2. With uniqueFunctionSuffix option: append suffix for unique naming
|
|
1275
|
+
// 3. EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
|
|
1276
|
+
let safeName;
|
|
1277
|
+
if (options?.keepOriginalFunctionName) {
|
|
1278
|
+
safeName = baseMockName;
|
|
1279
|
+
}
|
|
1280
|
+
else if (options?.uniqueFunctionSuffix) {
|
|
1281
|
+
safeName = `${baseMockName}_${options.uniqueFunctionSuffix}`;
|
|
1282
|
+
}
|
|
1283
|
+
else if (mockNameIsCallSignature && derivedFunctionName) {
|
|
1284
|
+
safeName = derivedFunctionName;
|
|
1285
|
+
}
|
|
1286
|
+
else {
|
|
1287
|
+
safeName = baseMockName;
|
|
1288
|
+
}
|
|
1099
1289
|
// Get any jsx-component properties that need to be preserved from the original
|
|
1100
1290
|
const jsxProperties = getJsxComponentProperties(mockName, relevantReturnValueSchema);
|
|
1101
1291
|
// If there are jsx-component properties, add them as references to the original
|