@codeyam/codeyam-cli 0.1.0-staging.596f0eb → 0.1.0-staging.76566f9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) 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 +2 -1
  4. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +2 -0
  5. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +22 -0
  6. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +23 -1
  7. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +401 -106
  8. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +60 -0
  9. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +734 -45
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +2 -1
  11. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +715 -0
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +233 -75
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +19 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +34 -1
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +23 -0
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -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/generateChangesEntityScenarioData.ts +41 -0
  21. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +37 -4
  22. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +5 -0
  23. package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +213 -12
  24. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +36 -25
  25. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +114 -11
  26. package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +143 -31
  27. package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +8 -2
  28. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +7 -0
  29. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +42 -2
  30. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +38 -2
  31. package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +28 -2
  32. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +5 -0
  33. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +8 -1
  34. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +127 -43
  35. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +158 -0
  36. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +405 -45
  37. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.ts +1 -1
  38. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +260 -133
  39. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +10 -5
  40. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +77 -83
  41. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +2 -5
  42. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +196 -86
  43. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts +15 -0
  44. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts.map +1 -0
  45. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js +31 -0
  46. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js.map +1 -0
  47. package/analyzer-template/packages/aws/package.json +1 -1
  48. package/analyzer-template/packages/aws/s3/index.ts +1 -0
  49. package/analyzer-template/packages/aws/src/lib/s3/checkS3ObjectExists.ts +47 -0
  50. package/analyzer-template/packages/database/src/lib/kysely/db.ts +4 -4
  51. package/analyzer-template/packages/database/src/lib/kysely/tableRelations.ts +2 -2
  52. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +20 -9
  53. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +9 -4
  54. package/analyzer-template/packages/generate/src/lib/deepMerge.ts +26 -1
  55. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -2
  56. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +2 -2
  57. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tableRelations.d.ts +2 -2
  58. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts +8 -1
  59. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  60. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +14 -7
  61. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -1
  62. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  63. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  64. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  66. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  67. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  68. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  69. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.d.ts.map +1 -1
  70. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js +27 -1
  71. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js.map +1 -1
  72. package/analyzer-template/packages/github/dist/types/index.d.ts +4 -3
  73. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  74. package/analyzer-template/packages/github/dist/types/index.js +1 -0
  75. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  76. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +31 -1
  77. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  78. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +51 -1
  79. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  80. package/analyzer-template/packages/github/dist/types/src/types/Scenario.js +21 -1
  81. package/analyzer-template/packages/github/dist/types/src/types/Scenario.js.map +1 -1
  82. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +48 -0
  83. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  84. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  85. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  86. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  87. package/analyzer-template/packages/types/index.ts +8 -0
  88. package/analyzer-template/packages/types/src/types/Analysis.ts +32 -1
  89. package/analyzer-template/packages/types/src/types/Scenario.ts +75 -6
  90. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +49 -0
  91. package/analyzer-template/packages/ui-components/src/components/ScenarioDetailInteractiveView.tsx +23 -7
  92. package/analyzer-template/packages/utils/dist/types/index.d.ts +4 -3
  93. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  94. package/analyzer-template/packages/utils/dist/types/index.js +1 -0
  95. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  96. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +31 -1
  97. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  98. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +51 -1
  99. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  100. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js +21 -1
  101. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js.map +1 -1
  102. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +48 -0
  103. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  104. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  105. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  106. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  107. package/analyzer-template/packages/utils/src/lib/lightweightEntityExtractor.ts +27 -0
  108. package/analyzer-template/playwright/takeElementScreenshot.ts +26 -11
  109. package/analyzer-template/playwright/takeScreenshot.ts +9 -7
  110. package/analyzer-template/project/constructMockCode.ts +286 -84
  111. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +77 -37
  112. package/analyzer-template/project/reconcileMockDataKeys.ts +5 -2
  113. package/analyzer-template/project/runMultiScenarioServer.ts +11 -10
  114. package/analyzer-template/project/serverOnlyModules.ts +71 -23
  115. package/analyzer-template/project/start.ts +10 -0
  116. package/analyzer-template/project/startScenarioCapture.ts +73 -41
  117. package/analyzer-template/project/writeMockDataTsx.ts +115 -54
  118. package/analyzer-template/project/writeScenarioComponents.ts +571 -162
  119. package/analyzer-template/project/writeSimpleRoot.ts +11 -13
  120. package/background/src/lib/virtualized/project/constructMockCode.js +265 -75
  121. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  122. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +67 -32
  123. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  124. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +5 -2
  125. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  126. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +11 -9
  127. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  128. package/background/src/lib/virtualized/project/serverOnlyModules.js +62 -25
  129. package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -1
  130. package/background/src/lib/virtualized/project/start.js +6 -0
  131. package/background/src/lib/virtualized/project/start.js.map +1 -1
  132. package/background/src/lib/virtualized/project/startScenarioCapture.js +54 -31
  133. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  134. package/background/src/lib/virtualized/project/writeMockDataTsx.js +106 -46
  135. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  136. package/background/src/lib/virtualized/project/writeScenarioComponents.js +399 -106
  137. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  138. package/background/src/lib/virtualized/project/writeSimpleRoot.js +11 -11
  139. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  140. package/codeyam-cli/src/cli.js +2 -0
  141. package/codeyam-cli/src/cli.js.map +1 -1
  142. package/codeyam-cli/src/commands/debug.js +14 -2
  143. package/codeyam-cli/src/commands/debug.js.map +1 -1
  144. package/codeyam-cli/src/commands/recapture.js +215 -0
  145. package/codeyam-cli/src/commands/recapture.js.map +1 -0
  146. package/codeyam-cli/src/commands/report.js +26 -23
  147. package/codeyam-cli/src/commands/report.js.map +1 -1
  148. package/codeyam-cli/src/utils/backgroundServer.js +2 -2
  149. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  150. package/codeyam-cli/src/utils/generateReport.js +252 -106
  151. package/codeyam-cli/src/utils/generateReport.js.map +1 -1
  152. package/codeyam-cli/src/utils/install-skills.js +2 -2
  153. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  154. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +38 -0
  155. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  156. package/codeyam-cli/src/utils/queue/job.js +140 -16
  157. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  158. package/codeyam-cli/src/utils/queue/manager.js +19 -7
  159. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  160. package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
  161. package/codeyam-cli/src/webserver/app/lib/database.js +47 -0
  162. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  163. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  164. package/codeyam-cli/src/webserver/backgroundServer.js +5 -10
  165. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  166. package/codeyam-cli/src/webserver/bootstrap.js +9 -0
  167. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -0
  168. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-wXL1Z2Aq.js +1 -0
  169. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-efWKDYMr.js → EntityTypeBadge-CzGX-miz.js} +1 -1
  170. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-CXFKsCOD.js +41 -0
  171. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-D-9pXIaY.js +25 -0
  172. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CBQPrpT0.js +3 -0
  173. package/codeyam-cli/src/webserver/build/client/assets/LoadingDots-D1CdlbrV.js +6 -0
  174. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-wDPcZNKx.js +3 -0
  175. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-4lcOlid-.js +11 -0
  176. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BfmDgXxG.js +1 -0
  177. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-CUxUNEEC.js +15 -0
  178. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-COPstp9J.js → TruncatedFilePath-6J7zDUD5.js} +1 -1
  179. package/codeyam-cli/src/webserver/build/client/assets/_index-DHImXdXq.js +11 -0
  180. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CVP_WGQ3.js +32 -0
  181. package/codeyam-cli/src/webserver/build/client/assets/api.link-scenario-value-l0sNRNKZ.js +1 -0
  182. package/codeyam-cli/src/webserver/build/client/assets/api.update-key-attributes-l0sNRNKZ.js +1 -0
  183. package/codeyam-cli/src/webserver/build/client/assets/api.update-valid-values-l0sNRNKZ.js +1 -0
  184. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-BYimnrHg.js +6 -0
  185. package/codeyam-cli/src/webserver/build/client/assets/chunk-JMJ3UQ3L-BambyYE_.js +51 -0
  186. package/codeyam-cli/src/webserver/build/client/assets/circle-check-CaVsIRxt.js +6 -0
  187. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CgUsG7ib.js +21 -0
  188. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-CKnwPCDr.js +1 -0
  189. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DW_hdGUc.js +1 -0
  190. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-Dt-SjPsw.js +23 -0
  191. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DyB90fWk.js +1 -0
  192. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D_3ero5o.js +1 -0
  193. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-CfLCUi9S.js +5 -0
  194. package/codeyam-cli/src/webserver/build/client/assets/entry.client-DKJyZfAY.js +29 -0
  195. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DAtOlaWE.js +1 -0
  196. package/codeyam-cli/src/webserver/build/client/assets/files-ClR0d32A.js +1 -0
  197. package/codeyam-cli/src/webserver/build/client/assets/git-D62Lxxmv.js +15 -0
  198. package/codeyam-cli/src/webserver/build/client/assets/globals-C9s7Lhdl.css +1 -0
  199. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-fmIEn3Bc.js +9 -0
  200. package/codeyam-cli/src/webserver/build/client/assets/index-BosqDOlH.js +3 -0
  201. package/codeyam-cli/src/webserver/build/client/assets/index-CzNNiTkw.js +9 -0
  202. package/codeyam-cli/src/webserver/build/client/assets/keyAttributeCoverage-CTlFMihX.js +1 -0
  203. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-CNp9QFCX.js +6 -0
  204. package/codeyam-cli/src/webserver/build/client/assets/manifest-0d27da29.js +1 -0
  205. package/codeyam-cli/src/webserver/build/client/assets/preload-helper-ckwbz45p.js +1 -0
  206. package/codeyam-cli/src/webserver/build/client/assets/root-B_wIKCIf.js +56 -0
  207. package/codeyam-cli/src/webserver/build/client/assets/scenarioStatus-B_8jpV3e.js +1 -0
  208. package/codeyam-cli/src/webserver/build/client/assets/search-DDGjYAMJ.js +6 -0
  209. package/codeyam-cli/src/webserver/build/client/assets/settings-DgTyB-Wg.js +1 -0
  210. package/codeyam-cli/src/webserver/build/client/assets/simulations-CoNWGt0K.js +1 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-CBc5dE1s.js +6 -0
  212. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BMIGFP-m.js +1 -0
  213. package/codeyam-cli/src/webserver/build/client/assets/useInteractiveMode-Dk_FQqWJ.js +1 -0
  214. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-3pmpUQB-.js → useLastLogLine-BqPPNjAl.js} +1 -1
  215. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DsJbgMY9.js +1 -0
  216. package/codeyam-cli/src/webserver/build/client/assets/{useToast-DEyawJ8r.js → useToast-DWHcCcl1.js} +1 -1
  217. package/codeyam-cli/src/webserver/build/server/assets/index-CU58-Ttc.js +1 -0
  218. package/codeyam-cli/src/webserver/build/server/assets/server-build-D35o2uae.js +175 -0
  219. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  220. package/codeyam-cli/src/webserver/build-info.json +5 -5
  221. package/codeyam-cli/src/webserver/devServer.js +1 -3
  222. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  223. package/codeyam-cli/templates/codeyam-setup-skill.md +138 -3
  224. package/codeyam-cli/templates/debug-codeyam.md +625 -0
  225. package/package.json +14 -14
  226. package/packages/ai/src/lib/analyzeScope.js +2 -0
  227. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  228. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +16 -0
  229. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  230. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +16 -0
  231. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
  232. package/packages/ai/src/lib/astScopes/processExpression.js +305 -88
  233. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  234. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +582 -41
  235. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  236. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +2 -1
  237. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  238. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +454 -0
  239. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -0
  240. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +173 -55
  241. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  242. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +16 -1
  243. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  244. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +30 -1
  245. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  246. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +20 -0
  247. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  248. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js +86 -0
  249. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js.map +1 -0
  250. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +28 -2
  251. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  252. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +179 -17
  253. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
  254. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +6 -0
  255. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +1 -1
  256. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +41 -0
  257. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  258. package/packages/ai/src/lib/generateChangesEntityScenarios.js +37 -4
  259. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  260. package/packages/ai/src/lib/generateEntityDataStructure.js +4 -0
  261. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  262. package/packages/ai/src/lib/generateEntityKeyAttributes.js +176 -9
  263. package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +1 -1
  264. package/packages/ai/src/lib/generateEntityScenarioData.js +29 -25
  265. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  266. package/packages/ai/src/lib/generateEntityScenarios.js +105 -9
  267. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  268. package/packages/ai/src/lib/getConditionalUsagesFromCode.js +84 -14
  269. package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
  270. package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -1
  271. package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
  272. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +6 -0
  273. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  274. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +38 -2
  275. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  276. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +38 -2
  277. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  278. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +16 -3
  279. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js.map +1 -1
  280. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  281. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +4 -0
  282. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  283. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +100 -23
  284. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  285. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +125 -0
  286. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -0
  287. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +298 -45
  288. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  289. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js +1 -1
  290. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js.map +1 -1
  291. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +201 -80
  292. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  293. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +10 -5
  294. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +1 -1
  295. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +55 -69
  296. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  297. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +2 -5
  298. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
  299. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +171 -81
  300. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  301. package/packages/database/src/lib/kysely/db.js +2 -2
  302. package/packages/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  303. package/packages/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  304. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  305. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  306. package/packages/generate/src/lib/deepMerge.js +27 -1
  307. package/packages/generate/src/lib/deepMerge.js.map +1 -1
  308. package/packages/types/index.js +1 -0
  309. package/packages/types/index.js.map +1 -1
  310. package/packages/types/src/types/Scenario.js +21 -1
  311. package/packages/types/src/types/Scenario.js.map +1 -1
  312. package/packages/utils/src/lib/lightweightEntityExtractor.js +25 -0
  313. package/packages/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  314. package/scripts/finalize-analyzer.cjs +3 -1
  315. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +0 -238
  316. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +0 -1
  317. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-CVbSvOjo.js +0 -1
  318. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-DcwcHyl5.js +0 -1
  319. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-WgwC1GfJ.js +0 -26
  320. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-IEKom9O2.js +0 -3
  321. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-BYnfxbUG.js +0 -3
  322. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-_lBPJCzG.js +0 -1
  323. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-lHVhvsu_.js +0 -1
  324. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-d_TBk4GQ.js +0 -5
  325. package/codeyam-cli/src/webserver/build/client/assets/_index-kGT7VUqj.js +0 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-DDGmhu7P.js +0 -7
  327. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-n_HPRfM_.js +0 -1
  328. package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-CbVoyx1U.js +0 -26
  329. package/codeyam-cli/src/webserver/build/client/assets/circle-check-D1VOYveA.js +0 -1
  330. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-YR8jjAlu.js +0 -1
  331. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-B8vP3V_s.js +0 -1
  332. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-CN6aLCT1.js +0 -16
  333. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DA5Jeu2P.js +0 -1
  334. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-BTeitalf.js +0 -5
  335. package/codeyam-cli/src/webserver/build/client/assets/entry.client-du6UEYD-.js +0 -13
  336. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-BpjkhMoi.js +0 -1
  337. package/codeyam-cli/src/webserver/build/client/assets/files-BQGvk4lJ.js +0 -1
  338. package/codeyam-cli/src/webserver/build/client/assets/git-DVdYRT-I.js +0 -12
  339. package/codeyam-cli/src/webserver/build/client/assets/globals-CO-U8Bpo.css +0 -1
  340. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +0 -5
  341. package/codeyam-cli/src/webserver/build/client/assets/index-DCG-vks0.js +0 -1
  342. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-GazdNeLl.js +0 -1
  343. package/codeyam-cli/src/webserver/build/client/assets/manifest-0b694d28.js +0 -1
  344. package/codeyam-cli/src/webserver/build/client/assets/root-D3tQP7hx.js +0 -16
  345. package/codeyam-cli/src/webserver/build/client/assets/search-CIY6XmtE.js +0 -1
  346. package/codeyam-cli/src/webserver/build/client/assets/server-build-CMKNK2uU.css +0 -1
  347. package/codeyam-cli/src/webserver/build/client/assets/settings-CoMDgElu.js +0 -1
  348. package/codeyam-cli/src/webserver/build/client/assets/simulations-agkniXp2.js +0 -1
  349. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-B2VUcygF.js +0 -1
  350. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-EvdK-zXP.js +0 -1
  351. package/codeyam-cli/src/webserver/build/server/assets/index-DGVHQEXD.js +0 -1
  352. package/codeyam-cli/src/webserver/build/server/assets/server-build-CghkTkIL.js +0 -166
  353. package/codeyam-cli/templates/debug-command.md +0 -303
  354. /package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CMKNK2uU.css → styles-CMKNK2uU.css} +0 -0
@@ -3,6 +3,7 @@ import {
3
3
  convertDotNotation,
4
4
  fillInDirectSchemaGapsAndUnknowns,
5
5
  joinParenthesesAndArrays,
6
+ mergeJsonTypeDefinitions,
6
7
  splitOutsideParenthesesAndArrays,
7
8
  } from '~codeyam/ai';
8
9
  import { DataStructure, JsonTypeDefinition } from '~codeyam/types';
@@ -15,6 +16,65 @@ function cleanFunctionName(name: string): string {
15
16
  return name?.split('<')[0];
16
17
  }
17
18
 
19
+ /**
20
+ * Escapes special regex characters in a string.
21
+ */
22
+ function escapeRegExp(str: string): string {
23
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
24
+ }
25
+
26
+ /**
27
+ * Counts only DIRECT function calls, excluding method chains on return values.
28
+ *
29
+ * When a hook returns an object with methods that are later called, the analysis
30
+ * tracks those as call signatures like 'useAuth().functionCallReturnValue.signOut()'.
31
+ * These are NOT separate calls to useAuth - they're method invocations on the return value.
32
+ *
33
+ * This function filters out such method chains to get the true count of direct calls.
34
+ *
35
+ * @example
36
+ * // One direct call, one method on return value
37
+ * countDirectCalls(['useAuth()', 'useAuth().functionCallReturnValue.signOut()']) // => 1
38
+ *
39
+ * // Two direct calls
40
+ * countDirectCalls(['useFetcher()', 'useFetcher()']) // => 2
41
+ */
42
+ function countDirectCalls(calls: string[]): number {
43
+ return calls.filter((sig) => !sig.includes('.functionCallReturnValue.'))
44
+ .length;
45
+ }
46
+
47
+ /**
48
+ * Checks if all direct calls (non-method-chain calls) are identical.
49
+ * This happens when destructuring a hook call:
50
+ * const { authLoading, signOut } = useAuth();
51
+ * produces calls: ['useAuth()', 'useAuth()'] (same signature repeated)
52
+ *
53
+ * In this case, we should use the full unqualified schema since there's
54
+ * really only ONE function call, not multiple different calls.
55
+ *
56
+ * @example
57
+ * // Same call repeated (from destructuring)
58
+ * allDirectCallsIdentical(['useAuth()', 'useAuth()']) // => true
59
+ *
60
+ * // Different calls
61
+ * allDirectCallsIdentical(['useFetcher<User>()', 'useFetcher<Report>()']) // => false
62
+ *
63
+ * // Single call
64
+ * allDirectCallsIdentical(['useAuth()']) // => true
65
+ *
66
+ * // With method chain (method chain is ignored)
67
+ * allDirectCallsIdentical(['useAuth()', 'useAuth().functionCallReturnValue.signOut()']) // => true
68
+ */
69
+ function allDirectCallsIdentical(calls: string[]): boolean {
70
+ const directCalls = calls.filter(
71
+ (sig) => !sig.includes('.functionCallReturnValue.'),
72
+ );
73
+ if (directCalls.length === 0) return true;
74
+ const firstCall = directCalls[0];
75
+ return directCalls.every((call) => call === firstCall);
76
+ }
77
+
18
78
  /**
19
79
  * Preprocesses the schema to:
20
80
  * 1. Filter out all signature paths
@@ -68,6 +128,18 @@ function preprocessSchemaForMocks(
68
128
  return result;
69
129
  }
70
130
 
131
+ /**
132
+ * Options for gatherDataForMocks
133
+ */
134
+ export interface GatherDataForMocksOptions {
135
+ /**
136
+ * When provided, generates canonical keys in format `EntityName::hookName::index`.
137
+ * This ensures consistent keys across scenarios regardless of variable names
138
+ * chosen during analysis.
139
+ */
140
+ entityName?: string;
141
+ }
142
+
71
143
  /**
72
144
  * Processes a single call (with optional variable name) and returns the mock data entry.
73
145
  * Returns null if no valid schema is found.
@@ -78,6 +150,8 @@ function preprocessSchemaForMocks(
78
150
  * @param variableNameOccurrence - When a variable name is reused, this is the occurrence index
79
151
  * (e.g., first 'data' = 0, second 'data' = 1)
80
152
  * Used to disambiguate keys when the same variable is reused.
153
+ * @param options - Additional options including entityName for canonical key generation
154
+ * @param hookCallIndex - The global index of this hook call for canonical key generation
81
155
  */
82
156
  function processCall(
83
157
  importedExport: {
@@ -89,29 +163,125 @@ function processCall(
89
163
  },
90
164
  dependencySchemas: DataStructure['dependencySchemas'],
91
165
  callIndex: number,
92
- variableNameOccurrence?: number,
166
+ variableNameOccurrence: number | undefined,
167
+ options: GatherDataForMocksOptions | undefined,
168
+ hookCallIndex: number,
93
169
  ): { key: string; value: JsonTypeDefinition } | null {
94
170
  const callName = importedExport.calls?.[callIndex] ?? importedExport.name;
95
- const variableName = importedExport.callVariableNames?.[callIndex];
171
+
172
+ // Determine if we should use variable-qualified schema or base schema.
173
+ // Use variable-qualified schema when:
174
+ // 1. variableNameOccurrence is defined (we're processing multiple DISTINCT calls), OR
175
+ // 2. Single call with single variable name (directCallCount === 1 && varNamesLength === 1)
176
+ // Use base schema when:
177
+ // - Multiple calls that are all identical (destructuring case: const { a, b } = useHook())
178
+ // - directCallCount !== varNamesLength (rest spread or method chain case)
179
+ // This is important for rest spread destructuring like: const { x, y, ...data } = useLoaderData()
180
+ // where data.queueState.jobs should come from the base schema, not from a variable-qualified schema.
181
+ // Also important: method chains like useAuth().functionCallReturnValue.signOut() should NOT count
182
+ // as separate calls - only direct hook calls count.
183
+ const directCallCount = countDirectCalls(importedExport.calls ?? []);
184
+ const varNamesLength = importedExport.callVariableNames?.length ?? 0;
185
+ const shouldUseVariableQualifiedSchema =
186
+ variableNameOccurrence !== undefined ||
187
+ (directCallCount === 1 && varNamesLength === 1);
188
+ const variableName = shouldUseVariableQualifiedSchema
189
+ ? importedExport.callVariableNames?.[callIndex]
190
+ : undefined;
96
191
 
97
192
  // Build the schema lookup key - use variable-qualified key if available
98
- const schemaLookupKey = variableName
99
- ? `${importedExport.name}::${variableName}`
100
- : importedExport.name;
193
+ // When the same variable name is reused (variableNameOccurrence > 0), try indexed lookup first
194
+ // e.g., "useFetcher::fetcher[1]" for the second use of "fetcher"
195
+ const indexedVariableName =
196
+ variableName &&
197
+ variableNameOccurrence !== undefined &&
198
+ variableNameOccurrence > 0
199
+ ? `${variableName}[${variableNameOccurrence}]`
200
+ : variableName;
201
+
202
+ // Schema lookup order (most specific to least specific):
203
+ // 1. Call signature (e.g., 'useLoaderData<typeof loader>()')
204
+ // 2. Variable-qualified key with index (e.g., 'useFetcher::fetcher[1]')
205
+ // 3. Variable-qualified key without index (e.g., 'useFetcher::fetcher')
206
+ // 4. Base name (e.g., 'useLoaderData')
207
+
208
+ let rawSchema: Record<string, string> = {};
209
+
210
+ // 1. Try call signature first (most specific - new format)
211
+ if (callName !== importedExport.name) {
212
+ rawSchema =
213
+ dependencySchemas?.[importedExport.filePath]?.[callName]
214
+ ?.returnValueSchema ?? {};
215
+ }
216
+
217
+ // 2. Try variable-qualified key with index
218
+ if (Object.keys(rawSchema).length === 0 && indexedVariableName) {
219
+ const indexedKey = `${importedExport.name}::${indexedVariableName}`;
220
+ rawSchema =
221
+ dependencySchemas?.[importedExport.filePath]?.[indexedKey]
222
+ ?.returnValueSchema ?? {};
223
+ }
224
+
225
+ // 3. Try variable-qualified key without index (fallback for indexed lookup)
226
+ if (
227
+ Object.keys(rawSchema).length === 0 &&
228
+ variableNameOccurrence !== undefined &&
229
+ variableNameOccurrence > 0 &&
230
+ variableName
231
+ ) {
232
+ const nonIndexedKey = `${importedExport.name}::${variableName}`;
233
+ rawSchema =
234
+ dependencySchemas?.[importedExport.filePath]?.[nonIndexedKey]
235
+ ?.returnValueSchema ?? {};
236
+ }
101
237
 
102
- const rawSchema =
103
- dependencySchemas?.[importedExport.filePath]?.[schemaLookupKey]
238
+ // 4. Get base name schema and merge with call-specific schema
239
+ // The base schema often has more complete array element details that the
240
+ // call-specific schema might be missing. Instead of using as fallback only
241
+ // when empty, MERGE both schemas so we get the most complete picture.
242
+ //
243
+ // HOWEVER: For type-parameterized calls where the base schema contains paths
244
+ // from MULTIPLE DIFFERENT type parameters, DON'T merge to avoid contamination.
245
+ // The call-specific schema (rawSchema) is already isolated and complete.
246
+ const baseSchema =
247
+ dependencySchemas?.[importedExport.filePath]?.[importedExport.name]
104
248
  ?.returnValueSchema ?? {};
105
249
 
106
- // If no schema found with variable-qualified key, fall back to base name
107
- const fallbackSchema =
108
- Object.keys(rawSchema).length === 0
109
- ? (dependencySchemas?.[importedExport.filePath]?.[importedExport.name]
110
- ?.returnValueSchema ?? {})
111
- : rawSchema;
250
+ // Check if this is a type-parameterized call with a call-specific schema
251
+ const hasTypeParams = callName.includes('<') && callName.includes('>');
252
+ const hasCallSpecificSchema = Object.keys(rawSchema).length > 0;
253
+
254
+ // Check if the base schema has multiple DIFFERENT type parameter variants
255
+ // If so, merging would bring in wrong fields from other variants
256
+ let baseHasMultipleTypeParamVariants = false;
257
+ if (hasTypeParams && hasCallSpecificSchema) {
258
+ const baseFunctionName = cleanFunctionName(callName.split('(')[0]);
259
+ const typeParamVariantsInBase = new Set<string>();
260
+
261
+ for (const path of Object.keys(baseSchema)) {
262
+ // Look for paths like "useFetcher<TypeA>(...)" or "useFetcher<TypeB>(...)"
263
+ const match = path.match(
264
+ new RegExp(`^${escapeRegExp(baseFunctionName)}<([^>]+)>\\(`),
265
+ );
266
+ if (match) {
267
+ typeParamVariantsInBase.add(match[1]);
268
+ }
269
+ }
270
+ baseHasMultipleTypeParamVariants = typeParamVariantsInBase.size > 1;
271
+ }
272
+
273
+ // For type-parameterized calls where the base schema has MULTIPLE different type
274
+ // parameter variants, use ONLY the call-specific schema to avoid contamination.
275
+ // Otherwise, merge with base schema for complete coverage (e.g., array element details).
276
+ const mergedSchema =
277
+ hasCallSpecificSchema && hasTypeParams && baseHasMultipleTypeParamVariants
278
+ ? rawSchema // Use ONLY the call-specific schema when base has mixed type params
279
+ : Object.keys(rawSchema).length === 0
280
+ ? baseSchema
281
+ : { ...baseSchema, ...rawSchema };
112
282
 
113
283
  // Preprocess to filter signatures and extract functionCallReturnValue
114
- let preprocessedSchema = preprocessSchemaForMocks(fallbackSchema);
284
+ let preprocessedSchema = preprocessSchemaForMocks(mergedSchema);
115
285
 
116
286
  const functionNames: string[] = [];
117
287
 
@@ -245,23 +415,11 @@ function processCall(
245
415
  ? `${baseSchemaKey}::${variableName}`
246
416
  : baseSchemaKey;
247
417
 
248
- // Build output key - for variable-qualified, use "variableName <- functionName" format
249
- // This reads naturally as "variableName receives from functionName"
250
- // When a variable name is reused (variableNameOccurrence > 0), disambiguate with index
251
- let outputKey: string;
252
- if (variableName) {
253
- // When the same variable name is used multiple times, append the occurrence index
254
- // to create unique keys: "data[0] <- useFetch", "data[1] <- useFetch"
255
- const disambiguator =
256
- variableNameOccurrence !== undefined && variableNameOccurrence > 0
257
- ? `[${variableNameOccurrence}]`
258
- : '';
259
- outputKey = `${variableName}${disambiguator} <- ${importedExport.name}`;
260
- } else if (isObjectStyle) {
261
- outputKey = importedExport.name;
262
- } else {
263
- outputKey = callName;
264
- }
418
+ // Build output key - use the ORIGINAL CALL SIGNATURE from the code
419
+ // This makes it clear to the LLM exactly which call needs which data.
420
+ // Example: useFetcher<{ data: UserData }>() vs useFetcher<{ data: ReportData }>()
421
+ // Example: db.select(usersQuery) vs db.select(postsQuery)
422
+ const outputKey = callName;
265
423
 
266
424
  // Try to find return value - check with variable qualifier first, then without
267
425
  let returnValue = schema[schemaKey];
@@ -271,6 +429,49 @@ function processCall(
271
429
  if (!returnValue) {
272
430
  returnValue = schema['returnValue'];
273
431
  }
432
+ // Fallback for function call return values (e.g., useFetcher returns via functionCallReturnValue)
433
+ if (!returnValue) {
434
+ returnValue = schema['functionCallReturnValue'];
435
+ }
436
+
437
+ // Handle method-chain style calls (e.g., createClient().from("workouts").select("*") or db.select(query))
438
+ // After convertDotNotation, the schema is nested: { "createClient()": { "from(...)": { ... } } }
439
+ // We need to navigate the nested structure using the call signature parts.
440
+ // For object-style dependencies (isObjectStyle=true), the baseSchemaKey is just the object name (e.g., "db"),
441
+ // so returnValue might be the parent object, not the actual return value of the method chain.
442
+ // We should always try method-chain navigation for calls with dots and parens.
443
+ if (callName.includes('.') && callName.includes('(')) {
444
+ const callParts = splitOutsideParenthesesAndArrays(callName);
445
+ let current: unknown = schema;
446
+ for (const part of callParts) {
447
+ if (
448
+ current &&
449
+ typeof current === 'object' &&
450
+ !Array.isArray(current) &&
451
+ part in (current as Record<string, unknown>)
452
+ ) {
453
+ current = (current as Record<string, unknown>)[part];
454
+ } else {
455
+ current = undefined;
456
+ break;
457
+ }
458
+ }
459
+ // Use method-chain result if found, otherwise keep previous returnValue
460
+ if (current !== undefined) {
461
+ returnValue = current as typeof returnValue;
462
+ // Log when method-chain navigation succeeds for supabase-style calls
463
+ if (callName.includes('createClient') || callName.includes('from(')) {
464
+ console.log(
465
+ 'CODEYAM: Method-chain navigation succeeded for:',
466
+ callName,
467
+ '-> keys:',
468
+ typeof returnValue === 'object' && returnValue
469
+ ? Object.keys(returnValue as object).slice(0, 5)
470
+ : typeof returnValue,
471
+ );
472
+ }
473
+ }
474
+ }
274
475
 
275
476
  if (!returnValue) {
276
477
  return null;
@@ -279,6 +480,27 @@ function processCall(
279
480
  return { key: outputKey, value: returnValue as JsonTypeDefinition };
280
481
  }
281
482
 
483
+ /**
484
+ * Adds a result to the accumulator, merging schemas if the key already exists.
485
+ * This handles the case where the same call signature appears multiple times
486
+ * (e.g., two calls to useFetcher() with the same generic type).
487
+ */
488
+ function addResultToAccumulator(
489
+ acc: { [key: string]: JsonTypeDefinition },
490
+ key: string,
491
+ value: JsonTypeDefinition,
492
+ ): void {
493
+ if (acc[key]) {
494
+ // Key already exists - merge the schemas
495
+ acc[key] = mergeJsonTypeDefinitions(
496
+ acc[key] as Record<string, unknown>,
497
+ value as Record<string, unknown>,
498
+ ) as JsonTypeDefinition;
499
+ } else {
500
+ acc[key] = value;
501
+ }
502
+ }
503
+
282
504
  export default function gatherDataForMocks(
283
505
  importedExports: {
284
506
  filePath?: string;
@@ -288,19 +510,34 @@ export default function gatherDataForMocks(
288
510
  callVariableNames?: string[];
289
511
  }[],
290
512
  dependencySchemas: DataStructure['dependencySchemas'],
513
+ options?: GatherDataForMocksOptions,
291
514
  ) {
292
- return importedExports.reduce(
515
+ // Track the global index for each hook name across all imports
516
+ // This enables canonical keys like EntityName::useLoaderData::0, EntityName::useFetcher::0, etc.
517
+ const hookCallIndices: Record<string, number> = {};
518
+
519
+ const result = importedExports.reduce(
293
520
  (acc, importedExport) => {
294
521
  if (!importedExport.isMocked) return acc;
295
522
 
296
- // Check if we have multiple calls with variable names
297
- const hasMultipleCalls =
298
- importedExport.calls &&
299
- importedExport.calls.length > 1 &&
523
+ // Get the clean hook name for indexing
524
+ const hookName = cleanFunctionName(importedExport.name);
525
+
526
+ // Check if we have multiple DISTINCT direct calls with variable names.
527
+ // Important: Only count direct calls to the function, not method chains on its return value.
528
+ // For example, ['useAuth()', 'useAuth().functionCallReturnValue.signOut()'] has only 1 direct call.
529
+ //
530
+ // ALSO: If all direct calls are IDENTICAL (same signature repeated), this is from
531
+ // destructuring like `const { a, b } = useHook()` and we should use the FULL unqualified
532
+ // schema, not iterate through partial variable-qualified schemas.
533
+ const directCallCount = countDirectCalls(importedExport.calls ?? []);
534
+ const hasMultipleDistinctCalls =
535
+ directCallCount > 1 &&
300
536
  importedExport.callVariableNames &&
301
- importedExport.callVariableNames.length === importedExport.calls.length;
537
+ importedExport.callVariableNames.length === directCallCount &&
538
+ !allDirectCallsIdentical(importedExport.calls ?? []);
302
539
 
303
- if (hasMultipleCalls) {
540
+ if (hasMultipleDistinctCalls) {
304
541
  // Track how many times each variable name has been seen
305
542
  // to disambiguate keys when the same variable is reused
306
543
  const variableNameCounts: Record<string, number> = {};
@@ -313,21 +550,129 @@ export default function gatherDataForMocks(
313
550
  const occurrence = variableNameCounts[varName] ?? 0;
314
551
  variableNameCounts[varName] = occurrence + 1;
315
552
 
316
- const result = processCall(
553
+ // Get the current hook call index and increment for next call
554
+ const hookCallIndex = hookCallIndices[hookName] ?? 0;
555
+ hookCallIndices[hookName] = hookCallIndex + 1;
556
+
557
+ const processResult = processCall(
317
558
  importedExport,
318
559
  dependencySchemas,
319
560
  i,
320
561
  occurrence,
562
+ options,
563
+ hookCallIndex,
321
564
  );
322
- if (result) {
323
- acc[result.key] = result.value;
565
+ if (processResult) {
566
+ addResultToAccumulator(acc, processResult.key, processResult.value);
324
567
  }
325
568
  }
326
569
  } else {
327
- // Original behavior for single calls or calls without variable names
328
- const result = processCall(importedExport, dependencySchemas, 0);
329
- if (result) {
330
- acc[result.key] = result.value;
570
+ // Single calls, or multiple identical calls (from destructuring)
571
+ // Get the current hook call index and increment for next call
572
+ const hookCallIndex = hookCallIndices[hookName] ?? 0;
573
+ hookCallIndices[hookName] = hookCallIndex + 1;
574
+
575
+ // First, try to get result from unqualified schema
576
+ const processResult = processCall(
577
+ importedExport,
578
+ dependencySchemas,
579
+ 0,
580
+ undefined,
581
+ options,
582
+ hookCallIndex,
583
+ );
584
+
585
+ // Check if we got a meaningful result (not empty object or null)
586
+ // Arrays are always meaningful (even empty ones represent valid data structure)
587
+ const hasUnqualifiedResult =
588
+ processResult &&
589
+ processResult.value !== null &&
590
+ (typeof processResult.value !== 'object' ||
591
+ Array.isArray(processResult.value) ||
592
+ Object.keys(processResult.value as object).length > 0);
593
+
594
+ // Check if we have multiple callVariableNames that are DIFFERENT
595
+ // (e.g., from parent + child components using the same hook differently)
596
+ // In this case, we should also merge in variable-qualified schemas
597
+ // to capture all destructured properties from both parent and child.
598
+ const uniqueCallVarNames = new Set(
599
+ importedExport.callVariableNames ?? [],
600
+ );
601
+ const hasDifferentVarNames =
602
+ importedExport.callVariableNames &&
603
+ importedExport.callVariableNames.length > 1 &&
604
+ uniqueCallVarNames.size > 1 &&
605
+ // Only merge variable-qualified schemas when calls are all identical
606
+ // (e.g., useFlags() repeated). Don't do this for method chains
607
+ // or rest spread cases where calls.length !== callVariableNames.length
608
+ allDirectCallsIdentical(importedExport.calls ?? []);
609
+
610
+ if (hasUnqualifiedResult) {
611
+ let finalValue = processResult.value;
612
+
613
+ // If we have different variable names (e.g., from parent and child components),
614
+ // also merge in variable-qualified schemas to ensure we capture all properties.
615
+ // This handles the case where parent uses useFlags().enableNewAdminDashboard
616
+ // and child uses useFlags().flagShowReferenceIdOnQuoteTable.
617
+ if (hasDifferentVarNames) {
618
+ let mergedValue = processResult.value as JsonTypeDefinition;
619
+ for (let i = 0; i < importedExport.callVariableNames!.length; i++) {
620
+ const varQualifiedResult = processCall(
621
+ importedExport,
622
+ dependencySchemas,
623
+ i,
624
+ 0, // Use 0 to trigger variable-qualified lookup
625
+ options,
626
+ hookCallIndex,
627
+ );
628
+ if (varQualifiedResult && varQualifiedResult.value) {
629
+ mergedValue = mergeJsonTypeDefinitions(
630
+ mergedValue as Record<string, unknown>,
631
+ varQualifiedResult.value as Record<string, unknown>,
632
+ ) as JsonTypeDefinition;
633
+ }
634
+ }
635
+ finalValue = mergedValue;
636
+ }
637
+
638
+ addResultToAccumulator(
639
+ acc,
640
+ processResult.key,
641
+ finalValue as JsonTypeDefinition,
642
+ );
643
+ } else if (
644
+ directCallCount > 1 &&
645
+ allDirectCallsIdentical(importedExport.calls ?? []) &&
646
+ importedExport.callVariableNames &&
647
+ importedExport.callVariableNames.length > 0
648
+ ) {
649
+ // No unqualified schema exists, but we have multiple identical calls with variable names
650
+ // Merge all the variable-qualified schemas together
651
+ const callSignature =
652
+ importedExport.calls?.[0] ?? `${importedExport.name}()`;
653
+ let mergedValue: JsonTypeDefinition = {};
654
+
655
+ for (let i = 0; i < importedExport.callVariableNames.length; i++) {
656
+ const varQualifiedResult = processCall(
657
+ importedExport,
658
+ dependencySchemas,
659
+ i,
660
+ 0, // Use 0 to trigger variable-qualified lookup
661
+ options,
662
+ hookCallIndex,
663
+ );
664
+ if (varQualifiedResult && varQualifiedResult.value) {
665
+ // Deep merge the value into the accumulated result
666
+ mergedValue = mergeJsonTypeDefinitions(
667
+ mergedValue,
668
+ varQualifiedResult.value,
669
+ );
670
+ }
671
+ }
672
+
673
+ if (Object.keys(mergedValue as object).length > 0) {
674
+ addResultToAccumulator(acc, callSignature, mergedValue);
675
+ }
331
676
  }
332
677
  }
333
678
 
@@ -335,4 +680,19 @@ export default function gatherDataForMocks(
335
680
  },
336
681
  {} as { [importAlias: string]: JsonTypeDefinition },
337
682
  );
683
+
684
+ // Log dataForMocks keys when supabase/createClient is involved
685
+ const supabaseKeys = Object.keys(result).filter(
686
+ (k) => k.includes('createClient') || k.includes('from('),
687
+ );
688
+ if (supabaseKeys.length > 0) {
689
+ console.log(
690
+ 'CODEYAM: dataForMocks includes supabase keys:',
691
+ supabaseKeys,
692
+ '| All keys:',
693
+ Object.keys(result),
694
+ );
695
+ }
696
+
697
+ return result;
338
698
  }
@@ -38,7 +38,7 @@ export default async function generateChangesScenarioData({
38
38
  const fullStructure = analysis.metadata.scenariosDataStructure;
39
39
  const structure: Analysis['metadata']['scenariosDataStructure'] = {
40
40
  arguments: fullStructure.arguments ?? [],
41
- dataForMocks: gatherDataForMocks(analysis, dependentAnalyses),
41
+ dataForMocks: gatherDataForMocks(analysis, dependentAnalyses, entity.name),
42
42
  };
43
43
 
44
44
  for (const key in fullStructure.dataForMocks) {