@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
@@ -255,19 +255,19 @@ export default async function writeSimpleRoot(
255
255
 
256
256
  if (!newContent.match(importRegex)) continue;
257
257
 
258
- // Find the correct variable-qualified mock key for ROOT's usage
259
- // The mock data is stored under keys like "variableName <- functionName"
260
- // For root.tsx, we need to find the key that corresponds to ROOT's usage,
261
- // NOT the route's (Settings') usage.
258
+ // Find the correct mock key for ROOT's usage
259
+ // The mock data is stored under call signature keys like "useLoaderData()"
262
260
  const dataForMocks =
263
261
  options.routeAnalysis?.metadata?.scenariosDataStructure
264
262
  ?.dataForMocks;
265
263
 
266
- // Find all keys that end with this entity name
264
+ // Find all keys that match this entity/hook by base name
265
+ const entityBaseName = entityName.split(/[<(]/)[0];
267
266
  const matchingKeys = dataForMocks
268
- ? Object.keys(dataForMocks).filter((key) =>
269
- key.endsWith(` <- ${entityName}`),
270
- )
267
+ ? Object.keys(dataForMocks).filter((key) => {
268
+ const keyBaseName = key.split(/[<(]/)[0];
269
+ return keyBaseName === entityBaseName;
270
+ })
271
271
  : [];
272
272
 
273
273
  // If there are multiple keys (e.g., one for root.tsx and one for Settings),
@@ -302,11 +302,9 @@ export default async function writeSimpleRoot(
302
302
  }
303
303
  }
304
304
 
305
- // Find a key that uses one of root's property names
306
- mockKey = matchingKeys.find((key) => {
307
- const varName = key.split(' <- ')[0];
308
- return rootPropertyNames.includes(varName);
309
- });
305
+ // Find a key that matches by call signature
306
+ // For call signature format (e.g., "useLoaderData()"), just use the first match
307
+ mockKey = matchingKeys[0];
310
308
 
311
309
  // Fallback: if no match found but there are multiple keys,
312
310
  // exclude the route's key (which we can identify from mockedImports variable names)
@@ -1,12 +1,93 @@
1
1
  import { joinParenthesesAndArrays, splitOutsideParenthesesAndArrays, functionArguments, cleanOutBoundary, fillInDirectSchemaGapsAndUnknowns, removeDuplicateFunctionCalls, } from "../../../../../packages/ai/index.js";
2
2
  /**
3
- * Converts a variable qualifier to a safe identifier for use in function/const names.
4
- * Handles indexed format like "data[1]" -> "data_1"
3
+ * Converts a call signature to a valid JavaScript identifier (function name).
4
+ * The original signature is preserved for data access - this only creates the function name.
5
+ *
6
+ * Examples:
7
+ * - "useAuth()" → "useAuth"
8
+ * - "db.select(usersQuery)" → "db_select_usersQuery"
9
+ * - "db.select(postsQuery)" → "db_select_postsQuery"
10
+ * - "useFetcher<User>()" → "useFetcher_User"
11
+ * - "useFetcher<{ data: UserData | null }>()" → "useFetcher_data_UserData_null"
12
+ * - "eq('user_id', value)" → "eq_user_id_value"
13
+ * - "from('workouts')" → "from_workouts"
5
14
  */
6
- function safeVariableQualifier(qualifier) {
7
- // Replace brackets with underscores for valid JS identifier
8
- // "data[1]" -> "data_1"
9
- return qualifier.replace(/\[(\d+)\]/g, '_$1');
15
+ function callSignatureToFunctionName(signature) {
16
+ // Extract components from the signature
17
+ const components = [];
18
+ // 1. Extract function path (parts separated by dots outside parens/brackets)
19
+ const pathMatch = signature.match(/^([^<(]+)/);
20
+ if (pathMatch) {
21
+ const path = pathMatch[1];
22
+ // Split on dots but preserve the parts
23
+ components.push(...path.split('.').filter(Boolean));
24
+ }
25
+ // 2. Extract generic type parameters (content between < and >)
26
+ const genericMatch = signature.match(/<([^>]+)>/);
27
+ if (genericMatch) {
28
+ const genericContent = genericMatch[1];
29
+ // Extract meaningful identifiers from generic type
30
+ // Handle complex types like "{ data: UserData | null }"
31
+ const typeIdentifiers = genericContent
32
+ .replace(/[{}:;,]/g, ' ') // Remove structural chars
33
+ .replace(/\|/g, ' ') // Handle union types
34
+ .split(/\s+/)
35
+ .filter(Boolean)
36
+ .filter((s) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(s)) // Only valid identifiers
37
+ .filter((s) => ![
38
+ 'null',
39
+ 'undefined',
40
+ 'void',
41
+ 'never',
42
+ 'any',
43
+ 'unknown',
44
+ 'data',
45
+ 'typeof',
46
+ ].includes(s)); // Skip common non-meaningful keywords
47
+ if (typeIdentifiers.length > 0) {
48
+ components.push(...typeIdentifiers.slice(0, 2)); // Limit to first 2 for reasonable length
49
+ }
50
+ }
51
+ // 3. Extract function arguments (first 2 for disambiguation)
52
+ const argsMatch = signature.match(/\(([^)]*)\)/);
53
+ if (argsMatch && argsMatch[1]) {
54
+ const argsContent = argsMatch[1].trim();
55
+ if (argsContent) {
56
+ const args = argsContent.split(',').map((arg) => arg.trim());
57
+ for (const arg of args.slice(0, 2)) {
58
+ // For quoted strings, extract the content
59
+ const stringMatch = arg.match(/^['"`](.+)['"`]$/);
60
+ if (stringMatch) {
61
+ // Split on dots for string paths like 'users.id'
62
+ const parts = stringMatch[1].split('.').filter(Boolean);
63
+ components.push(...parts);
64
+ }
65
+ else if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(arg)) {
66
+ // Valid identifier - use as-is
67
+ components.push(arg);
68
+ }
69
+ else if (/^\d+$/.test(arg)) {
70
+ // Number - use as-is
71
+ components.push(arg);
72
+ }
73
+ // Skip complex expressions
74
+ }
75
+ }
76
+ }
77
+ // Build the function name from components
78
+ const functionName = components
79
+ .join('_')
80
+ .replace(/[^a-zA-Z0-9_]/g, '_') // Sanitize special chars
81
+ .replace(/_+/g, '_') // Collapse multiple underscores
82
+ .replace(/^_|_$/g, ''); // Trim underscores
83
+ return functionName || 'mock';
84
+ }
85
+ /**
86
+ * Check if a mock name is a call signature (e.g., "useFetcher<User>()", "db.select(query)")
87
+ */
88
+ function isCallSignature(mockName) {
89
+ // Call signatures contain parentheses (function calls)
90
+ return mockName.includes('(');
10
91
  }
11
92
  /**
12
93
  * Extract property names that are jsx-components and should be preserved from original.
@@ -140,17 +221,20 @@ function isValidKey(key) {
140
221
  const keyWithOutArguments = key.split('(')[0];
141
222
  return !/\s/.test(keyWithOutArguments);
142
223
  }
143
- export default function constructMockCode(mockName, dependencySchemas, entityType, options) {
144
- // Check for variable-qualified mock name (e.g., "entityDiffFetcher <- useFetcher")
145
- // Format: "variableName <- functionName" which reads naturally as "variableName receives from functionName"
146
- // Also handles indexed format: "data[1] <- useFetch" for disambiguating reused variable names
147
- const variableQualifierMatch = mockName.match(/^([a-zA-Z_][a-zA-Z0-9_]*(?:\[\d+\])?)\s*<-\s*/);
148
- let variableQualifier = variableQualifierMatch
149
- ? variableQualifierMatch[1]
224
+ export default function constructMockCode(mockName, dependencySchemas, entityType, _canonicalKey, // DEPRECATED: No longer used, kept for API compatibility
225
+ options) {
226
+ // Check if mockName is a call signature (e.g., "useFetcher<User>()", "db.select(query)")
227
+ const mockNameIsCallSignature = isCallSignature(mockName);
228
+ // For call signatures, use the original signature for data access but generate
229
+ // a valid JS function name from it
230
+ const derivedFunctionName = mockNameIsCallSignature
231
+ ? callSignatureToFunctionName(mockName)
150
232
  : null;
151
- const baseMockName = variableQualifier
152
- ? mockName.slice(variableQualifierMatch[0].length)
153
- : mockName;
233
+ // The baseMockName is the function name without type params and args
234
+ // e.g., "useFetcher<User>()" -> "useFetcher", "db.select(query)" -> "db"
235
+ const baseMockName = mockName.split(/[<(]/)[0];
236
+ // The data key is the mockName (call signature) for data access
237
+ let dataKey;
154
238
  const mockNameParts = splitOutsideParenthesesAndArrays(baseMockName);
155
239
  let relevantReturnValueSchema;
156
240
  let dataStructurePath;
@@ -159,26 +243,9 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
159
243
  let signatureSchema;
160
244
  for (const filePath in dependencySchemas) {
161
245
  for (const entityName in dependencySchemas[filePath]) {
162
- // For variable-qualified mocks, look for the full qualified name first
163
- // Format: "variableName <- functionName" (e.g., "entityDiffFetcher <- useFetcher")
164
- const targetEntityName = variableQualifier
165
- ? `${variableQualifier} <- ${baseMockName}`
166
- : mockNameParts[0];
167
- // Check for direct match
168
- let matches = entityName === targetEntityName || entityName === mockNameParts[0];
169
- // If no direct match and no qualifier was provided, check if the entity
170
- // is stored under a variable-qualified key (e.g., "stateBadge <- getStateBadge")
171
- // This handles the case where gatherDataForMocks stored the entity with a variable
172
- // qualifier but writeScenarioComponents called constructMockCode without one.
173
- if (!matches && !variableQualifier) {
174
- const qualifiedKeyMatch = entityName.match(new RegExp(`^([a-zA-Z_][a-zA-Z0-9_]*)\\s*<-\\s*${mockNameParts[0]}$`));
175
- if (qualifiedKeyMatch) {
176
- matches = true;
177
- // Extract the variable qualifier from the entity name so we can use
178
- // it for the data lookup key later
179
- variableQualifier = qualifiedKeyMatch[1];
180
- }
181
- }
246
+ // Match entity by base name (without generics/args)
247
+ const entityBaseName = entityName.split(/[<(]/)[0];
248
+ const matches = entityBaseName === baseMockName || entityName === mockNameParts[0];
182
249
  if (!matches)
183
250
  continue;
184
251
  // Track if we found the entity and it has a signature (is a function)
@@ -210,6 +277,37 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
210
277
  }
211
278
  }
212
279
  }
280
+ // Check if the entity is used as a function (called with ()) vs an object/namespace.
281
+ // Look for paths in the schema that start with "baseMockName(" or "baseMockName<" indicating function calls.
282
+ // The "<" handles generic type parameters like useLoaderData<T>().
283
+ // Also check dataStructurePath === 'returnValue' which indicates a function return value.
284
+ const entityIsFunction = foundEntityWithSignature ||
285
+ dataStructurePath === 'returnValue' ||
286
+ Object.keys(relevantReturnValueSchema ?? {}).some((key) => key.startsWith(`${baseMockName}(`) ||
287
+ key.startsWith(`${baseMockName}<`));
288
+ // Calculate the data key - use the call signature (mockName) for data access
289
+ // For simple names without parentheses:
290
+ // - Append () ONLY if the entity is a function/hook (detected above)
291
+ // - Don't append () for object/namespace mocks like "supabase"
292
+ if (mockNameIsCallSignature || mockName.includes('(')) {
293
+ dataKey = mockName;
294
+ }
295
+ else if (entityIsFunction) {
296
+ // Entity is a function/hook - append () to match call signature format
297
+ dataKey = `${mockName}()`;
298
+ }
299
+ else {
300
+ // Entity is an object/namespace - use bare name as key
301
+ dataKey = mockName;
302
+ }
303
+ // LOGGING: Track data key generation for debugging key mismatch issues
304
+ console.log('CODEYAM DEBUG [constructMockCode]: Generated dataKey:', JSON.stringify({
305
+ mockName,
306
+ dataKey,
307
+ mockNameIsCallSignature,
308
+ entityIsFunction,
309
+ baseMockName,
310
+ }));
213
311
  // Check if the return value schema only contains function type markers
214
312
  // (e.g., "validateInputs()": "function") without actual return data
215
313
  // (no functionCallReturnValue entries)
@@ -287,17 +385,16 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
287
385
  // Strip type parameters like <typeof loader> from function names
288
386
  // so "useLoaderData<typeof loader>()" becomes "useLoaderData()"
289
387
  name = cleanOutTypes(name);
290
- // For variable-qualified mocks at root level, use the "variableName <- functionName" format
291
- // This matches the format generated by gatherDataForMocks and is more intuitive for LLMs
292
- // e.g., "useFetcher()" becomes "entityDiffFetcher <- useFetcher"
293
- if (isRootAccess && variableQualifier) {
294
- // Remove trailing () from the function name to match gatherDataForMocks key format
295
- const baseName = name.replace(/\(\)$/, '');
296
- name = `${variableQualifier} <- ${baseName}`;
388
+ // For root data access, use the dataKey (original call signature or canonical key)
389
+ // This preserves the original call signature for LLM clarity
390
+ if (isRootAccess) {
391
+ // For call signature format, use the original mockName as the data key
392
+ // e.g., scenarios().data()?.["useFetcher<User>()"]
393
+ // e.g., scenarios().data()?.["db.select(usersQuery)"]
394
+ return `?.["${dataKey.replace(/\n/g, '\\n')}"]`;
297
395
  }
298
396
  // Only use unquoted array access syntax for pure array indices like [0], [1]
299
- // NOT for variable-qualified names like "fetcher[1] <- useFetcher" which need quotes
300
- if (name.match(/^\[\d+\]$/) && !name.includes(' <- ')) {
397
+ if (name.match(/^\[\d+\]$/)) {
301
398
  return `?.${name}`;
302
399
  }
303
400
  return `?.["${name.replace(/\n/g, '\\n')}"]`;
@@ -499,9 +596,17 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
499
596
  // When GENERIC array (using []) has nested content (like functions that need wrapping),
500
597
  // use .map() to transform ALL elements instead of just creating [0]
501
598
  // For DIFFERENTIATED arrays (using [0], [1], etc.), keep the static array structure
599
+ //
600
+ // IMPORTANT: If the nested content contains differentiated indices like [0], [1],
601
+ // we MUST use static array pattern, not .map(). The presence of differentiated
602
+ // indices means the array elements have different types/structures, so .map()
603
+ // would generate invalid code trying to treat them uniformly.
604
+ const hasDifferentiatedIndices = nested &&
605
+ nested.some((n) => n.name.match(/^\[\d+\]$/) && n.name !== '[0]');
502
606
  if (isGenericArray &&
503
607
  nestedContent.length > 0 &&
504
- dataPaths.length > 0) {
608
+ dataPaths.length > 0 &&
609
+ !hasDifferentiatedIndices) {
505
610
  // Get the array base path (without the [0])
506
611
  const arrayBasePath = dataPaths[0].replace(/\?\.\[0\]$/, '');
507
612
  // Replace [0] references with [__idx__] in level contents
@@ -531,6 +636,12 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
531
636
  if (args && args.length > 0) {
532
637
  if (!isValidKey(name))
533
638
  return;
639
+ // Skip array index patterns like [], [0], [1] when they have args
640
+ // These represent function calls on array elements, not property keys
641
+ // e.g., customSizes[].(args) means each array element is callable, not a property named "[]"
642
+ if (name.match(/^\[\d*\]$/)) {
643
+ return;
644
+ }
534
645
  const mostArgs = args.sort((a, b) => b.length - a.length)[0];
535
646
  const argsString = mostArgs
536
647
  .map((_, index) => `arg${index + 1}`)
@@ -570,8 +681,19 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
570
681
  fallbackContent = `return ${returnValueContents}`;
571
682
  }
572
683
  else {
573
- // Use all paths as fallback for unknown arguments
574
- fallbackContent = `return ${returnValueContents}`;
684
+ // No explicit fallback paths - return the first literal's value as default
685
+ // Returning spread of all values is dangerous because if values are primitives (strings),
686
+ // spreading them creates objects with numeric keys like {0:'a', 1:'b', ...}
687
+ // which causes "Objects are not valid as React child" errors
688
+ const firstLiteralValue = literalKeys[0];
689
+ const firstGroupPaths = argGroups.get(firstLiteralValue);
690
+ if (firstGroupPaths && firstGroupPaths.length === 1) {
691
+ fallbackContent = `return ${firstGroupPaths[0]}`;
692
+ }
693
+ else {
694
+ // Multiple paths for first literal - return undefined as safe fallback
695
+ fallbackContent = `return undefined`;
696
+ }
575
697
  }
576
698
  const funcContents = conditionalBranches.join('\n') +
577
699
  '\n// Fallback for unmatched arguments\n' +
@@ -653,8 +775,8 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
653
775
  parts.splice(i, 1);
654
776
  }
655
777
  }
656
- // For variable-qualified mocks like "revalidator <- useRevalidator",
657
- // compare against baseMockName ("useRevalidator"), not the full mockName
778
+ // Compare against baseMockName (without generics/args), not the full mockName
779
+ // e.g., for "useFetcher<User>()", baseMockName is "useFetcher"
658
780
  if (parts[0].split('(')[0] !== baseMockName)
659
781
  continue;
660
782
  // Include paths with functionCallReturnValue OR function-typed paths that need mocking
@@ -1047,16 +1169,17 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1047
1169
  // For headers() and cookies() from next/headers, add common iterator methods
1048
1170
  // These are needed when the mock is passed to functions that use .entries(), .keys(), etc.
1049
1171
  // (e.g., Object.fromEntries(headers.entries()) in buildLegacyHeaders)
1050
- const needsIteratorMethods = mockName === 'headers' || mockName === 'cookies';
1172
+ const needsIteratorMethods = baseMockName === 'headers' || baseMockName === 'cookies';
1051
1173
  let enhancedContents = contents;
1052
1174
  if (needsIteratorMethods && contents.trim().startsWith('{')) {
1053
1175
  // Add iterator methods that operate on the scenario data
1176
+ // Use the dataKey (original call signature or canonical key)
1054
1177
  const iteratorMethods = `,
1055
- entries: () => Object.entries(scenarios().data()?.["${mockName}()"] || {}),
1056
- keys: () => Object.keys(scenarios().data()?.["${mockName}()"] || {}),
1057
- values: () => Object.values(scenarios().data()?.["${mockName}()"] || {}),
1058
- forEach: (fn) => Object.entries(scenarios().data()?.["${mockName}()"] || {}).forEach(([k, v]) => fn(v, k)),
1059
- has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${mockName}()"] || {}, key)`;
1178
+ entries: () => Object.entries(scenarios().data()?.["${dataKey}"] || {}),
1179
+ keys: () => Object.keys(scenarios().data()?.["${dataKey}"] || {}),
1180
+ values: () => Object.values(scenarios().data()?.["${dataKey}"] || {}),
1181
+ forEach: (fn) => Object.entries(scenarios().data()?.["${dataKey}"] || {}).forEach(([k, v]) => fn(v, k)),
1182
+ has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${dataKey}"] || {}, key)`;
1060
1183
  // Insert before the closing brace (handle trailing whitespace)
1061
1184
  enhancedContents = contents.replace(/\}\s*$/, iteratorMethods + '\n}');
1062
1185
  }
@@ -1066,36 +1189,103 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1066
1189
  // `new ClassName("arg")` wouldn't create the expected instance.
1067
1190
  // For Error subclasses (detected by name ending in "Error"), extend Error for proper error handling.
1068
1191
  if (entityType === 'class') {
1069
- const isErrorSubclass = mockName.endsWith('Error');
1070
- const baseClass = isErrorSubclass ? 'Error' : 'Object';
1192
+ const isErrorSubclass = baseMockName.endsWith('Error');
1071
1193
  const superCall = isErrorSubclass ? 'super(message);' : '';
1072
1194
  const nameAssignment = isErrorSubclass
1073
- ? `this.name = '${mockName}';`
1195
+ ? `this.name = '${baseMockName}';`
1074
1196
  : '';
1075
- return `class ${mockName}${isErrorSubclass ? ' extends Error' : ''} {
1197
+ // Use the safe function name for the class definition
1198
+ const className = mockNameIsCallSignature
1199
+ ? derivedFunctionName
1200
+ : baseMockName;
1201
+ return `class ${className}${isErrorSubclass ? ' extends Error' : ''} {
1076
1202
  constructor(message) {
1077
1203
  ${superCall}
1078
1204
  ${nameAssignment}
1079
- Object.assign(this, scenarios().data()?.["${mockName}()"] || {});
1205
+ Object.assign(this, scenarios().data()?.["${dataKey}"] || {});
1080
1206
  }
1081
1207
  }`;
1082
1208
  }
1083
- // For variable-qualified mocks, use underscore separator in the function name
1084
- // e.g., "entityDiffFetcher <- useFetcher" becomes "useFetcher_entityDiffFetcher"
1085
- // For indexed qualifiers like "data[1]", convert to safe identifier: "useFetcher_data_1"
1086
- // EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
1087
- const safeFunctionName = variableQualifier && !options?.keepOriginalFunctionName
1088
- ? `${baseMockName}_${safeVariableQualifier(variableQualifier)}`
1089
- : baseMockName;
1090
- return `const ${safeFunctionName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}() {\n${indent(`return ${safeFunctionName}ReturnValue;`)}\n}`;
1209
+ // Generate safe function name:
1210
+ // 1. For call signatures: use derivedFunctionName
1211
+ // e.g., "useFetcher<User>()" becomes "useFetcher_User"
1212
+ // e.g., "db.select(usersQuery)" becomes "db_select_usersQuery"
1213
+ // 2. With uniqueFunctionSuffix option: append suffix for unique naming
1214
+ // e.g., baseMockName = "useFetcher", suffix = "entityDiffFetcher" -> "useFetcher_entityDiffFetcher"
1215
+ // 3. EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
1216
+ let safeFunctionName;
1217
+ if (options?.keepOriginalFunctionName) {
1218
+ safeFunctionName = baseMockName;
1219
+ }
1220
+ else if (options?.uniqueFunctionSuffix) {
1221
+ safeFunctionName = `${baseMockName}_${options.uniqueFunctionSuffix}`;
1222
+ }
1223
+ else if (mockNameIsCallSignature && derivedFunctionName) {
1224
+ safeFunctionName = derivedFunctionName;
1225
+ }
1226
+ else {
1227
+ safeFunctionName = baseMockName;
1228
+ }
1229
+ // Check if this function returns a function (detected by double-call pattern: mockName(args)())
1230
+ // This happens when the schema has keys like "wrapThrows(() => JSON.parse(savedFilters))()"
1231
+ // where the function call is immediately followed by another call.
1232
+ // Example usage: const result = wrapThrows(() => JSON.parse(x))(); // double call
1233
+ const isHigherOrderFunction = Object.keys(relevantReturnValueSchema ?? {}).some((key) => {
1234
+ if (!key.startsWith(baseMockName))
1235
+ return false;
1236
+ // Find the first ( after baseMockName (the start of the function call)
1237
+ const firstOpenParen = key.indexOf('(', baseMockName.length);
1238
+ if (firstOpenParen === -1)
1239
+ return false;
1240
+ // Skip if the ( is not immediately after the mock name
1241
+ // (there might be type params like func<T>() - handle by checking for < or ()
1242
+ const between = key.slice(baseMockName.length, firstOpenParen);
1243
+ if (between.length > 0 && !between.startsWith('<'))
1244
+ return false;
1245
+ // Find the matching ) for the first ( using depth counting
1246
+ let depth = 1;
1247
+ let i = firstOpenParen + 1;
1248
+ while (i < key.length && depth > 0) {
1249
+ if (key[i] === '(')
1250
+ depth++;
1251
+ if (key[i] === ')')
1252
+ depth--;
1253
+ i++;
1254
+ }
1255
+ if (depth !== 0)
1256
+ return false; // Unbalanced parentheses
1257
+ // Now i points just after the matching )
1258
+ // Check if there's another ( immediately (indicating double call)
1259
+ const remaining = key.slice(i);
1260
+ if (remaining.startsWith('('))
1261
+ return true;
1262
+ return false;
1263
+ });
1264
+ // For higher-order functions, wrap the return in an arrow function
1265
+ // so that mockFunc(arg)() works correctly (outer call returns a function, inner call gets the data)
1266
+ const returnValue = isHigherOrderFunction
1267
+ ? `() => ${safeFunctionName}ReturnValue`
1268
+ : `${safeFunctionName}ReturnValue`;
1269
+ return `const ${safeFunctionName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}() {\n${indent(`return ${returnValue};`)}\n}`;
1091
1270
  }
1092
1271
  else {
1093
- // For variable-qualified mocks, use underscore separator in the const name
1094
- // For indexed qualifiers like "data[1]", convert to safe identifier: "useFetcher_data_1"
1095
- // EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
1096
- const safeName = variableQualifier && !options?.keepOriginalFunctionName
1097
- ? `${baseMockName}_${safeVariableQualifier(variableQualifier)}`
1098
- : baseMockName;
1272
+ // Generate safe const name:
1273
+ // 1. For call signatures: use derivedFunctionName
1274
+ // 2. With uniqueFunctionSuffix option: append suffix for unique naming
1275
+ // 3. EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
1276
+ let safeName;
1277
+ if (options?.keepOriginalFunctionName) {
1278
+ safeName = baseMockName;
1279
+ }
1280
+ else if (options?.uniqueFunctionSuffix) {
1281
+ safeName = `${baseMockName}_${options.uniqueFunctionSuffix}`;
1282
+ }
1283
+ else if (mockNameIsCallSignature && derivedFunctionName) {
1284
+ safeName = derivedFunctionName;
1285
+ }
1286
+ else {
1287
+ safeName = baseMockName;
1288
+ }
1099
1289
  // Get any jsx-component properties that need to be preserved from the original
1100
1290
  const jsxProperties = getJsxComponentProperties(mockName, relevantReturnValueSchema);
1101
1291
  // If there are jsx-component properties, add them as references to the original