@codeyam/codeyam-cli 0.1.0-staging.8e7b1bd → 0.1.0-staging.b8a55ba
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 +7 -6
- package/analyzer-template/packages/ai/package.json +1 -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 +661 -50
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +14 -2
- 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 +123 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +19 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +23 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +23 -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/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 +11 -15
- 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 +339 -145
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +20 -0
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +8 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +158 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +107 -18
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +223 -103
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +10 -5
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +172 -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 +97 -27
- 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/database/src/lib/loadReadyToBeCapturedAnalyses.ts +3 -2
- 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/generate/src/lib/getComponentScenarioPath.ts +8 -3
- 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/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +4 -2
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +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/generate/src/lib/getComponentScenarioPath.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/getComponentScenarioPath.js +7 -3
- package/analyzer-template/packages/github/dist/generate/src/lib/getComponentScenarioPath.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/applyUniversalMocks.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js +26 -2
- package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js.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/package.json +4 -4
- 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/applyUniversalMocks.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js +26 -2
- package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js.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/applyUniversalMocks.ts +28 -2
- 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/TESTING.md +83 -0
- package/analyzer-template/project/constructMockCode.ts +151 -30
- package/analyzer-template/project/loadReadyToBeCaptured.ts +17 -1
- package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +16 -9
- package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +77 -37
- package/analyzer-template/project/reconcileMockDataKeys.ts +104 -3
- package/analyzer-template/project/runMultiScenarioServer.ts +11 -10
- package/analyzer-template/project/serverOnlyModules.ts +288 -0
- package/analyzer-template/project/start.ts +10 -0
- package/analyzer-template/project/startScenarioCapture.ts +73 -41
- package/analyzer-template/project/writeMockDataTsx.ts +103 -40
- package/analyzer-template/project/writeScenarioComponents.ts +1162 -203
- package/analyzer-template/project/writeSimpleRoot.ts +26 -4
- package/analyzer-template/project/writeUniversalMocks.ts +32 -11
- package/background/src/lib/virtualized/project/constructMockCode.js +132 -25
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +15 -1
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js +11 -6
- package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.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 +65 -4
- 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 +235 -0
- package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -0
- 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 +87 -34
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +852 -133
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +25 -2
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/background/src/lib/virtualized/project/writeUniversalMocks.js +27 -12
- package/background/src/lib/virtualized/project/writeUniversalMocks.js.map +1 -1
- package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js +7 -0
- package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js.map +1 -0
- 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 -7
- 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-DQeyk25_.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-ayCJdUAc.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)-2mG6mjVb.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._-FHOVOgFN.js → entity._sha._-zUEpfPsu.js} +22 -15
- 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-C6vQASxy.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-09d684be.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-BxJUvKau.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-DOGXmJcI.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-C07gRg7Z.js → useToast-DWHcCcl1.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-CV6i1S1A.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BDlyhfrv.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/debug-codeyam.md +620 -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 +523 -42
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +12 -2
- 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 +103 -1
- 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 +19 -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/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/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 +11 -15
- 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 +258 -110
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +18 -0
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +6 -1
- package/packages/analyze/src/lib/files/getImportedExports.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 +74 -19
- 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 +175 -58
- 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 +127 -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 +74 -23
- 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/database/src/lib/loadReadyToBeCapturedAnalyses.js +4 -2
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.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/generate/src/lib/getComponentScenarioPath.js +7 -3
- package/packages/generate/src/lib/getComponentScenarioPath.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/applyUniversalMocks.js +26 -2
- package/packages/utils/src/lib/applyUniversalMocks.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/src/webserver/build/client/assets/EntityItem-CWKV2GEz.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-D2hFeDeg.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-C8K-4kKP.js +0 -26
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DgXLv61M.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/LogViewer-DFdLQbPS.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DlRDjT4h.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-7UkVL-UI.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-XjtsGuPo.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/_index-D2eJjWLf.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-w6sbwlOd.js +0 -7
- package/codeyam-cli/src/webserver/build/client/assets/chevron-down-BBNQ8hup.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-Bex4RrGs.js +0 -26
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-cdhjVtom.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-DkgmwwRC.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-CwLmCS0J.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-YZ-kM3ZG.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-BeQlz94_.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-DN2XXM7Z.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-CUeAIQNI.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-ccMQfhGf.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-JmESAHx5.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-DsL9BiOc.js +0 -8
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-COYCR2oZ.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-90adba57.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-DfbVEEjF.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/search-DvK9iMBu.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-9LTbit4Z.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-BrxN5ZtV.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-Iv0p8T-1.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-BWmSRPH6.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-CE_1qXCG.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BY_VDhiD.js +0 -166
- package/codeyam-cli/templates/debug-command.md +0 -141
- /package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CMKNK2uU.css → styles-CMKNK2uU.css} +0 -0
|
@@ -17,6 +17,12 @@ interface UseStateInfo {
|
|
|
17
17
|
export class ReactFrameworkManager implements EquivalencyManager {
|
|
18
18
|
private useStateInfos: UseStateInfo[] = [];
|
|
19
19
|
private useCallbackEquivalents: Record<string, string> = {};
|
|
20
|
+
// Track variables used as ref props - they should be typed as 'null'
|
|
21
|
+
// Format: { scopeNodeName -> Set of variable paths }
|
|
22
|
+
private refVariables: Map<string, Set<string>> = new Map();
|
|
23
|
+
// Track ref variable source paths for updating external function call schemas in finalize
|
|
24
|
+
// Format: { functionCallName -> Set of source paths (e.g., 'useAutoAnimate().functionCallReturnValue[]') }
|
|
25
|
+
private refVariableSources: Map<string, Set<string>> = new Map();
|
|
20
26
|
|
|
21
27
|
postProcess(scopeNode: ScopeNode, scopeDataStructure: ScopeDataStructure) {
|
|
22
28
|
this.handleUseState(scopeNode, scopeDataStructure);
|
|
@@ -139,7 +145,27 @@ export class ReactFrameworkManager implements EquivalencyManager {
|
|
|
139
145
|
'main',
|
|
140
146
|
]);
|
|
141
147
|
|
|
142
|
-
finalize(
|
|
148
|
+
finalize(scopeNode: ScopeNode, scopeDataStructure: ScopeDataStructure) {
|
|
149
|
+
// Set all tracked ref variables to 'null' type
|
|
150
|
+
// This ensures mock data generation uses null instead of placeholder strings
|
|
151
|
+
const refVarsForScope = this.refVariables.get(scopeNode.name);
|
|
152
|
+
if (refVarsForScope) {
|
|
153
|
+
for (const refVar of refVarsForScope) {
|
|
154
|
+
scopeNode.schema[refVar] = 'null';
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Update external function call schemas with ref source paths
|
|
159
|
+
// This runs AFTER schema building is complete, so the null values won't be overwritten
|
|
160
|
+
for (const efc of scopeDataStructure.externalFunctionCalls) {
|
|
161
|
+
const refSourcePaths = this.refVariableSources.get(efc.name);
|
|
162
|
+
if (refSourcePaths) {
|
|
163
|
+
for (const sourcePath of refSourcePaths) {
|
|
164
|
+
efc.schema[sourcePath] = 'null';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
143
169
|
|
|
144
170
|
private findUseStateInfo(useStateCall: string) {
|
|
145
171
|
return this.useStateInfos.find(
|
|
@@ -564,6 +590,102 @@ export class ReactFrameworkManager implements EquivalencyManager {
|
|
|
564
590
|
for (const [equivalentPath, equivalentValues] of Object.entries(
|
|
565
591
|
scopeNode.equivalencies,
|
|
566
592
|
)) {
|
|
593
|
+
// Check if the equivalency KEY (e.g., "div().signature[0].ref") ends with .ref
|
|
594
|
+
// If so, the VALUE (e.g., "parent") should be marked as null
|
|
595
|
+
const equivalentPathParts = scopeDataStructure.splitPath(equivalentPath);
|
|
596
|
+
const pathLength = equivalentPathParts.length;
|
|
597
|
+
|
|
598
|
+
if (pathLength >= 2) {
|
|
599
|
+
const secondToLast = equivalentPathParts[pathLength - 2];
|
|
600
|
+
const last = equivalentPathParts[pathLength - 1];
|
|
601
|
+
|
|
602
|
+
if (secondToLast === 'signature[0]' && last === 'ref') {
|
|
603
|
+
// This is a ref prop usage like div().signature[0].ref -> parent
|
|
604
|
+
for (const equivalentValue of equivalentValues) {
|
|
605
|
+
propagated = true;
|
|
606
|
+
|
|
607
|
+
// Track this variable as a ref - we'll set its type to 'null' in finalize()
|
|
608
|
+
// after the schema is built (setting directly here would be overwritten)
|
|
609
|
+
// IMPORTANT: The ref variable might be defined in a parent scope, not the
|
|
610
|
+
// current scope. We need to find where the variable is actually defined by
|
|
611
|
+
// walking up the scope tree.
|
|
612
|
+
const varName = equivalentValue.schemaPath;
|
|
613
|
+
let targetScope: ScopeNode | null = scopeNode;
|
|
614
|
+
|
|
615
|
+
// Walk up the scope tree to find where this variable is defined
|
|
616
|
+
while (targetScope) {
|
|
617
|
+
// Check if this scope has the variable in its schema or equivalencies
|
|
618
|
+
const hasVariable =
|
|
619
|
+
varName in (targetScope.schema || {}) ||
|
|
620
|
+
varName in (targetScope.equivalencies || {});
|
|
621
|
+
|
|
622
|
+
if (hasVariable) {
|
|
623
|
+
if (!this.refVariables.has(targetScope.name)) {
|
|
624
|
+
this.refVariables.set(targetScope.name, new Set());
|
|
625
|
+
}
|
|
626
|
+
this.refVariables.get(targetScope.name)!.add(varName);
|
|
627
|
+
|
|
628
|
+
// IMPORTANT: Also update the source of the ref variable in the external
|
|
629
|
+
// function call's schema. This ensures dataForMocks produces [null]
|
|
630
|
+
// instead of ["string"] for hooks like useAutoAnimate.
|
|
631
|
+
const varEquivalencies = targetScope.equivalencies?.[varName];
|
|
632
|
+
if (varEquivalencies) {
|
|
633
|
+
for (const varEquivalency of varEquivalencies) {
|
|
634
|
+
const sourcePath = varEquivalency.schemaPath;
|
|
635
|
+
// Check if this comes from an external function call
|
|
636
|
+
// (contains functionCallReturnValue which indicates it's a hook/function return)
|
|
637
|
+
if (sourcePath.includes('functionCallReturnValue')) {
|
|
638
|
+
// Store the source path for later - we'll update the external function
|
|
639
|
+
// call's schema in finalize() which runs AFTER schema building is complete.
|
|
640
|
+
// Setting it here would be overwritten by later schema building.
|
|
641
|
+
for (const efc of scopeDataStructure.externalFunctionCalls) {
|
|
642
|
+
if (sourcePath.startsWith(efc.name)) {
|
|
643
|
+
if (!this.refVariableSources.has(efc.name)) {
|
|
644
|
+
this.refVariableSources.set(efc.name, new Set());
|
|
645
|
+
}
|
|
646
|
+
// Store both the specific indexed path and the generic [] path
|
|
647
|
+
this.refVariableSources
|
|
648
|
+
.get(efc.name)!
|
|
649
|
+
.add(sourcePath);
|
|
650
|
+
const genericPath = sourcePath.replace(
|
|
651
|
+
/\[\d+\]/g,
|
|
652
|
+
'[]',
|
|
653
|
+
);
|
|
654
|
+
if (genericPath !== sourcePath) {
|
|
655
|
+
this.refVariableSources
|
|
656
|
+
.get(efc.name)!
|
|
657
|
+
.add(genericPath);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// Move up to parent scope
|
|
667
|
+
if (targetScope.tree && targetScope.tree.length > 0) {
|
|
668
|
+
const parentScopeName =
|
|
669
|
+
targetScope.tree[targetScope.tree.length - 1];
|
|
670
|
+
targetScope = scopeDataStructure.getScopeOrFunctionCallInfo(
|
|
671
|
+
parentScopeName,
|
|
672
|
+
) as ScopeNode | null;
|
|
673
|
+
} else {
|
|
674
|
+
targetScope = null;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
scopeDataStructure.removeEquivalency(
|
|
679
|
+
equivalentPath,
|
|
680
|
+
equivalentValue,
|
|
681
|
+
scopeNode,
|
|
682
|
+
);
|
|
683
|
+
}
|
|
684
|
+
continue;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// Original logic for checking the value side
|
|
567
689
|
for (const equivalentValue of equivalentValues) {
|
|
568
690
|
const equivalentValueParts = scopeDataStructure.splitPath(
|
|
569
691
|
equivalentValue.schemaPath,
|
package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts
CHANGED
|
@@ -64,6 +64,14 @@ const protoMethodSets: Record<PrimitiveKind, Set<string>> = {
|
|
|
64
64
|
),
|
|
65
65
|
};
|
|
66
66
|
|
|
67
|
+
/** Built-in properties (not methods) that should be removed from primitives.
|
|
68
|
+
* These are properties that exist on the prototype and shouldn't appear
|
|
69
|
+
* as schema entries (they cause malformed mock data structures). */
|
|
70
|
+
const protoPropertySets: Partial<Record<PrimitiveKind, Set<string>>> = {
|
|
71
|
+
array: new Set(['length']),
|
|
72
|
+
string: new Set(['length']),
|
|
73
|
+
};
|
|
74
|
+
|
|
67
75
|
/**
|
|
68
76
|
* Extract primitive kind from a type string, handling union types.
|
|
69
77
|
* E.g., "number | undefined" -> "number", "string | null" -> "string"
|
|
@@ -118,11 +126,21 @@ function scrub(
|
|
|
118
126
|
const rootKind = rootTable.get(prefix);
|
|
119
127
|
if (!rootKind) continue;
|
|
120
128
|
|
|
121
|
-
const
|
|
129
|
+
const rawToken = keyParts[cut];
|
|
130
|
+
const rawMethod = rawToken.split('(')[0];
|
|
131
|
+
|
|
132
|
+
// Check if it's a prototype method (e.g., map, filter, toString)
|
|
122
133
|
if (protoMethodSets[rootKind].has(rawMethod)) {
|
|
123
134
|
onRemove(keyPath);
|
|
124
135
|
break;
|
|
125
136
|
}
|
|
137
|
+
|
|
138
|
+
// Check if it's a built-in property (e.g., length on arrays/strings)
|
|
139
|
+
const propertySet = protoPropertySets[rootKind];
|
|
140
|
+
if (propertySet && propertySet.has(rawToken)) {
|
|
141
|
+
onRemove(keyPath);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
126
144
|
}
|
|
127
145
|
}
|
|
128
146
|
}
|
package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts
CHANGED
|
@@ -41,6 +41,19 @@ const isolatingArrayMethodsSet = new Set([
|
|
|
41
41
|
// Methods that are ambiguous - used on both arrays and non-arrays (e.g., router.push, history.pop)
|
|
42
42
|
// Don't infer array type from these alone without additional evidence
|
|
43
43
|
const ambiguousArrayMethodsSet = new Set(['push', 'pop']);
|
|
44
|
+
|
|
45
|
+
// Methods that return primitives (boolean, number) - their return values are not mockable
|
|
46
|
+
// These should have their .functionCallReturnValue paths removed from the schema
|
|
47
|
+
const primitiveReturningMethodsSet = new Set([
|
|
48
|
+
'some', // Returns boolean
|
|
49
|
+
'every', // Returns boolean
|
|
50
|
+
'includes', // Returns boolean
|
|
51
|
+
'indexOf', // Returns number (index)
|
|
52
|
+
'lastIndexOf', // Returns number (index from end)
|
|
53
|
+
'findIndex', // Returns number (index)
|
|
54
|
+
'findLastIndex', // Returns number (index from end)
|
|
55
|
+
]);
|
|
56
|
+
|
|
44
57
|
export const transformingArrayMethodsSet = new Set([
|
|
45
58
|
'map',
|
|
46
59
|
'reduce',
|
|
@@ -984,11 +997,20 @@ function clearAttributes(
|
|
|
984
997
|
basePath
|
|
985
998
|
)
|
|
986
999
|
continue;
|
|
1000
|
+
// Preserve functionCallReturnValue for non-string types, UNLESS
|
|
1001
|
+
// the method is a primitive-returning method (like some, every, includes, indexOf)
|
|
1002
|
+
// whose return values are not mockable
|
|
1003
|
+
const methodPart = keyParts[basePathParts.length];
|
|
1004
|
+
const methodName = methodPart?.split('(')[0];
|
|
1005
|
+
const isPrimitiveReturning = primitiveReturningMethodsSet.has(
|
|
1006
|
+
methodName ?? '',
|
|
1007
|
+
);
|
|
987
1008
|
if (
|
|
988
1009
|
mapping[basePath] !== 'string' &&
|
|
989
1010
|
keyParts[basePathParts.length + 1]?.startsWith(
|
|
990
1011
|
'functionCallReturnValue',
|
|
991
|
-
)
|
|
1012
|
+
) &&
|
|
1013
|
+
!isPrimitiveReturning
|
|
992
1014
|
)
|
|
993
1015
|
continue;
|
|
994
1016
|
|
|
@@ -6,6 +6,14 @@ const STANDALONE_INDEX_RE = /^\[(\d+)\]$/;
|
|
|
6
6
|
const isExplicitIndex = (s?: string) => !!s && INDEXED_RE.test(s);
|
|
7
7
|
const isStandaloneIndex = (s?: string) => !!s && STANDALONE_INDEX_RE.test(s);
|
|
8
8
|
|
|
9
|
+
// Detect .length properties that come from dynamic iteration patterns
|
|
10
|
+
// These aren't useful for mock data - arrays work without explicit length,
|
|
11
|
+
// and objects shouldn't have length. We filter .length that appears:
|
|
12
|
+
// 1. After array notation: metadata[].length, items[][].length
|
|
13
|
+
// 2. On object paths that likely come from iteration: metadata.length (when metadata has other props)
|
|
14
|
+
// The regex matches any path ending with .length that has [] somewhere before it
|
|
15
|
+
const DYNAMIC_LENGTH_RE = /\[\].*\.length$/;
|
|
16
|
+
|
|
9
17
|
// Treat these as structural placeholders (don't commit them as concrete leaves)
|
|
10
18
|
function isSkippableLeafType(t: string) {
|
|
11
19
|
// 'unknown' by itself is a placeholder (but 'boolean | unknown' is not)
|
|
@@ -23,6 +31,10 @@ export default function convertDotNotation(
|
|
|
23
31
|
const result: JsonTypeDefinition = {};
|
|
24
32
|
|
|
25
33
|
for (const [rawPath, typ] of Object.entries(schema)) {
|
|
34
|
+
// Skip paths with .length after array notation from dynamic iteration
|
|
35
|
+
// e.g., metadata[].length, metadata[][].length
|
|
36
|
+
if (DYNAMIC_LENGTH_RE.test(rawPath)) continue;
|
|
37
|
+
|
|
26
38
|
const parts = splitOutsideParenthesesAndArrays(rawPath);
|
|
27
39
|
if (!parts || parts.length === 0) continue;
|
|
28
40
|
|
|
@@ -187,6 +199,17 @@ export default function convertDotNotation(
|
|
|
187
199
|
i++; // consume '[]'
|
|
188
200
|
} else {
|
|
189
201
|
// Pattern like: "items", "[]", "id" -> items: [ { id: ... } ]
|
|
202
|
+
// But if cursor[key] is already a non-array object (from paths like "metadata: object"),
|
|
203
|
+
// don't overwrite it with an array - the object type should take precedence.
|
|
204
|
+
// This handles spurious "metadata[]" paths from dynamic iteration (Object.keys, for...in).
|
|
205
|
+
if (
|
|
206
|
+
cursor[key] !== undefined &&
|
|
207
|
+
typeof cursor[key] === 'object' &&
|
|
208
|
+
!Array.isArray(cursor[key])
|
|
209
|
+
) {
|
|
210
|
+
// Skip this path - it's trying to treat an object as an array
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
190
213
|
if (!Array.isArray(cursor[key])) cursor[key] = [];
|
|
191
214
|
|
|
192
215
|
// Look ahead to see what comes after '[]'
|
package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts
CHANGED
|
@@ -208,10 +208,12 @@ export default function fillInSchemaGapsAndUnknowns(
|
|
|
208
208
|
export function fillInDirectSchemaGapsAndUnknowns({
|
|
209
209
|
scopeName,
|
|
210
210
|
schema,
|
|
211
|
+
mergedSchema,
|
|
211
212
|
attempts = 0,
|
|
212
213
|
}: {
|
|
213
214
|
scopeName?: string;
|
|
214
215
|
schema: Record<string, string>;
|
|
216
|
+
mergedSchema?: Record<string, string>;
|
|
215
217
|
attempts?: number;
|
|
216
218
|
}) {
|
|
217
219
|
try {
|
|
@@ -245,7 +247,9 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
245
247
|
const guessTypeForPath = (path: string, defaultType = 'string') => {
|
|
246
248
|
let knownType = checkIfKnownType(path, functionKeysMapping);
|
|
247
249
|
if (!knownType) {
|
|
248
|
-
|
|
250
|
+
// Use mergedSchema for type inference if available (has more complete nested paths)
|
|
251
|
+
// Fall back to schema if mergedSchema is not provided
|
|
252
|
+
knownType = checkIfObjectOrFunction(path, mergedSchema ?? schema);
|
|
249
253
|
}
|
|
250
254
|
|
|
251
255
|
if (knownType && schema[path] !== knownType) {
|
|
@@ -373,10 +377,39 @@ export function fillInDirectSchemaGapsAndUnknowns({
|
|
|
373
377
|
fillInDirectSchemaGapsAndUnknowns({
|
|
374
378
|
scopeName,
|
|
375
379
|
schema,
|
|
380
|
+
mergedSchema,
|
|
376
381
|
attempts: ++attempts,
|
|
377
382
|
});
|
|
378
383
|
}
|
|
379
384
|
|
|
385
|
+
// Remove .length paths when the parent is typed as 'array' or 'string' (or nullable variants).
|
|
386
|
+
// These are built-in properties that were used for type inference but shouldn't appear
|
|
387
|
+
// in the final schema (they create { length: N } objects instead of proper arrays).
|
|
388
|
+
// However, if the parent could be an 'object' or other type, keep .length as it may be
|
|
389
|
+
// a custom property.
|
|
390
|
+
for (const key of Object.keys(schema)) {
|
|
391
|
+
const parts = splitOutsideParenthesesAndArrays(key);
|
|
392
|
+
if (parts[parts.length - 1] === 'length') {
|
|
393
|
+
const parentPath = joinParenthesesAndArrays(parts.slice(0, -1));
|
|
394
|
+
const parentType = schema[parentPath];
|
|
395
|
+
if (parentType) {
|
|
396
|
+
// Split union types and filter out nullable parts
|
|
397
|
+
const typeParts = parentType.split(' | ').map((t) => t.trim());
|
|
398
|
+
const nonNullableTypes = typeParts.filter(
|
|
399
|
+
(t) => t !== 'undefined' && t !== 'null',
|
|
400
|
+
);
|
|
401
|
+
// Only remove if ALL non-nullable types are array or string
|
|
402
|
+
// This ensures we don't remove .length from potential custom objects
|
|
403
|
+
if (
|
|
404
|
+
nonNullableTypes.length > 0 &&
|
|
405
|
+
nonNullableTypes.every((t) => t === 'array' || t === 'string')
|
|
406
|
+
) {
|
|
407
|
+
delete schema[key];
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
380
413
|
return schema;
|
|
381
414
|
} catch (error) {
|
|
382
415
|
console.info(
|
|
@@ -82,37 +82,178 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
82
82
|
const signatureSchema = dependencySchema?.signatureSchema;
|
|
83
83
|
if (!signatureSchema) return;
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
// Get sourceEquivalencies from the dependent analysis's mergedDataStructure,
|
|
86
|
+
// not from dependencySchemas (which doesn't store them)
|
|
87
|
+
const sourceEquivalencies =
|
|
88
|
+
dependentAnalysis?.metadata?.mergedDataStructure?.sourceEquivalencies ??
|
|
89
|
+
{};
|
|
90
|
+
|
|
91
|
+
// Build a fallback mapping from parent's usageEquivalencies
|
|
92
|
+
// This helps when the child's sourceEquivalencies don't have a mapping
|
|
93
|
+
// For example, if parent passes `entity` to child's `signature[0]`,
|
|
94
|
+
// usageEquivalencies might have: entity -> [{schemaPath: 'signature[0]', scopeNodeName: entityName}]
|
|
95
|
+
const usageEquivalencies = mergedDataStructure?.usageEquivalencies ?? {};
|
|
96
|
+
const signatureToParentPath: Record<string, string> = {};
|
|
97
|
+
|
|
98
|
+
for (const parentPath in usageEquivalencies) {
|
|
99
|
+
const usages = usageEquivalencies[parentPath];
|
|
100
|
+
for (const usage of usages) {
|
|
101
|
+
if (usage.scopeNodeName !== entityName) continue;
|
|
102
|
+
|
|
103
|
+
// Extract signature path from schemaPath
|
|
104
|
+
// Format can be:
|
|
105
|
+
// 1. "functionName(args).signature[N]" or "functionName(args).signature[N].property" (real data)
|
|
106
|
+
// 2. "signature[N]" or "signature[N].property" (simplified/test format)
|
|
107
|
+
let signaturePath: string;
|
|
108
|
+
const signatureIndex = usage.schemaPath.indexOf('.signature[');
|
|
109
|
+
if (signatureIndex !== -1) {
|
|
110
|
+
// Full format: extract "signature[N]" or "signature[N].property" after the dot
|
|
111
|
+
signaturePath = usage.schemaPath.slice(signatureIndex + 1);
|
|
112
|
+
} else if (usage.schemaPath.startsWith('signature[')) {
|
|
113
|
+
// Simplified format: already starts with signature[
|
|
114
|
+
signaturePath = usage.schemaPath;
|
|
115
|
+
} else {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Map child's signature path to parent's path
|
|
120
|
+
// e.g., 'signature[0]' -> 'entity'
|
|
121
|
+
signatureToParentPath[signaturePath] = parentPath;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
86
124
|
|
|
87
125
|
// If sourceEquivalencies is empty but the child has mocked imports,
|
|
88
|
-
// propagate key attributes
|
|
126
|
+
// only propagate key attributes that come from mocked data sources
|
|
127
|
+
// (not props that the parent passes to the child)
|
|
89
128
|
if (Object.keys(sourceEquivalencies).length === 0) {
|
|
90
|
-
//
|
|
129
|
+
// Collect names of mocked imports
|
|
91
130
|
const importedExports =
|
|
92
131
|
dependentAnalysis.entity?.metadata?.importedExports ?? [];
|
|
93
132
|
const nodeModuleImports =
|
|
94
133
|
dependentAnalysis.entity?.metadata?.nodeModuleImports ?? {};
|
|
95
134
|
|
|
96
|
-
const
|
|
97
|
-
(imp: { isMocked?: boolean }) => imp.isMocked,
|
|
98
|
-
);
|
|
99
|
-
const hasMockedNodeModuleImports = Object.values(
|
|
100
|
-
nodeModuleImports,
|
|
101
|
-
).some((imports: any[]) =>
|
|
102
|
-
imports?.some((imp: { isMocked?: boolean }) => imp.isMocked),
|
|
103
|
-
);
|
|
135
|
+
const mockedImportNames = new Set<string>();
|
|
104
136
|
|
|
105
|
-
|
|
106
|
-
|
|
137
|
+
// Collect mocked names from importedExports
|
|
138
|
+
for (const imp of importedExports) {
|
|
139
|
+
if ((imp as { isMocked?: boolean }).isMocked) {
|
|
140
|
+
mockedImportNames.add((imp as { name: string }).name);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
107
143
|
|
|
108
|
-
|
|
144
|
+
// Collect mocked names from nodeModuleImports
|
|
145
|
+
for (const imports of Object.values(nodeModuleImports)) {
|
|
146
|
+
for (const imp of imports as any[]) {
|
|
147
|
+
if ((imp as { isMocked?: boolean }).isMocked) {
|
|
148
|
+
mockedImportNames.add((imp as { name: string }).name);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (mockedImportNames.size > 0) {
|
|
109
154
|
for (const dependentKeyAttribute of dependentKeyAtttributes) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
155
|
+
// Include key attributes that come from controllable data sources:
|
|
156
|
+
// 1. Mocked data sources (like getScenarioDisplayState())
|
|
157
|
+
// 2. Arguments/props passed to the child (signature[N].*)
|
|
158
|
+
// Exclude attributes that are clearly just the prop name itself (like "size")
|
|
159
|
+
const externalPath = dependentKeyAttribute.externalPath || '';
|
|
160
|
+
const dataStructurePath =
|
|
161
|
+
dependentKeyAttribute.dataStructurePath || '';
|
|
162
|
+
|
|
163
|
+
const comesFromMockedSource = Array.from(mockedImportNames).some(
|
|
164
|
+
(mockedName) =>
|
|
165
|
+
externalPath.includes(`${mockedName}(`) ||
|
|
166
|
+
externalPath.includes(`${mockedName}.`) ||
|
|
167
|
+
dataStructurePath.includes(`${mockedName}(`) ||
|
|
168
|
+
dataStructurePath.includes(`${mockedName}.`) ||
|
|
169
|
+
dataStructurePath.startsWith(mockedName),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
// Check if it comes from an argument (signature[N].something.deeper)
|
|
173
|
+
// but not just a simple prop like "size" or "isOutdated"
|
|
174
|
+
const comesFromArgument =
|
|
175
|
+
externalPath.startsWith('signature[') &&
|
|
176
|
+
// Must have nested path (at least one dot after the prop name)
|
|
177
|
+
// e.g., signature[0].scenario.metadata.* is OK
|
|
178
|
+
// but signature[0].size is not (it's just a simple prop)
|
|
179
|
+
(externalPath.match(/\./g) || []).length >= 2;
|
|
180
|
+
|
|
181
|
+
if (comesFromMockedSource || comesFromArgument) {
|
|
182
|
+
relevantDependentKeyAttributes.push({
|
|
183
|
+
...dependentKeyAttribute,
|
|
184
|
+
dependentEntityName: entityName,
|
|
185
|
+
originalEntityName: entityName,
|
|
186
|
+
filePath: path,
|
|
187
|
+
} as any);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// No mocked imports, try usageEquivalencies fallback for direct argument usage
|
|
194
|
+
if (Object.keys(signatureToParentPath).length > 0) {
|
|
195
|
+
for (const dependentKeyAttribute of dependentKeyAtttributes) {
|
|
196
|
+
if (!dependentKeyAttribute.externalPath?.startsWith('signature['))
|
|
197
|
+
continue;
|
|
198
|
+
|
|
199
|
+
const dependentKeyAttributeExternalPathParts =
|
|
200
|
+
splitOutsideParenthesesAndArrays(
|
|
201
|
+
dependentKeyAttribute.externalPath,
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Try to find a matching signature path
|
|
205
|
+
for (
|
|
206
|
+
let i = dependentKeyAttributeExternalPathParts.length;
|
|
207
|
+
i > 0;
|
|
208
|
+
i--
|
|
209
|
+
) {
|
|
210
|
+
const subExternalPath = joinParenthesesAndArrays(
|
|
211
|
+
dependentKeyAttributeExternalPathParts.slice(0, i),
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
if (signatureToParentPath[subExternalPath]) {
|
|
215
|
+
const parentPath = signatureToParentPath[subExternalPath];
|
|
216
|
+
|
|
217
|
+
// parentPath is already in parent's schema format (e.g., "signature[0].entity" or just "entity")
|
|
218
|
+
// We need to handle both cases
|
|
219
|
+
const parentPathStartsWithSignature =
|
|
220
|
+
parentPath.startsWith('signature[');
|
|
221
|
+
let externalPath = parentPathStartsWithSignature
|
|
222
|
+
? parentPath
|
|
223
|
+
: `signature[0].${parentPath}`;
|
|
224
|
+
|
|
225
|
+
// internalPath is parentPath without the signature[N]. prefix
|
|
226
|
+
let internalPath: string | undefined =
|
|
227
|
+
parentPathStartsWithSignature
|
|
228
|
+
? parentPath.replace(/^signature\[\d+\]\./, '')
|
|
229
|
+
: parentPath;
|
|
230
|
+
|
|
231
|
+
if (i < dependentKeyAttributeExternalPathParts.length) {
|
|
232
|
+
const remainingPath = joinParenthesesAndArrays(
|
|
233
|
+
dependentKeyAttributeExternalPathParts.slice(i),
|
|
234
|
+
);
|
|
235
|
+
externalPath = `${externalPath}.${remainingPath}`;
|
|
236
|
+
internalPath = `${internalPath}.${remainingPath}`;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Look up in associationMap for proper internal path
|
|
240
|
+
if (associationMap[externalPath]) {
|
|
241
|
+
internalPath = associationMap[externalPath];
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
relevantDependentKeyAttributes.push({
|
|
245
|
+
...dependentKeyAttribute,
|
|
246
|
+
dependentEntityName: entityName,
|
|
247
|
+
originalEntityName: entityName,
|
|
248
|
+
filePath: path,
|
|
249
|
+
internalPath,
|
|
250
|
+
externalPath,
|
|
251
|
+
dataStructurePath: internalPath,
|
|
252
|
+
} as any);
|
|
253
|
+
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
116
257
|
}
|
|
117
258
|
}
|
|
118
259
|
return;
|
|
@@ -123,6 +264,8 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
123
264
|
splitOutsideParenthesesAndArrays(dependentKeyAttribute.externalPath);
|
|
124
265
|
|
|
125
266
|
let matchFound = false;
|
|
267
|
+
|
|
268
|
+
// First, try to match using child's sourceEquivalencies
|
|
126
269
|
for (
|
|
127
270
|
let i = dependentKeyAttributeExternalPathParts.length;
|
|
128
271
|
i > 0;
|
|
@@ -132,8 +275,8 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
132
275
|
dependentKeyAttributeExternalPathParts.slice(0, i),
|
|
133
276
|
);
|
|
134
277
|
|
|
135
|
-
|
|
136
|
-
|
|
278
|
+
// Use the sourceEquivalencies from the child's analysis
|
|
279
|
+
for (const sourceEquivalencyPath in sourceEquivalencies) {
|
|
137
280
|
const sourceEquivalencyPathParts = splitOutsideParenthesesAndArrays(
|
|
138
281
|
sourceEquivalencyPath,
|
|
139
282
|
);
|
|
@@ -145,8 +288,7 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
145
288
|
if (relevantSourceEquivalencyPath !== subExternalPath) continue;
|
|
146
289
|
|
|
147
290
|
const sourcePath =
|
|
148
|
-
|
|
149
|
-
?.schemaPath;
|
|
291
|
+
sourceEquivalencies[sourceEquivalencyPath][0]?.schemaPath;
|
|
150
292
|
|
|
151
293
|
if (!sourcePath) continue;
|
|
152
294
|
|
|
@@ -181,6 +323,8 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
181
323
|
filePath: path, // File path for restructuring into nested format
|
|
182
324
|
internalPath,
|
|
183
325
|
externalPath,
|
|
326
|
+
// Transform dataStructurePath to parent's path structure
|
|
327
|
+
dataStructurePath: internalPath,
|
|
184
328
|
} as any);
|
|
185
329
|
|
|
186
330
|
matchFound = true;
|
|
@@ -189,6 +333,74 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
189
333
|
|
|
190
334
|
if (matchFound) break;
|
|
191
335
|
}
|
|
336
|
+
|
|
337
|
+
// Fallback: if no sourceEquivalency match, try using parent's usageEquivalencies
|
|
338
|
+
// This handles direct argument usage like entity.entityType
|
|
339
|
+
if (
|
|
340
|
+
!matchFound &&
|
|
341
|
+
dependentKeyAttribute.externalPath?.startsWith('signature[')
|
|
342
|
+
) {
|
|
343
|
+
// Try to find a matching signature path in the usageEquivalencies-derived map
|
|
344
|
+
for (
|
|
345
|
+
let i = dependentKeyAttributeExternalPathParts.length;
|
|
346
|
+
i > 0;
|
|
347
|
+
i--
|
|
348
|
+
) {
|
|
349
|
+
const subExternalPath = joinParenthesesAndArrays(
|
|
350
|
+
dependentKeyAttributeExternalPathParts.slice(0, i),
|
|
351
|
+
);
|
|
352
|
+
|
|
353
|
+
if (signatureToParentPath[subExternalPath]) {
|
|
354
|
+
const parentPath = signatureToParentPath[subExternalPath];
|
|
355
|
+
|
|
356
|
+
// parentPath is already in parent's schema format (e.g., "signature[0].entity" or just "entity")
|
|
357
|
+
// We need to handle both cases
|
|
358
|
+
const parentPathStartsWithSignature =
|
|
359
|
+
parentPath.startsWith('signature[');
|
|
360
|
+
let externalPath = parentPathStartsWithSignature
|
|
361
|
+
? parentPath
|
|
362
|
+
: `signature[0].${parentPath}`;
|
|
363
|
+
|
|
364
|
+
// internalPath is parentPath without the signature[N]. prefix
|
|
365
|
+
let internalPath: string | undefined =
|
|
366
|
+
parentPathStartsWithSignature
|
|
367
|
+
? parentPath.replace(/^signature\[\d+\]\./, '')
|
|
368
|
+
: parentPath;
|
|
369
|
+
|
|
370
|
+
if (i < dependentKeyAttributeExternalPathParts.length) {
|
|
371
|
+
const remainingPath = joinParenthesesAndArrays(
|
|
372
|
+
dependentKeyAttributeExternalPathParts.slice(i),
|
|
373
|
+
);
|
|
374
|
+
externalPath = `${externalPath}.${remainingPath}`;
|
|
375
|
+
internalPath = `${internalPath}.${remainingPath}`;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Look up the full external path in associationMap for proper internal path
|
|
379
|
+
const fullExternalPath = externalPath;
|
|
380
|
+
if (associationMap[fullExternalPath]) {
|
|
381
|
+
internalPath = associationMap[fullExternalPath];
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const dependentEntityName =
|
|
385
|
+
dependentKeyAttribute.dependentEntityName
|
|
386
|
+
? `${dependentKeyAttribute.dependentEntityName} (through ${entityName})`
|
|
387
|
+
: entityName;
|
|
388
|
+
|
|
389
|
+
relevantDependentKeyAttributes.push({
|
|
390
|
+
...dependentKeyAttribute,
|
|
391
|
+
dependentEntityName,
|
|
392
|
+
originalEntityName: entityName,
|
|
393
|
+
filePath: path,
|
|
394
|
+
internalPath,
|
|
395
|
+
externalPath,
|
|
396
|
+
dataStructurePath: internalPath,
|
|
397
|
+
} as any);
|
|
398
|
+
|
|
399
|
+
matchFound = true;
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
192
404
|
}
|
|
193
405
|
});
|
|
194
406
|
});
|