@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.
Files changed (385) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +7 -6
  4. package/analyzer-template/packages/ai/package.json +1 -1
  5. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +2 -0
  6. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +22 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +23 -1
  8. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +401 -106
  9. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +60 -0
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +661 -50
  11. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +14 -2
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +715 -0
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +123 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +19 -1
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +23 -1
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +23 -0
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +34 -1
  18. package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +236 -24
  19. package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +18 -1
  20. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +37 -4
  21. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +5 -0
  22. package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +213 -12
  23. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +11 -15
  24. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +114 -11
  25. package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +143 -31
  26. package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +8 -2
  27. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +7 -0
  28. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +42 -2
  29. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +38 -2
  30. package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +28 -2
  31. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +5 -0
  32. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +8 -1
  33. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +339 -145
  34. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +20 -0
  35. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +8 -1
  36. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +158 -0
  37. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +107 -18
  38. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.ts +1 -1
  39. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +223 -103
  40. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +10 -5
  41. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +172 -83
  42. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +2 -5
  43. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +97 -27
  44. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts +15 -0
  45. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts.map +1 -0
  46. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js +31 -0
  47. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js.map +1 -0
  48. package/analyzer-template/packages/aws/package.json +1 -1
  49. package/analyzer-template/packages/aws/s3/index.ts +1 -0
  50. package/analyzer-template/packages/aws/src/lib/s3/checkS3ObjectExists.ts +47 -0
  51. package/analyzer-template/packages/database/src/lib/kysely/db.ts +4 -4
  52. package/analyzer-template/packages/database/src/lib/kysely/tableRelations.ts +2 -2
  53. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +20 -9
  54. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +3 -2
  55. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +9 -4
  56. package/analyzer-template/packages/generate/src/lib/deepMerge.ts +26 -1
  57. package/analyzer-template/packages/generate/src/lib/getComponentScenarioPath.ts +8 -3
  58. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -2
  59. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +2 -2
  60. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tableRelations.d.ts +2 -2
  61. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts +8 -1
  62. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  63. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +14 -7
  64. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  66. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  67. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +1 -1
  68. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  69. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  70. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +4 -2
  71. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  72. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  73. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  74. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  75. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.d.ts.map +1 -1
  76. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js +27 -1
  77. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js.map +1 -1
  78. package/analyzer-template/packages/github/dist/generate/src/lib/getComponentScenarioPath.d.ts.map +1 -1
  79. package/analyzer-template/packages/github/dist/generate/src/lib/getComponentScenarioPath.js +7 -3
  80. package/analyzer-template/packages/github/dist/generate/src/lib/getComponentScenarioPath.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/types/index.d.ts +4 -3
  82. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  83. package/analyzer-template/packages/github/dist/types/index.js +1 -0
  84. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  85. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +31 -1
  86. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  87. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +51 -1
  88. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  89. package/analyzer-template/packages/github/dist/types/src/types/Scenario.js +21 -1
  90. package/analyzer-template/packages/github/dist/types/src/types/Scenario.js.map +1 -1
  91. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +48 -0
  92. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  93. package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.d.ts.map +1 -1
  94. package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js +26 -2
  95. package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js.map +1 -1
  96. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  97. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  98. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  99. package/analyzer-template/packages/types/index.ts +8 -0
  100. package/analyzer-template/packages/types/src/types/Analysis.ts +32 -1
  101. package/analyzer-template/packages/types/src/types/Scenario.ts +75 -6
  102. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +49 -0
  103. package/analyzer-template/packages/ui-components/package.json +4 -4
  104. package/analyzer-template/packages/ui-components/src/components/ScenarioDetailInteractiveView.tsx +23 -7
  105. package/analyzer-template/packages/utils/dist/types/index.d.ts +4 -3
  106. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  107. package/analyzer-template/packages/utils/dist/types/index.js +1 -0
  108. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  109. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +31 -1
  110. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  111. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +51 -1
  112. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  113. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js +21 -1
  114. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js.map +1 -1
  115. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +48 -0
  116. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  117. package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.d.ts.map +1 -1
  118. package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js +26 -2
  119. package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js.map +1 -1
  120. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  121. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  122. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  123. package/analyzer-template/packages/utils/src/lib/applyUniversalMocks.ts +28 -2
  124. package/analyzer-template/packages/utils/src/lib/lightweightEntityExtractor.ts +27 -0
  125. package/analyzer-template/playwright/takeElementScreenshot.ts +26 -11
  126. package/analyzer-template/playwright/takeScreenshot.ts +9 -7
  127. package/analyzer-template/project/TESTING.md +83 -0
  128. package/analyzer-template/project/constructMockCode.ts +151 -30
  129. package/analyzer-template/project/loadReadyToBeCaptured.ts +17 -1
  130. package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +16 -9
  131. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +77 -37
  132. package/analyzer-template/project/reconcileMockDataKeys.ts +104 -3
  133. package/analyzer-template/project/runMultiScenarioServer.ts +11 -10
  134. package/analyzer-template/project/serverOnlyModules.ts +288 -0
  135. package/analyzer-template/project/start.ts +10 -0
  136. package/analyzer-template/project/startScenarioCapture.ts +73 -41
  137. package/analyzer-template/project/writeMockDataTsx.ts +103 -40
  138. package/analyzer-template/project/writeScenarioComponents.ts +1162 -203
  139. package/analyzer-template/project/writeSimpleRoot.ts +26 -4
  140. package/analyzer-template/project/writeUniversalMocks.ts +32 -11
  141. package/background/src/lib/virtualized/project/constructMockCode.js +132 -25
  142. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  143. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +15 -1
  144. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  145. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js +11 -6
  146. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js.map +1 -1
  147. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +67 -32
  148. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  149. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +65 -4
  150. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  151. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +11 -9
  152. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  153. package/background/src/lib/virtualized/project/serverOnlyModules.js +235 -0
  154. package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -0
  155. package/background/src/lib/virtualized/project/start.js +6 -0
  156. package/background/src/lib/virtualized/project/start.js.map +1 -1
  157. package/background/src/lib/virtualized/project/startScenarioCapture.js +54 -31
  158. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  159. package/background/src/lib/virtualized/project/writeMockDataTsx.js +87 -34
  160. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  161. package/background/src/lib/virtualized/project/writeScenarioComponents.js +852 -133
  162. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  163. package/background/src/lib/virtualized/project/writeSimpleRoot.js +25 -2
  164. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  165. package/background/src/lib/virtualized/project/writeUniversalMocks.js +27 -12
  166. package/background/src/lib/virtualized/project/writeUniversalMocks.js.map +1 -1
  167. package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js +7 -0
  168. package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js.map +1 -0
  169. package/codeyam-cli/src/cli.js +2 -0
  170. package/codeyam-cli/src/cli.js.map +1 -1
  171. package/codeyam-cli/src/commands/debug.js +14 -2
  172. package/codeyam-cli/src/commands/debug.js.map +1 -1
  173. package/codeyam-cli/src/commands/recapture.js +215 -0
  174. package/codeyam-cli/src/commands/recapture.js.map +1 -0
  175. package/codeyam-cli/src/commands/report.js +26 -23
  176. package/codeyam-cli/src/commands/report.js.map +1 -1
  177. package/codeyam-cli/src/utils/backgroundServer.js +2 -2
  178. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  179. package/codeyam-cli/src/utils/generateReport.js +252 -106
  180. package/codeyam-cli/src/utils/generateReport.js.map +1 -1
  181. package/codeyam-cli/src/utils/install-skills.js +2 -7
  182. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  183. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +38 -0
  184. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  185. package/codeyam-cli/src/utils/queue/job.js +140 -16
  186. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  187. package/codeyam-cli/src/utils/queue/manager.js +19 -7
  188. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  189. package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
  190. package/codeyam-cli/src/webserver/app/lib/database.js +47 -0
  191. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  192. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  193. package/codeyam-cli/src/webserver/backgroundServer.js +5 -10
  194. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  195. package/codeyam-cli/src/webserver/bootstrap.js +9 -0
  196. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -0
  197. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-wXL1Z2Aq.js +1 -0
  198. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DQeyk25_.js → EntityTypeBadge-CzGX-miz.js} +1 -1
  199. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-CXFKsCOD.js +41 -0
  200. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-D-9pXIaY.js +25 -0
  201. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CBQPrpT0.js +3 -0
  202. package/codeyam-cli/src/webserver/build/client/assets/LoadingDots-D1CdlbrV.js +6 -0
  203. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-wDPcZNKx.js +3 -0
  204. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-4lcOlid-.js +11 -0
  205. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BfmDgXxG.js +1 -0
  206. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-CUxUNEEC.js +15 -0
  207. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-ayCJdUAc.js → TruncatedFilePath-6J7zDUD5.js} +1 -1
  208. package/codeyam-cli/src/webserver/build/client/assets/_index-DHImXdXq.js +11 -0
  209. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-2mG6mjVb.js +32 -0
  210. package/codeyam-cli/src/webserver/build/client/assets/api.link-scenario-value-l0sNRNKZ.js +1 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/api.update-key-attributes-l0sNRNKZ.js +1 -0
  212. package/codeyam-cli/src/webserver/build/client/assets/api.update-valid-values-l0sNRNKZ.js +1 -0
  213. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-BYimnrHg.js +6 -0
  214. package/codeyam-cli/src/webserver/build/client/assets/chunk-JMJ3UQ3L-BambyYE_.js +51 -0
  215. package/codeyam-cli/src/webserver/build/client/assets/circle-check-CaVsIRxt.js +6 -0
  216. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CgUsG7ib.js +21 -0
  217. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-CKnwPCDr.js +1 -0
  218. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DW_hdGUc.js +1 -0
  219. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-FHOVOgFN.js → entity._sha._-zUEpfPsu.js} +22 -15
  220. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DyB90fWk.js +1 -0
  221. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D_3ero5o.js +1 -0
  222. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-CfLCUi9S.js +5 -0
  223. package/codeyam-cli/src/webserver/build/client/assets/entry.client-DKJyZfAY.js +29 -0
  224. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DAtOlaWE.js +1 -0
  225. package/codeyam-cli/src/webserver/build/client/assets/files-ClR0d32A.js +1 -0
  226. package/codeyam-cli/src/webserver/build/client/assets/git-D62Lxxmv.js +15 -0
  227. package/codeyam-cli/src/webserver/build/client/assets/globals-C6vQASxy.css +1 -0
  228. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-fmIEn3Bc.js +9 -0
  229. package/codeyam-cli/src/webserver/build/client/assets/index-BosqDOlH.js +3 -0
  230. package/codeyam-cli/src/webserver/build/client/assets/index-CzNNiTkw.js +9 -0
  231. package/codeyam-cli/src/webserver/build/client/assets/keyAttributeCoverage-CTlFMihX.js +1 -0
  232. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-CNp9QFCX.js +6 -0
  233. package/codeyam-cli/src/webserver/build/client/assets/manifest-09d684be.js +1 -0
  234. package/codeyam-cli/src/webserver/build/client/assets/preload-helper-ckwbz45p.js +1 -0
  235. package/codeyam-cli/src/webserver/build/client/assets/root-BxJUvKau.js +56 -0
  236. package/codeyam-cli/src/webserver/build/client/assets/scenarioStatus-B_8jpV3e.js +1 -0
  237. package/codeyam-cli/src/webserver/build/client/assets/search-DDGjYAMJ.js +6 -0
  238. package/codeyam-cli/src/webserver/build/client/assets/settings-DgTyB-Wg.js +1 -0
  239. package/codeyam-cli/src/webserver/build/client/assets/simulations-CoNWGt0K.js +1 -0
  240. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-CBc5dE1s.js +6 -0
  241. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BMIGFP-m.js +1 -0
  242. package/codeyam-cli/src/webserver/build/client/assets/useInteractiveMode-Dk_FQqWJ.js +1 -0
  243. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-DOGXmJcI.js → useLastLogLine-BqPPNjAl.js} +1 -1
  244. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DsJbgMY9.js +1 -0
  245. package/codeyam-cli/src/webserver/build/client/assets/{useToast-C07gRg7Z.js → useToast-DWHcCcl1.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/server/assets/index-CV6i1S1A.js +1 -0
  247. package/codeyam-cli/src/webserver/build/server/assets/server-build-BDlyhfrv.js +175 -0
  248. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  249. package/codeyam-cli/src/webserver/build-info.json +5 -5
  250. package/codeyam-cli/src/webserver/devServer.js +1 -3
  251. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  252. package/codeyam-cli/templates/debug-codeyam.md +620 -0
  253. package/package.json +14 -14
  254. package/packages/ai/src/lib/analyzeScope.js +2 -0
  255. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  256. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +16 -0
  257. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  258. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +16 -0
  259. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
  260. package/packages/ai/src/lib/astScopes/processExpression.js +305 -88
  261. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  262. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +523 -42
  263. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  264. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +12 -2
  265. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  266. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +454 -0
  267. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -0
  268. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +103 -1
  269. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  270. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +16 -1
  271. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  272. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +19 -1
  273. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  274. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +20 -0
  275. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  276. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +28 -2
  277. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  278. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +179 -17
  279. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
  280. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +6 -0
  281. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +1 -1
  282. package/packages/ai/src/lib/generateChangesEntityScenarios.js +37 -4
  283. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  284. package/packages/ai/src/lib/generateEntityDataStructure.js +4 -0
  285. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  286. package/packages/ai/src/lib/generateEntityKeyAttributes.js +176 -9
  287. package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +1 -1
  288. package/packages/ai/src/lib/generateEntityScenarioData.js +11 -15
  289. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  290. package/packages/ai/src/lib/generateEntityScenarios.js +105 -9
  291. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  292. package/packages/ai/src/lib/getConditionalUsagesFromCode.js +84 -14
  293. package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
  294. package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -1
  295. package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
  296. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +6 -0
  297. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  298. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +38 -2
  299. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  300. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +38 -2
  301. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  302. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +16 -3
  303. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js.map +1 -1
  304. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  305. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +4 -0
  306. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  307. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +258 -110
  308. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  309. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +18 -0
  310. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  311. package/packages/analyze/src/lib/files/getImportedExports.js +6 -1
  312. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  313. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +125 -0
  314. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -0
  315. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +74 -19
  316. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  317. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js +1 -1
  318. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js.map +1 -1
  319. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +175 -58
  320. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  321. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +10 -5
  322. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +1 -1
  323. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +127 -69
  324. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  325. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +2 -5
  326. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
  327. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +74 -23
  328. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  329. package/packages/database/src/lib/kysely/db.js +2 -2
  330. package/packages/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  331. package/packages/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  332. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +4 -2
  333. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  334. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  335. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  336. package/packages/generate/src/lib/deepMerge.js +27 -1
  337. package/packages/generate/src/lib/deepMerge.js.map +1 -1
  338. package/packages/generate/src/lib/getComponentScenarioPath.js +7 -3
  339. package/packages/generate/src/lib/getComponentScenarioPath.js.map +1 -1
  340. package/packages/types/index.js +1 -0
  341. package/packages/types/index.js.map +1 -1
  342. package/packages/types/src/types/Scenario.js +21 -1
  343. package/packages/types/src/types/Scenario.js.map +1 -1
  344. package/packages/utils/src/lib/applyUniversalMocks.js +26 -2
  345. package/packages/utils/src/lib/applyUniversalMocks.js.map +1 -1
  346. package/packages/utils/src/lib/lightweightEntityExtractor.js +25 -0
  347. package/packages/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  348. package/scripts/finalize-analyzer.cjs +3 -1
  349. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-CWKV2GEz.js +0 -1
  350. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-D2hFeDeg.js +0 -1
  351. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-C8K-4kKP.js +0 -26
  352. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DgXLv61M.js +0 -3
  353. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-DFdLQbPS.js +0 -3
  354. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DlRDjT4h.js +0 -1
  355. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-7UkVL-UI.js +0 -1
  356. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-XjtsGuPo.js +0 -5
  357. package/codeyam-cli/src/webserver/build/client/assets/_index-D2eJjWLf.js +0 -1
  358. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-w6sbwlOd.js +0 -7
  359. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-BBNQ8hup.js +0 -1
  360. package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-Bex4RrGs.js +0 -26
  361. package/codeyam-cli/src/webserver/build/client/assets/circle-check-cdhjVtom.js +0 -1
  362. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-DkgmwwRC.js +0 -1
  363. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-CwLmCS0J.js +0 -1
  364. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-YZ-kM3ZG.js +0 -1
  365. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-BeQlz94_.js +0 -5
  366. package/codeyam-cli/src/webserver/build/client/assets/entry.client-DN2XXM7Z.js +0 -5
  367. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-CUeAIQNI.js +0 -1
  368. package/codeyam-cli/src/webserver/build/client/assets/files-ccMQfhGf.js +0 -1
  369. package/codeyam-cli/src/webserver/build/client/assets/git-JmESAHx5.js +0 -12
  370. package/codeyam-cli/src/webserver/build/client/assets/globals-CO-U8Bpo.css +0 -1
  371. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +0 -5
  372. package/codeyam-cli/src/webserver/build/client/assets/index-DsL9BiOc.js +0 -8
  373. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-COYCR2oZ.js +0 -1
  374. package/codeyam-cli/src/webserver/build/client/assets/manifest-90adba57.js +0 -1
  375. package/codeyam-cli/src/webserver/build/client/assets/root-DfbVEEjF.js +0 -16
  376. package/codeyam-cli/src/webserver/build/client/assets/search-DvK9iMBu.js +0 -1
  377. package/codeyam-cli/src/webserver/build/client/assets/server-build-CMKNK2uU.css +0 -1
  378. package/codeyam-cli/src/webserver/build/client/assets/settings-9LTbit4Z.js +0 -1
  379. package/codeyam-cli/src/webserver/build/client/assets/simulations-BrxN5ZtV.js +0 -1
  380. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-Iv0p8T-1.js +0 -1
  381. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-BWmSRPH6.js +0 -1
  382. package/codeyam-cli/src/webserver/build/server/assets/index-CE_1qXCG.js +0 -1
  383. package/codeyam-cli/src/webserver/build/server/assets/server-build-BY_VDhiD.js +0 -166
  384. package/codeyam-cli/templates/debug-command.md +0 -141
  385. /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(_scopeNode: ScopeNode, _scopeDataStructure: ScopeDataStructure) {}
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,
@@ -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 rawMethod = keyParts[cut].split('(')[0];
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
  }
@@ -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 '[]'
@@ -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
- knownType = checkIfObjectOrFunction(path, schema);
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
- const sourceEquivalencies = dependencySchema?.sourceEquivalencies ?? {};
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 directly since they affect the parent's visual output
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
- // Check both importedExports and nodeModuleImports for mocked imports
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 hasMockedImportedExports = importedExports.some(
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
- const childHasMockedImports =
106
- hasMockedImportedExports || hasMockedNodeModuleImports;
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
- if (childHasMockedImports) {
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
- relevantDependentKeyAttributes.push({
111
- ...dependentKeyAttribute,
112
- dependentEntityName: entityName,
113
- originalEntityName: entityName,
114
- filePath: path,
115
- } as any);
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
- for (const sourceEquivalencyPath in dependencySchema?.sourceEquivalencies ??
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
- dependencySchema?.sourceEquivalencies[sourceEquivalencyPath][0]
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
  });