@codeyam/codeyam-cli 0.1.0-staging.596f0eb → 0.1.0-staging.6e699e5

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 (696) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/common/execAsync.ts +1 -1
  3. package/analyzer-template/log.txt +3 -3
  4. package/analyzer-template/package.json +10 -6
  5. package/analyzer-template/packages/ai/index.ts +10 -3
  6. package/analyzer-template/packages/ai/package.json +1 -1
  7. package/analyzer-template/packages/ai/src/lib/__mocks__/completionCall.ts +122 -0
  8. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +128 -6
  9. package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
  10. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +138 -1
  11. package/analyzer-template/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.ts +644 -0
  12. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +140 -6
  13. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.ts +18 -0
  14. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +38 -1
  15. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +181 -1
  16. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +1239 -104
  17. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +304 -0
  18. package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +29 -10
  19. package/analyzer-template/packages/ai/src/lib/completionCall.ts +216 -36
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1501 -138
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +2 -1
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +976 -0
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +243 -77
  24. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +19 -1
  25. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +103 -6
  26. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +23 -0
  27. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -0
  28. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +42 -2
  29. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
  30. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
  31. package/analyzer-template/packages/ai/src/lib/deepEqual.ts +30 -0
  32. package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
  33. package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
  34. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +74 -7
  35. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +89 -112
  36. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +6 -0
  37. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +1111 -91
  38. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +207 -104
  39. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +570 -0
  40. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +528 -0
  41. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1977 -0
  42. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
  43. package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +143 -31
  44. package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +8 -2
  45. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +276 -3
  46. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +33 -3
  47. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +7 -0
  48. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +1 -1
  49. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +32 -102
  50. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
  51. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
  52. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +90 -6
  53. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +14 -53
  54. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.ts +58 -0
  55. package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +28 -2
  56. package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
  57. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +812 -0
  58. package/analyzer-template/packages/ai/src/lib/splitOutsideParentheses.ts +5 -1
  59. package/analyzer-template/packages/ai/src/lib/validateExecutionFlowPaths.ts +531 -0
  60. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +123 -0
  61. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +8 -1
  62. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +14 -0
  63. package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
  64. package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +1 -0
  65. package/analyzer-template/packages/analyze/src/lib/asts/nodes/isAsyncFunction.ts +67 -0
  66. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +455 -267
  67. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +18 -0
  68. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +3 -0
  69. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -7
  70. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +31 -15
  71. package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +11 -7
  72. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +11 -12
  73. package/analyzer-template/packages/analyze/src/lib/files/enums/steps.ts +1 -1
  74. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +265 -0
  75. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.ts +102 -0
  76. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +588 -52
  77. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.ts +1 -1
  78. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.ts +28 -62
  79. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +336 -133
  80. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +156 -0
  81. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +78 -83
  82. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +4 -8
  83. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +461 -94
  84. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
  85. package/analyzer-template/packages/aws/codebuild/index.ts +1 -0
  86. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts +11 -1
  87. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts.map +1 -1
  88. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js +29 -18
  89. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js.map +1 -1
  90. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts +2 -2
  91. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts.map +1 -1
  92. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js +2 -2
  93. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  94. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts +8 -18
  95. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts.map +1 -1
  96. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js +17 -61
  97. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  98. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts +15 -0
  99. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts.map +1 -0
  100. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js +31 -0
  101. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js.map +1 -0
  102. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.d.ts.map +1 -1
  103. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js +8 -1
  104. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js.map +1 -1
  105. package/analyzer-template/packages/aws/package.json +3 -3
  106. package/analyzer-template/packages/aws/s3/index.ts +1 -0
  107. package/analyzer-template/packages/aws/src/lib/codebuild/waitForBuild.ts +43 -19
  108. package/analyzer-template/packages/aws/src/lib/ecs/ecsDefineContainer.ts +3 -3
  109. package/analyzer-template/packages/aws/src/lib/ecs/ecsTaskFactory.ts +17 -69
  110. package/analyzer-template/packages/aws/src/lib/s3/checkS3ObjectExists.ts +47 -0
  111. package/analyzer-template/packages/aws/src/lib/s3/uploadFileToS3.ts +8 -1
  112. package/analyzer-template/packages/database/src/lib/kysely/db.ts +4 -4
  113. package/analyzer-template/packages/database/src/lib/kysely/tableRelations.ts +2 -2
  114. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +36 -9
  115. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +7 -3
  116. package/analyzer-template/packages/generate/index.ts +3 -0
  117. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +17 -1
  118. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +193 -0
  119. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.ts +73 -0
  120. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +9 -4
  121. package/analyzer-template/packages/generate/src/lib/deepMerge.ts +26 -1
  122. package/analyzer-template/packages/generate/src/lib/scenarioComponentForServer.ts +114 -0
  123. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -2
  124. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +2 -2
  125. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tableRelations.d.ts +2 -2
  126. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts +1 -11
  127. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  128. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +30 -7
  129. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -1
  130. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  131. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  132. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts +1 -0
  133. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts.map +1 -1
  134. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +2 -6
  135. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  136. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  137. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +7 -4
  138. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  139. package/analyzer-template/packages/github/dist/generate/index.d.ts +3 -0
  140. package/analyzer-template/packages/github/dist/generate/index.d.ts.map +1 -1
  141. package/analyzer-template/packages/github/dist/generate/index.js +3 -0
  142. package/analyzer-template/packages/github/dist/generate/index.js.map +1 -1
  143. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
  144. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  145. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  146. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts +9 -0
  147. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -0
  148. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
  149. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  150. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts +20 -0
  151. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts.map +1 -0
  152. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  153. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  154. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  155. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  156. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  157. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.d.ts.map +1 -1
  158. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js +27 -1
  159. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js.map +1 -1
  160. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts +8 -0
  161. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts.map +1 -0
  162. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js +89 -0
  163. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  164. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.d.ts.map +1 -1
  165. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js +10 -0
  166. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js.map +1 -1
  167. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.d.ts.map +1 -1
  168. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js +3 -0
  169. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js.map +1 -1
  170. package/analyzer-template/packages/github/dist/types/index.d.ts +2 -2
  171. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  172. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  173. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +87 -13
  174. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  175. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts +2 -0
  176. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts.map +1 -1
  177. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +11 -6
  178. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  179. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +196 -0
  180. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  181. package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts +2 -0
  182. package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts.map +1 -1
  183. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  184. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  185. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  186. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
  187. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  188. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
  189. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
  190. package/analyzer-template/packages/github/src/lib/loadOrCreateCommit.ts +14 -0
  191. package/analyzer-template/packages/github/src/lib/syncPrimaryBranch.ts +2 -0
  192. package/analyzer-template/packages/process/index.ts +2 -0
  193. package/analyzer-template/packages/process/package.json +12 -0
  194. package/analyzer-template/packages/process/tsconfig.json +8 -0
  195. package/analyzer-template/packages/types/index.ts +5 -0
  196. package/analyzer-template/packages/types/src/types/Analysis.ts +104 -13
  197. package/analyzer-template/packages/types/src/types/Entity.ts +2 -0
  198. package/analyzer-template/packages/types/src/types/Scenario.ts +11 -10
  199. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +224 -0
  200. package/analyzer-template/packages/types/src/types/StatementInfo.ts +2 -0
  201. package/analyzer-template/packages/ui-components/src/components/ScenarioDetailInteractiveView.tsx +23 -7
  202. package/analyzer-template/packages/utils/dist/types/index.d.ts +2 -2
  203. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  204. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  205. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +87 -13
  206. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  207. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts +2 -0
  208. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts.map +1 -1
  209. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +11 -6
  210. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  211. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +196 -0
  212. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  213. package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts +2 -0
  214. package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts.map +1 -1
  215. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  216. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  217. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  218. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
  219. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  220. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
  221. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
  222. package/analyzer-template/packages/utils/src/lib/lightweightEntityExtractor.ts +27 -0
  223. package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
  224. package/analyzer-template/playwright/capture.ts +37 -18
  225. package/analyzer-template/playwright/getCodeYamInfo.ts +12 -7
  226. package/analyzer-template/playwright/takeElementScreenshot.ts +26 -11
  227. package/analyzer-template/playwright/takeScreenshot.ts +9 -7
  228. package/analyzer-template/playwright/waitForServer.ts +21 -6
  229. package/analyzer-template/project/analyzeBaselineCommit.ts +4 -0
  230. package/analyzer-template/project/analyzeBranchCommit.ts +4 -0
  231. package/analyzer-template/project/analyzeFileEntities.ts +4 -0
  232. package/analyzer-template/project/analyzeRegularCommit.ts +4 -0
  233. package/analyzer-template/project/constructMockCode.ts +1181 -160
  234. package/analyzer-template/project/controller/startController.ts +16 -1
  235. package/analyzer-template/project/executeLibraryFunctionDirect.ts +7 -3
  236. package/analyzer-template/project/mocks/analyzeFileMock.ts +8 -7
  237. package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +3 -6
  238. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +82 -36
  239. package/analyzer-template/project/orchestrateCapture.ts +36 -3
  240. package/analyzer-template/project/reconcileMockDataKeys.ts +245 -2
  241. package/analyzer-template/project/runAnalysis.ts +11 -0
  242. package/analyzer-template/project/runMultiScenarioServer.ts +11 -10
  243. package/analyzer-template/project/serverOnlyModules.ts +194 -21
  244. package/analyzer-template/project/start.ts +26 -4
  245. package/analyzer-template/project/startScenarioCapture.ts +79 -41
  246. package/analyzer-template/project/writeMockDataTsx.ts +232 -57
  247. package/analyzer-template/project/writeScenarioClientWrapper.ts +21 -0
  248. package/analyzer-template/project/writeScenarioComponents.ts +769 -181
  249. package/analyzer-template/project/writeScenarioFiles.ts +26 -0
  250. package/analyzer-template/project/writeSimpleRoot.ts +13 -15
  251. package/analyzer-template/scripts/comboWorkerLoop.cjs +1 -0
  252. package/analyzer-template/scripts/defaultCmd.sh +9 -0
  253. package/analyzer-template/tsconfig.json +2 -1
  254. package/background/src/lib/local/createLocalAnalyzer.js +1 -29
  255. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  256. package/background/src/lib/local/execAsync.js +1 -1
  257. package/background/src/lib/local/execAsync.js.map +1 -1
  258. package/background/src/lib/virtualized/common/execAsync.js +1 -1
  259. package/background/src/lib/virtualized/common/execAsync.js.map +1 -1
  260. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +2 -1
  261. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  262. package/background/src/lib/virtualized/project/analyzeBranchCommit.js +2 -1
  263. package/background/src/lib/virtualized/project/analyzeBranchCommit.js.map +1 -1
  264. package/background/src/lib/virtualized/project/analyzeFileEntities.js +2 -1
  265. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  266. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +2 -1
  267. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  268. package/background/src/lib/virtualized/project/constructMockCode.js +1053 -124
  269. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  270. package/background/src/lib/virtualized/project/controller/startController.js +11 -1
  271. package/background/src/lib/virtualized/project/controller/startController.js.map +1 -1
  272. package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js +6 -3
  273. package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js.map +1 -1
  274. package/background/src/lib/virtualized/project/mocks/analyzeFileMock.js +7 -7
  275. package/background/src/lib/virtualized/project/mocks/analyzeFileMock.js.map +1 -1
  276. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js +3 -2
  277. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js.map +1 -1
  278. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +69 -32
  279. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  280. package/background/src/lib/virtualized/project/orchestrateCapture.js +27 -4
  281. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  282. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +204 -2
  283. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  284. package/background/src/lib/virtualized/project/runAnalysis.js +9 -0
  285. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  286. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +11 -9
  287. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  288. package/background/src/lib/virtualized/project/serverOnlyModules.js +163 -23
  289. package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -1
  290. package/background/src/lib/virtualized/project/start.js +21 -4
  291. package/background/src/lib/virtualized/project/start.js.map +1 -1
  292. package/background/src/lib/virtualized/project/startScenarioCapture.js +61 -31
  293. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  294. package/background/src/lib/virtualized/project/writeMockDataTsx.js +199 -50
  295. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  296. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js +15 -0
  297. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js.map +1 -0
  298. package/background/src/lib/virtualized/project/writeScenarioComponents.js +552 -125
  299. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  300. package/background/src/lib/virtualized/project/writeScenarioFiles.js +19 -0
  301. package/background/src/lib/virtualized/project/writeScenarioFiles.js.map +1 -1
  302. package/background/src/lib/virtualized/project/writeSimpleRoot.js +13 -13
  303. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  304. package/codeyam-cli/src/cli.js +7 -1
  305. package/codeyam-cli/src/cli.js.map +1 -1
  306. package/codeyam-cli/src/commands/analyze.js +1 -1
  307. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  308. package/codeyam-cli/src/commands/baseline.js +174 -0
  309. package/codeyam-cli/src/commands/baseline.js.map +1 -0
  310. package/codeyam-cli/src/commands/debug.js +40 -18
  311. package/codeyam-cli/src/commands/debug.js.map +1 -1
  312. package/codeyam-cli/src/commands/default.js +0 -15
  313. package/codeyam-cli/src/commands/default.js.map +1 -1
  314. package/codeyam-cli/src/commands/recapture.js +226 -0
  315. package/codeyam-cli/src/commands/recapture.js.map +1 -0
  316. package/codeyam-cli/src/commands/report.js +72 -24
  317. package/codeyam-cli/src/commands/report.js.map +1 -1
  318. package/codeyam-cli/src/commands/start.js +8 -12
  319. package/codeyam-cli/src/commands/start.js.map +1 -1
  320. package/codeyam-cli/src/commands/status.js +23 -1
  321. package/codeyam-cli/src/commands/status.js.map +1 -1
  322. package/codeyam-cli/src/commands/test-startup.js +1 -1
  323. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  324. package/codeyam-cli/src/commands/wipe.js +108 -0
  325. package/codeyam-cli/src/commands/wipe.js.map +1 -0
  326. package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js +81 -0
  327. package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js.map +1 -0
  328. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +31 -27
  329. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  330. package/codeyam-cli/src/utils/analysisRunner.js +8 -13
  331. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  332. package/codeyam-cli/src/utils/backgroundServer.js +14 -4
  333. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  334. package/codeyam-cli/src/utils/database.js +91 -5
  335. package/codeyam-cli/src/utils/database.js.map +1 -1
  336. package/codeyam-cli/src/utils/generateReport.js +253 -106
  337. package/codeyam-cli/src/utils/generateReport.js.map +1 -1
  338. package/codeyam-cli/src/utils/git.js +79 -0
  339. package/codeyam-cli/src/utils/git.js.map +1 -0
  340. package/codeyam-cli/src/utils/install-skills.js +31 -17
  341. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  342. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +38 -0
  343. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  344. package/codeyam-cli/src/utils/queue/job.js +245 -16
  345. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  346. package/codeyam-cli/src/utils/queue/manager.js +25 -7
  347. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  348. package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
  349. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  350. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +7 -5
  351. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  352. package/codeyam-cli/src/utils/versionInfo.js +25 -19
  353. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  354. package/codeyam-cli/src/utils/wipe.js +128 -0
  355. package/codeyam-cli/src/utils/wipe.js.map +1 -0
  356. package/codeyam-cli/src/webserver/app/lib/database.js +98 -1
  357. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  358. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  359. package/codeyam-cli/src/webserver/backgroundServer.js +5 -10
  360. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  361. package/codeyam-cli/src/webserver/bootstrap.js +49 -0
  362. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -0
  363. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BXhEawa3.js +1 -0
  364. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-efWKDYMr.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
  365. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-Ba2JVPzP.js +41 -0
  366. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C8lyxW9k.js +34 -0
  367. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-aht4aafF.js +25 -0
  368. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CVtiBnY5.js +3 -0
  369. package/codeyam-cli/src/webserver/build/client/assets/LoadingDots-B0GLXMsr.js +6 -0
  370. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-xgeCVgSM.js +3 -0
  371. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-D4TZhLuw.js +21 -0
  372. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DuDvi0jm.js +1 -0
  373. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-DEx02QDa.js +10 -0
  374. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-COPstp9J.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
  375. package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
  376. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-DoLIqZX2.js +37 -0
  377. package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
  378. package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
  379. package/codeyam-cli/src/webserver/build/client/assets/api.rules-l0sNRNKZ.js +1 -0
  380. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-Cx24_aWc.js +6 -0
  381. package/codeyam-cli/src/webserver/build/client/assets/chunk-EPOLDU6W-CXRTFQ3F.js +51 -0
  382. package/codeyam-cli/src/webserver/build/client/assets/circle-check-BOARzkeR.js +6 -0
  383. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BdhJEx6B.js +21 -0
  384. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-C1gnJVOL.svg → cy-logo-cli-CCKUIm0S.svg} +2 -2
  385. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +1 -0
  386. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BRb-0kQl.js +1 -0
  387. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-C2N4Op8e.js +23 -0
  388. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js +6 -0
  389. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D1T4TGjf.js +6 -0
  390. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-CTBG2mmz.js +5 -0
  391. package/codeyam-cli/src/webserver/build/client/assets/entry.client-CS2cb_eZ.js +29 -0
  392. package/codeyam-cli/src/webserver/build/client/assets/executionFlowCoverage-BWhdfn70.js +1 -0
  393. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DMJ7zii9.js +1 -0
  394. package/codeyam-cli/src/webserver/build/client/assets/files-Cs4MdYtv.js +1 -0
  395. package/codeyam-cli/src/webserver/build/client/assets/git-B4RJRvYB.js +15 -0
  396. package/codeyam-cli/src/webserver/build/client/assets/git-commit-horizontal-CysbcZxi.js +6 -0
  397. package/codeyam-cli/src/webserver/build/client/assets/globals-DMUaGAqV.css +1 -0
  398. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-fmIEn3Bc.js +9 -0
  399. package/codeyam-cli/src/webserver/build/client/assets/index-B1h680n5.js +9 -0
  400. package/codeyam-cli/src/webserver/build/client/assets/index-lzqtyFU8.js +3 -0
  401. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-B7B9V-bu.js +6 -0
  402. package/codeyam-cli/src/webserver/build/client/assets/manifest-f874c610.js +1 -0
  403. package/codeyam-cli/src/webserver/build/client/assets/preload-helper-ckwbz45p.js +1 -0
  404. package/codeyam-cli/src/webserver/build/client/assets/root-Bz5TunQg.js +57 -0
  405. package/codeyam-cli/src/webserver/build/client/assets/rules-hEkvVw2-.js +97 -0
  406. package/codeyam-cli/src/webserver/build/client/assets/scenarioStatus-B_8jpV3e.js +1 -0
  407. package/codeyam-cli/src/webserver/build/client/assets/search-CxXUmBSd.js +6 -0
  408. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +1 -0
  409. package/codeyam-cli/src/webserver/build/client/assets/simulations-DwFIBT09.js +1 -0
  410. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-B6LgvRJg.js +6 -0
  411. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-C1v1PQzo.js +1 -0
  412. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-3pmpUQB-.js → useLastLogLine-aSv48UbS.js} +1 -1
  413. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DYxHZQuP.js +1 -0
  414. package/codeyam-cli/src/webserver/build/client/assets/{useToast-DEyawJ8r.js → useToast-mBRpZPiu.js} +1 -1
  415. package/codeyam-cli/src/webserver/build/server/assets/index-967OuJoF.js +1 -0
  416. package/codeyam-cli/src/webserver/build/server/assets/server-build-DRTmerg9.js +257 -0
  417. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  418. package/codeyam-cli/src/webserver/build-info.json +5 -5
  419. package/codeyam-cli/src/webserver/devServer.js +1 -3
  420. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  421. package/codeyam-cli/src/webserver/server.js +35 -25
  422. package/codeyam-cli/src/webserver/server.js.map +1 -1
  423. package/codeyam-cli/templates/codeyam-power-rules-hook.sh +200 -0
  424. package/codeyam-cli/templates/{codeyam-debug-skill.md → codeyam:debug.md} +48 -4
  425. package/codeyam-cli/templates/codeyam:diagnose.md +650 -0
  426. package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
  427. package/codeyam-cli/templates/codeyam:power-rules.md +447 -0
  428. package/codeyam-cli/templates/{codeyam-setup-skill.md → codeyam:setup.md} +139 -4
  429. package/codeyam-cli/templates/{codeyam-sim-skill.md → codeyam:sim.md} +1 -1
  430. package/codeyam-cli/templates/{codeyam-test-skill.md → codeyam:test.md} +1 -1
  431. package/codeyam-cli/templates/{codeyam-verify-skill.md → codeyam:verify.md} +1 -1
  432. package/package.json +17 -16
  433. package/packages/ai/index.js +5 -4
  434. package/packages/ai/index.js.map +1 -1
  435. package/packages/ai/src/lib/analyzeScope.js +99 -0
  436. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  437. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
  438. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
  439. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +100 -1
  440. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  441. package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js +435 -0
  442. package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js.map +1 -0
  443. package/packages/ai/src/lib/astScopes/methodSemantics.js +97 -6
  444. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  445. package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js +8 -0
  446. package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js.map +1 -1
  447. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +23 -0
  448. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
  449. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +138 -1
  450. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
  451. package/packages/ai/src/lib/astScopes/processExpression.js +945 -87
  452. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  453. package/packages/ai/src/lib/checkAllAttributes.js +24 -9
  454. package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
  455. package/packages/ai/src/lib/completionCall.js +178 -31
  456. package/packages/ai/src/lib/completionCall.js.map +1 -1
  457. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1198 -82
  458. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  459. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +2 -1
  460. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  461. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +661 -0
  462. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -0
  463. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +180 -56
  464. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  465. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +16 -1
  466. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  467. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +86 -4
  468. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  469. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +20 -0
  470. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  471. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js +86 -0
  472. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js.map +1 -0
  473. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +34 -3
  474. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  475. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
  476. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
  477. package/packages/ai/src/lib/dataStructureChunking.js +111 -0
  478. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
  479. package/packages/ai/src/lib/deepEqual.js +32 -0
  480. package/packages/ai/src/lib/deepEqual.js.map +1 -0
  481. package/packages/ai/src/lib/e2eDataTracking.js +241 -0
  482. package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
  483. package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
  484. package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
  485. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +62 -5
  486. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  487. package/packages/ai/src/lib/generateChangesEntityScenarios.js +81 -90
  488. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  489. package/packages/ai/src/lib/generateEntityDataStructure.js +5 -0
  490. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  491. package/packages/ai/src/lib/generateEntityScenarioData.js +904 -84
  492. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  493. package/packages/ai/src/lib/generateEntityScenarios.js +186 -82
  494. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  495. package/packages/ai/src/lib/generateExecutionFlows.js +392 -0
  496. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -0
  497. package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js +380 -0
  498. package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js.map +1 -0
  499. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +1440 -0
  500. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -0
  501. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
  502. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
  503. package/packages/ai/src/lib/getConditionalUsagesFromCode.js +84 -14
  504. package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
  505. package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -1
  506. package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
  507. package/packages/ai/src/lib/isolateScopes.js +231 -4
  508. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  509. package/packages/ai/src/lib/mergeStatements.js +26 -3
  510. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  511. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +6 -0
  512. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  513. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +1 -1
  514. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
  515. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +21 -64
  516. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  517. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
  518. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
  519. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +68 -6
  520. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  521. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +10 -34
  522. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  523. package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js +45 -0
  524. package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js.map +1 -0
  525. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +16 -3
  526. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js.map +1 -1
  527. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
  528. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
  529. package/packages/ai/src/lib/resolvePathToControllable.js +667 -0
  530. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -0
  531. package/packages/ai/src/lib/splitOutsideParentheses.js +3 -1
  532. package/packages/ai/src/lib/splitOutsideParentheses.js.map +1 -1
  533. package/packages/ai/src/lib/worker/SerializableDataStructure.js +29 -0
  534. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  535. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +4 -0
  536. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  537. package/packages/analyze/src/lib/FileAnalyzer.js +15 -0
  538. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  539. package/packages/analyze/src/lib/analysisContext.js +30 -5
  540. package/packages/analyze/src/lib/analysisContext.js.map +1 -1
  541. package/packages/analyze/src/lib/asts/nodes/index.js +1 -0
  542. package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
  543. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js +52 -0
  544. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js.map +1 -0
  545. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +218 -50
  546. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  547. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +10 -0
  548. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  549. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +2 -0
  550. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  551. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -7
  552. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  553. package/packages/analyze/src/lib/files/analyzeChange.js +21 -11
  554. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  555. package/packages/analyze/src/lib/files/analyzeEntity.js +9 -8
  556. package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
  557. package/packages/analyze/src/lib/files/analyzeInitial.js +9 -10
  558. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  559. package/packages/analyze/src/lib/files/enums/steps.js +1 -1
  560. package/packages/analyze/src/lib/files/enums/steps.js.map +1 -1
  561. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +209 -0
  562. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -0
  563. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js +85 -0
  564. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js.map +1 -0
  565. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +458 -48
  566. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  567. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js +1 -1
  568. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js.map +1 -1
  569. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js +29 -34
  570. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js.map +1 -1
  571. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +264 -78
  572. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  573. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +96 -0
  574. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -0
  575. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +56 -69
  576. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  577. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +4 -8
  578. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
  579. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +372 -89
  580. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  581. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
  582. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  583. package/packages/aws/src/lib/ecs/ecsDefineContainer.js +2 -2
  584. package/packages/aws/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  585. package/packages/aws/src/lib/ecs/ecsTaskFactory.js +17 -61
  586. package/packages/aws/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  587. package/packages/database/src/lib/kysely/db.js +2 -2
  588. package/packages/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  589. package/packages/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  590. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +7 -4
  591. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  592. package/packages/generate/index.js +3 -0
  593. package/packages/generate/index.js.map +1 -1
  594. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  595. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  596. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
  597. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  598. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  599. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  600. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  601. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  602. package/packages/generate/src/lib/deepMerge.js +27 -1
  603. package/packages/generate/src/lib/deepMerge.js.map +1 -1
  604. package/packages/generate/src/lib/scenarioComponentForServer.js +89 -0
  605. package/packages/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  606. package/packages/github/src/lib/loadOrCreateCommit.js +10 -0
  607. package/packages/github/src/lib/loadOrCreateCommit.js.map +1 -1
  608. package/packages/github/src/lib/syncPrimaryBranch.js +3 -0
  609. package/packages/github/src/lib/syncPrimaryBranch.js.map +1 -1
  610. package/packages/process/index.js +3 -0
  611. package/packages/process/index.js.map +1 -0
  612. package/packages/process/src/GlobalProcessManager.js.map +1 -0
  613. package/{background/src/lib/process → packages/process/src}/ProcessManager.js +1 -1
  614. package/packages/process/src/ProcessManager.js.map +1 -0
  615. package/packages/process/src/index.js.map +1 -0
  616. package/packages/process/src/managedExecAsync.js.map +1 -0
  617. package/packages/types/index.js.map +1 -1
  618. package/packages/utils/src/lib/lightweightEntityExtractor.js +25 -0
  619. package/packages/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  620. package/packages/utils/src/lib/safeFileName.js +29 -3
  621. package/packages/utils/src/lib/safeFileName.js.map +1 -1
  622. package/scripts/finalize-analyzer.cjs +6 -4
  623. package/analyzer-template/packages/ai/src/lib/findMatchingAttribute.ts +0 -102
  624. package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +0 -197
  625. package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +0 -271
  626. package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +0 -294
  627. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.ts +0 -67
  628. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +0 -115
  629. package/analyzer-template/process/INTEGRATION_COMPLETE.md +0 -333
  630. package/analyzer-template/process/INTEGRATION_EXAMPLE.md +0 -525
  631. package/analyzer-template/process/README.md +0 -507
  632. package/background/src/lib/process/GlobalProcessManager.js.map +0 -1
  633. package/background/src/lib/process/ProcessManager.js.map +0 -1
  634. package/background/src/lib/process/index.js.map +0 -1
  635. package/background/src/lib/process/managedExecAsync.js.map +0 -1
  636. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +0 -238
  637. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +0 -1
  638. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-CVbSvOjo.js +0 -1
  639. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-DcwcHyl5.js +0 -1
  640. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-WgwC1GfJ.js +0 -26
  641. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-IEKom9O2.js +0 -3
  642. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-BYnfxbUG.js +0 -3
  643. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-_lBPJCzG.js +0 -1
  644. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-lHVhvsu_.js +0 -1
  645. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-d_TBk4GQ.js +0 -5
  646. package/codeyam-cli/src/webserver/build/client/assets/_index-kGT7VUqj.js +0 -1
  647. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-DDGmhu7P.js +0 -7
  648. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-n_HPRfM_.js +0 -1
  649. package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-CbVoyx1U.js +0 -26
  650. package/codeyam-cli/src/webserver/build/client/assets/circle-check-D1VOYveA.js +0 -1
  651. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-YR8jjAlu.js +0 -1
  652. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-B8vP3V_s.js +0 -1
  653. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-CN6aLCT1.js +0 -16
  654. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DA5Jeu2P.js +0 -1
  655. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-BTeitalf.js +0 -5
  656. package/codeyam-cli/src/webserver/build/client/assets/entry.client-du6UEYD-.js +0 -13
  657. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-BpjkhMoi.js +0 -1
  658. package/codeyam-cli/src/webserver/build/client/assets/files-BQGvk4lJ.js +0 -1
  659. package/codeyam-cli/src/webserver/build/client/assets/git-DVdYRT-I.js +0 -12
  660. package/codeyam-cli/src/webserver/build/client/assets/globals-CO-U8Bpo.css +0 -1
  661. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +0 -5
  662. package/codeyam-cli/src/webserver/build/client/assets/index-DCG-vks0.js +0 -1
  663. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-GazdNeLl.js +0 -1
  664. package/codeyam-cli/src/webserver/build/client/assets/manifest-0b694d28.js +0 -1
  665. package/codeyam-cli/src/webserver/build/client/assets/root-D3tQP7hx.js +0 -16
  666. package/codeyam-cli/src/webserver/build/client/assets/search-CIY6XmtE.js +0 -1
  667. package/codeyam-cli/src/webserver/build/client/assets/server-build-CMKNK2uU.css +0 -1
  668. package/codeyam-cli/src/webserver/build/client/assets/settings-CoMDgElu.js +0 -1
  669. package/codeyam-cli/src/webserver/build/client/assets/simulations-agkniXp2.js +0 -1
  670. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-B2VUcygF.js +0 -1
  671. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-EvdK-zXP.js +0 -1
  672. package/codeyam-cli/src/webserver/build/server/assets/index-DGVHQEXD.js +0 -1
  673. package/codeyam-cli/src/webserver/build/server/assets/server-build-CghkTkIL.js +0 -166
  674. package/codeyam-cli/templates/debug-command.md +0 -303
  675. package/packages/ai/src/lib/findMatchingAttribute.js +0 -77
  676. package/packages/ai/src/lib/findMatchingAttribute.js.map +0 -1
  677. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +0 -136
  678. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +0 -1
  679. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +0 -220
  680. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +0 -1
  681. package/packages/ai/src/lib/generateEntityKeyAttributes.js +0 -241
  682. package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +0 -1
  683. package/packages/ai/src/lib/isFrontend.js +0 -5
  684. package/packages/ai/src/lib/isFrontend.js.map +0 -1
  685. package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js +0 -40
  686. package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js.map +0 -1
  687. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +0 -72
  688. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +0 -1
  689. /package/analyzer-template/{process → packages/process/src}/GlobalProcessManager.ts +0 -0
  690. /package/analyzer-template/{process → packages/process/src}/ProcessManager.ts +0 -0
  691. /package/analyzer-template/{process → packages/process/src}/index.ts +0 -0
  692. /package/analyzer-template/{process → packages/process/src}/managedExecAsync.ts +0 -0
  693. /package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CMKNK2uU.css → styles-CMKNK2uU.css} +0 -0
  694. /package/{background/src/lib/process → packages/process/src}/GlobalProcessManager.js +0 -0
  695. /package/{background/src/lib/process → packages/process/src}/index.js +0 -0
  696. /package/{background/src/lib/process → packages/process/src}/managedExecAsync.js +0 -0
@@ -1,8 +1,8 @@
1
- // import { writeFile } from 'fs/promises';
2
1
  import {
3
2
  convertDotNotation,
4
3
  fillInDirectSchemaGapsAndUnknowns,
5
4
  joinParenthesesAndArrays,
5
+ mergeJsonTypeDefinitions,
6
6
  splitOutsideParenthesesAndArrays,
7
7
  } from '~codeyam/ai';
8
8
  import { DataStructure, JsonTypeDefinition } from '~codeyam/types';
@@ -15,6 +15,65 @@ function cleanFunctionName(name: string): string {
15
15
  return name?.split('<')[0];
16
16
  }
17
17
 
18
+ /**
19
+ * Escapes special regex characters in a string.
20
+ */
21
+ function escapeRegExp(str: string): string {
22
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
23
+ }
24
+
25
+ /**
26
+ * Counts only DIRECT function calls, excluding method chains on return values.
27
+ *
28
+ * When a hook returns an object with methods that are later called, the analysis
29
+ * tracks those as call signatures like 'useAuth().functionCallReturnValue.signOut()'.
30
+ * These are NOT separate calls to useAuth - they're method invocations on the return value.
31
+ *
32
+ * This function filters out such method chains to get the true count of direct calls.
33
+ *
34
+ * @example
35
+ * // One direct call, one method on return value
36
+ * countDirectCalls(['useAuth()', 'useAuth().functionCallReturnValue.signOut()']) // => 1
37
+ *
38
+ * // Two direct calls
39
+ * countDirectCalls(['useFetcher()', 'useFetcher()']) // => 2
40
+ */
41
+ function countDirectCalls(calls: string[]): number {
42
+ return calls.filter((sig) => !sig.includes('.functionCallReturnValue.'))
43
+ .length;
44
+ }
45
+
46
+ /**
47
+ * Checks if all direct calls (non-method-chain calls) are identical.
48
+ * This happens when destructuring a hook call:
49
+ * const { authLoading, signOut } = useAuth();
50
+ * produces calls: ['useAuth()', 'useAuth()'] (same signature repeated)
51
+ *
52
+ * In this case, we should use the full unqualified schema since there's
53
+ * really only ONE function call, not multiple different calls.
54
+ *
55
+ * @example
56
+ * // Same call repeated (from destructuring)
57
+ * allDirectCallsIdentical(['useAuth()', 'useAuth()']) // => true
58
+ *
59
+ * // Different calls
60
+ * allDirectCallsIdentical(['useFetcher<User>()', 'useFetcher<Report>()']) // => false
61
+ *
62
+ * // Single call
63
+ * allDirectCallsIdentical(['useAuth()']) // => true
64
+ *
65
+ * // With method chain (method chain is ignored)
66
+ * allDirectCallsIdentical(['useAuth()', 'useAuth().functionCallReturnValue.signOut()']) // => true
67
+ */
68
+ function allDirectCallsIdentical(calls: string[]): boolean {
69
+ const directCalls = calls.filter(
70
+ (sig) => !sig.includes('.functionCallReturnValue.'),
71
+ );
72
+ if (directCalls.length === 0) return true;
73
+ const firstCall = directCalls[0];
74
+ return directCalls.every((call) => call === firstCall);
75
+ }
76
+
18
77
  /**
19
78
  * Preprocesses the schema to:
20
79
  * 1. Filter out all signature paths
@@ -68,6 +127,18 @@ function preprocessSchemaForMocks(
68
127
  return result;
69
128
  }
70
129
 
130
+ /**
131
+ * Options for gatherDataForMocks
132
+ */
133
+ export interface GatherDataForMocksOptions {
134
+ /**
135
+ * When provided, generates canonical keys in format `EntityName::hookName::index`.
136
+ * This ensures consistent keys across scenarios regardless of variable names
137
+ * chosen during analysis.
138
+ */
139
+ entityName?: string;
140
+ }
141
+
71
142
  /**
72
143
  * Processes a single call (with optional variable name) and returns the mock data entry.
73
144
  * Returns null if no valid schema is found.
@@ -78,6 +149,8 @@ function preprocessSchemaForMocks(
78
149
  * @param variableNameOccurrence - When a variable name is reused, this is the occurrence index
79
150
  * (e.g., first 'data' = 0, second 'data' = 1)
80
151
  * Used to disambiguate keys when the same variable is reused.
152
+ * @param options - Additional options including entityName for canonical key generation
153
+ * @param hookCallIndex - The global index of this hook call for canonical key generation
81
154
  */
82
155
  function processCall(
83
156
  importedExport: {
@@ -89,29 +162,193 @@ function processCall(
89
162
  },
90
163
  dependencySchemas: DataStructure['dependencySchemas'],
91
164
  callIndex: number,
92
- variableNameOccurrence?: number,
165
+ variableNameOccurrence: number | undefined,
166
+ options: GatherDataForMocksOptions | undefined,
167
+ hookCallIndex: number,
93
168
  ): { key: string; value: JsonTypeDefinition } | null {
94
169
  const callName = importedExport.calls?.[callIndex] ?? importedExport.name;
95
- const variableName = importedExport.callVariableNames?.[callIndex];
170
+
171
+ // Determine if we should use variable-qualified schema or base schema.
172
+ // Use variable-qualified schema when:
173
+ // 1. variableNameOccurrence is defined (we're processing multiple DISTINCT calls), OR
174
+ // 2. Single call with single variable name (directCallCount === 1 && varNamesLength === 1)
175
+ // Use base schema when:
176
+ // - Multiple calls that are all identical (destructuring case: const { a, b } = useHook())
177
+ // - directCallCount !== varNamesLength (rest spread or method chain case)
178
+ // This is important for rest spread destructuring like: const { x, y, ...data } = useLoaderData()
179
+ // where data.queueState.jobs should come from the base schema, not from a variable-qualified schema.
180
+ // Also important: method chains like useAuth().functionCallReturnValue.signOut() should NOT count
181
+ // as separate calls - only direct hook calls count.
182
+ const directCallCount = countDirectCalls(importedExport.calls ?? []);
183
+ const varNamesLength = importedExport.callVariableNames?.length ?? 0;
184
+ const shouldUseVariableQualifiedSchema =
185
+ variableNameOccurrence !== undefined ||
186
+ (directCallCount === 1 && varNamesLength === 1);
187
+ const variableName = shouldUseVariableQualifiedSchema
188
+ ? importedExport.callVariableNames?.[callIndex]
189
+ : undefined;
96
190
 
97
191
  // Build the schema lookup key - use variable-qualified key if available
98
- const schemaLookupKey = variableName
99
- ? `${importedExport.name}::${variableName}`
100
- : importedExport.name;
192
+ // When the same variable name is reused (variableNameOccurrence > 0), try indexed lookup first
193
+ // e.g., "useFetcher::fetcher[1]" for the second use of "fetcher"
194
+ const indexedVariableName =
195
+ variableName &&
196
+ variableNameOccurrence !== undefined &&
197
+ variableNameOccurrence > 0
198
+ ? `${variableName}[${variableNameOccurrence}]`
199
+ : variableName;
200
+
201
+ // Schema lookup order (most specific to least specific):
202
+ // 1. Call signature (e.g., 'useLoaderData<typeof loader>()')
203
+ // 2. Variable-qualified key with index (e.g., 'useFetcher::fetcher[1]')
204
+ // 3. Variable-qualified key without index (e.g., 'useFetcher::fetcher')
205
+ // 4. Base name (e.g., 'useLoaderData')
206
+
207
+ let rawSchema: Record<string, string> = {};
208
+
209
+ // 1. Try call signature first (most specific - new format)
210
+ if (callName !== importedExport.name) {
211
+ rawSchema =
212
+ dependencySchemas?.[importedExport.filePath]?.[callName]
213
+ ?.returnValueSchema ?? {};
214
+ }
215
+
216
+ // 2. Try variable-qualified key with index
217
+ if (Object.keys(rawSchema).length === 0 && indexedVariableName) {
218
+ const indexedKey = `${importedExport.name}::${indexedVariableName}`;
219
+ rawSchema =
220
+ dependencySchemas?.[importedExport.filePath]?.[indexedKey]
221
+ ?.returnValueSchema ?? {};
222
+ }
101
223
 
102
- const rawSchema =
103
- dependencySchemas?.[importedExport.filePath]?.[schemaLookupKey]
224
+ // 3. Try variable-qualified key without index (fallback for indexed lookup)
225
+ if (
226
+ Object.keys(rawSchema).length === 0 &&
227
+ variableNameOccurrence !== undefined &&
228
+ variableNameOccurrence > 0 &&
229
+ variableName
230
+ ) {
231
+ const nonIndexedKey = `${importedExport.name}::${variableName}`;
232
+ rawSchema =
233
+ dependencySchemas?.[importedExport.filePath]?.[nonIndexedKey]
234
+ ?.returnValueSchema ?? {};
235
+ }
236
+
237
+ // 4. Get base name schema and merge with call-specific schema
238
+ // The base schema often has more complete array element details that the
239
+ // call-specific schema might be missing. Instead of using as fallback only
240
+ // when empty, MERGE both schemas so we get the most complete picture.
241
+ //
242
+ // HOWEVER: For type-parameterized calls where the base schema contains paths
243
+ // from MULTIPLE DIFFERENT type parameters, DON'T merge to avoid contamination.
244
+ // The call-specific schema (rawSchema) is already isolated and complete.
245
+ const baseSchema =
246
+ dependencySchemas?.[importedExport.filePath]?.[importedExport.name]
104
247
  ?.returnValueSchema ?? {};
105
248
 
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;
249
+ // Check if this is a type-parameterized call with a call-specific schema
250
+ const hasTypeParams = callName.includes('<') && callName.includes('>');
251
+ const hasCallSpecificSchema = Object.keys(rawSchema).length > 0;
252
+
253
+ // Check if the base schema has multiple DIFFERENT type parameter variants
254
+ // If so, merging would bring in wrong fields from other variants
255
+ let baseHasMultipleTypeParamVariants = false;
256
+ if (hasTypeParams && hasCallSpecificSchema) {
257
+ const baseFunctionName = cleanFunctionName(callName.split('(')[0]);
258
+ const typeParamVariantsInBase = new Set<string>();
259
+
260
+ for (const path of Object.keys(baseSchema)) {
261
+ // Look for paths like "useFetcher<TypeA>(...)" or "useFetcher<TypeB>(...)"
262
+ const match = path.match(
263
+ new RegExp(`^${escapeRegExp(baseFunctionName)}<([^>]+)>\\(`),
264
+ );
265
+ if (match) {
266
+ typeParamVariantsInBase.add(match[1]);
267
+ }
268
+ }
269
+ baseHasMultipleTypeParamVariants = typeParamVariantsInBase.size > 1;
270
+ }
271
+
272
+ // For type-parameterized calls where we have a call-specific schema, we need to
273
+ // be careful about merging with the base schema. The base schema may contain
274
+ // merged data from ALL type parameter variants, which would pollute the result.
275
+ let mergedSchema: Record<string, string>;
276
+ if (hasCallSpecificSchema && hasTypeParams) {
277
+ if (baseHasMultipleTypeParamVariants) {
278
+ // Base schema has paths with different type parameters - filter to only
279
+ // include paths matching the current type parameter.
280
+ const typeParamMatch = callName.match(/<([^>]+)>/);
281
+ const currentTypeParam = typeParamMatch ? typeParamMatch[1] : null;
282
+ const baseFunctionName = cleanFunctionName(callName.split('(')[0]);
283
+
284
+ if (currentTypeParam) {
285
+ // Filter base schema to only include paths that:
286
+ // 1. Match current type param (e.g., useLoaderData<LoaderData>())
287
+ // 2. OR don't have any type param (generic paths like useLoaderData())
288
+ const filteredBaseSchema: Record<string, string> = {};
289
+ for (const [path, type] of Object.entries(baseSchema)) {
290
+ // Check if path has a type parameter for this function
291
+ const pathTypeParamMatch = path.match(
292
+ new RegExp(`^${escapeRegExp(baseFunctionName)}<([^>]+)>\\(`),
293
+ );
294
+ if (pathTypeParamMatch) {
295
+ // Path has a type param - only include if it matches current
296
+ if (pathTypeParamMatch[1] === currentTypeParam) {
297
+ filteredBaseSchema[path] = type;
298
+ }
299
+ // Otherwise skip (it's for a different type param variant)
300
+ } else {
301
+ // Path doesn't have a type param for this function - include it
302
+ // (could be generic paths or paths for other functions)
303
+ filteredBaseSchema[path] = type;
304
+ }
305
+ }
306
+ mergedSchema = { ...filteredBaseSchema, ...rawSchema };
307
+ } else {
308
+ // Couldn't extract type param - fall back to rawSchema only
309
+ mergedSchema = rawSchema;
310
+ }
311
+ } else {
312
+ // Base schema has zero or one type-parameterized variant.
313
+ // When there's only one variant, the base schema paths are safe to merge
314
+ // (no contamination from other variants). This is important for cases like:
315
+ // - Array element details (gitStatus[].path) that are in base but not call-specific
316
+ // - Enriched paths that should be preserved
317
+ // Filter to only include paths matching current type param or generic paths.
318
+ const typeParamMatch = callName.match(/<([^>]+)>/);
319
+ const currentTypeParam = typeParamMatch ? typeParamMatch[1] : null;
320
+ const baseFunctionName = cleanFunctionName(callName.split('(')[0]);
321
+
322
+ if (currentTypeParam) {
323
+ const filteredBaseSchema: Record<string, string> = {};
324
+ for (const [path, type] of Object.entries(baseSchema)) {
325
+ const pathTypeParamMatch = path.match(
326
+ new RegExp(`^${escapeRegExp(baseFunctionName)}<([^>]+)>\\(`),
327
+ );
328
+ if (pathTypeParamMatch) {
329
+ // Path has a type param - only include if it matches current
330
+ if (pathTypeParamMatch[1] === currentTypeParam) {
331
+ filteredBaseSchema[path] = type;
332
+ }
333
+ } else {
334
+ // Path doesn't have a type param - include generic paths
335
+ filteredBaseSchema[path] = type;
336
+ }
337
+ }
338
+ mergedSchema = { ...filteredBaseSchema, ...rawSchema };
339
+ } else {
340
+ // No type param to extract - merge normally
341
+ mergedSchema = { ...baseSchema, ...rawSchema };
342
+ }
343
+ }
344
+ } else if (Object.keys(rawSchema).length === 0) {
345
+ mergedSchema = baseSchema;
346
+ } else {
347
+ mergedSchema = { ...baseSchema, ...rawSchema };
348
+ }
112
349
 
113
350
  // Preprocess to filter signatures and extract functionCallReturnValue
114
- let preprocessedSchema = preprocessSchemaForMocks(fallbackSchema);
351
+ let preprocessedSchema = preprocessSchemaForMocks(mergedSchema);
115
352
 
116
353
  const functionNames: string[] = [];
117
354
 
@@ -225,12 +462,12 @@ function processCall(
225
462
  {} as Record<string, string>,
226
463
  );
227
464
 
228
- const schema = convertDotNotation(
229
- fillInDirectSchemaGapsAndUnknowns({
230
- scopeName: importedExport.name,
231
- schema: relevantMergedDependencySchema,
232
- }),
233
- );
465
+ const filledSchema = fillInDirectSchemaGapsAndUnknowns({
466
+ scopeName: importedExport.name,
467
+ schema: relevantMergedDependencySchema,
468
+ });
469
+
470
+ const schema = convertDotNotation(filledSchema);
234
471
 
235
472
  // Determine if this is an object-style or hook-style dependency:
236
473
  // - Hook-style: calls = ['useAuth()'] - call starts with name + '('
@@ -245,23 +482,11 @@ function processCall(
245
482
  ? `${baseSchemaKey}::${variableName}`
246
483
  : baseSchemaKey;
247
484
 
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
- }
485
+ // Build output key - use the ORIGINAL CALL SIGNATURE from the code
486
+ // This makes it clear to the LLM exactly which call needs which data.
487
+ // Example: useFetcher<{ data: UserData }>() vs useFetcher<{ data: ReportData }>()
488
+ // Example: db.select(usersQuery) vs db.select(postsQuery)
489
+ const outputKey = callName;
265
490
 
266
491
  // Try to find return value - check with variable qualifier first, then without
267
492
  let returnValue = schema[schemaKey];
@@ -271,6 +496,38 @@ function processCall(
271
496
  if (!returnValue) {
272
497
  returnValue = schema['returnValue'];
273
498
  }
499
+ // Fallback for function call return values (e.g., useFetcher returns via functionCallReturnValue)
500
+ if (!returnValue) {
501
+ returnValue = schema['functionCallReturnValue'];
502
+ }
503
+
504
+ // Handle method-chain style calls (e.g., createClient().from("workouts").select("*") or db.select(query))
505
+ // After convertDotNotation, the schema is nested: { "createClient()": { "from(...)": { ... } } }
506
+ // We need to navigate the nested structure using the call signature parts.
507
+ // For object-style dependencies (isObjectStyle=true), the baseSchemaKey is just the object name (e.g., "db"),
508
+ // so returnValue might be the parent object, not the actual return value of the method chain.
509
+ // We should always try method-chain navigation for calls with dots and parens.
510
+ if (callName.includes('.') && callName.includes('(')) {
511
+ const callParts = splitOutsideParenthesesAndArrays(callName);
512
+ let current: unknown = schema;
513
+ for (const part of callParts) {
514
+ if (
515
+ current &&
516
+ typeof current === 'object' &&
517
+ !Array.isArray(current) &&
518
+ part in (current as Record<string, unknown>)
519
+ ) {
520
+ current = (current as Record<string, unknown>)[part];
521
+ } else {
522
+ current = undefined;
523
+ break;
524
+ }
525
+ }
526
+ // Use method-chain result if found, otherwise keep previous returnValue
527
+ if (current !== undefined) {
528
+ returnValue = current as typeof returnValue;
529
+ }
530
+ }
274
531
 
275
532
  if (!returnValue) {
276
533
  return null;
@@ -279,6 +536,27 @@ function processCall(
279
536
  return { key: outputKey, value: returnValue as JsonTypeDefinition };
280
537
  }
281
538
 
539
+ /**
540
+ * Adds a result to the accumulator, merging schemas if the key already exists.
541
+ * This handles the case where the same call signature appears multiple times
542
+ * (e.g., two calls to useFetcher() with the same generic type).
543
+ */
544
+ function addResultToAccumulator(
545
+ acc: { [key: string]: JsonTypeDefinition },
546
+ key: string,
547
+ value: JsonTypeDefinition,
548
+ ): void {
549
+ if (acc[key]) {
550
+ // Key already exists - merge the schemas
551
+ acc[key] = mergeJsonTypeDefinitions(
552
+ acc[key] as Record<string, unknown>,
553
+ value as Record<string, unknown>,
554
+ ) as JsonTypeDefinition;
555
+ } else {
556
+ acc[key] = value;
557
+ }
558
+ }
559
+
282
560
  export default function gatherDataForMocks(
283
561
  importedExports: {
284
562
  filePath?: string;
@@ -288,19 +566,134 @@ export default function gatherDataForMocks(
288
566
  callVariableNames?: string[];
289
567
  }[],
290
568
  dependencySchemas: DataStructure['dependencySchemas'],
569
+ options?: GatherDataForMocksOptions,
291
570
  ) {
292
- return importedExports.reduce(
571
+ // Track the global index for each hook name across all imports
572
+ // This enables canonical keys like EntityName::useLoaderData::0, EntityName::useFetcher::0, etc.
573
+ const hookCallIndices: Record<string, number> = {};
574
+
575
+ const result = importedExports.reduce(
293
576
  (acc, importedExport) => {
294
577
  if (!importedExport.isMocked) return acc;
295
578
 
296
- // Check if we have multiple calls with variable names
297
- const hasMultipleCalls =
298
- importedExport.calls &&
299
- importedExport.calls.length > 1 &&
579
+ // Get the clean hook name for indexing
580
+ const hookName = cleanFunctionName(importedExport.name);
581
+
582
+ // Check if we have multiple DISTINCT direct calls with variable names.
583
+ // Important: Only count direct calls to the function, not method chains on its return value.
584
+ // For example, ['useAuth()', 'useAuth().functionCallReturnValue.signOut()'] has only 1 direct call.
585
+ //
586
+ // ALSO: If all direct calls are IDENTICAL (same signature repeated), this is from
587
+ // destructuring like `const { a, b } = useHook()` and we should use the FULL unqualified
588
+ // schema, not iterate through partial variable-qualified schemas.
589
+ const directCallCount = countDirectCalls(importedExport.calls ?? []);
590
+ const hasMultipleDistinctCalls =
591
+ directCallCount > 1 &&
300
592
  importedExport.callVariableNames &&
301
- importedExport.callVariableNames.length === importedExport.calls.length;
593
+ importedExport.callVariableNames.length === directCallCount &&
594
+ !allDirectCallsIdentical(importedExport.calls ?? []);
595
+
596
+ // Check for multiple distinct method-chain calls WITHOUT callVariableNames.
597
+ // This pattern is common with tRPC, Supabase, etc. where a single import
598
+ // (e.g., `trpc`) is used with multiple different method chains (e.g.,
599
+ // `trpc.useUtils()`, `trpc.quote.getQuotesByOrg.useQuery()`).
600
+ // These should each get their own entry in dataForMocks.
601
+ //
602
+ // IMPORTANT: This is DIFFERENT from the rest spread pattern where a function
603
+ // like useLoaderData is called directly, and other calls are method chains
604
+ // on its return value (e.g., `useLoaderData<typeof loader>()` with
605
+ // `useLoaderData<typeof loader>().uncommittedEntitiesList.filter(...)`).
606
+ // In that case, all the additional calls start with the base function call.
607
+ const directCalls = (importedExport.calls ?? []).filter(
608
+ (sig) => !sig.includes('.functionCallReturnValue.'),
609
+ );
610
+ const uniqueDirectCalls = [...new Set(directCalls)];
611
+
612
+ // Check if any call is a direct invocation of the import (e.g., `useLoaderData<typeof loader>()`)
613
+ // as opposed to all being property accesses (e.g., `trpc.useUtils()`, `trpc.quote.xxx()`).
614
+ // If there's a direct function call, the other calls are likely method chains on its result.
615
+ const baseName = importedExport.name;
616
+ const hasDirectFunctionCall = directCalls.some((sig) => {
617
+ // Pattern: baseName() or baseName<...>()
618
+ // This matches "useLoaderData()", "useLoaderData<typeof loader>()", etc.
619
+ // but NOT "trpc.useUtils()" which has a dot before the parens
620
+ const baseCallPattern = new RegExp(`^${baseName}(<[^>]*>)?\\(`);
621
+ return baseCallPattern.test(sig);
622
+ });
623
+
624
+ const hasMultipleDistinctMethodChains =
625
+ !hasMultipleDistinctCalls &&
626
+ uniqueDirectCalls.length > 1 &&
627
+ !allDirectCallsIdentical(directCalls) &&
628
+ !hasDirectFunctionCall; // Exclude rest spread patterns
629
+
630
+ if (hasMultipleDistinctMethodChains) {
631
+ // For multiple method-chain calls on the same import, create a NESTED structure
632
+ // under the base import name. This allows constructMockCode to generate a
633
+ // combined mock object with all method chains.
634
+ //
635
+ // Example: For calls ['trpc.useUtils()', 'trpc.quote.getQuotesByOrg.useQuery()'],
636
+ // create: { "trpc": { "useUtils()": {...}, "quote": { "getQuotesByOrg": { "useQuery()": {...} } } } }
637
+ const nestedResult: Record<string, unknown> = {};
638
+
639
+ for (let i = 0; i < uniqueDirectCalls.length; i++) {
640
+ // Find the index of this call in the original calls array
641
+ const callIndex = (importedExport.calls ?? []).indexOf(
642
+ uniqueDirectCalls[i],
643
+ );
644
+ if (callIndex === -1) continue;
645
+
646
+ const hookCallIndex = hookCallIndices[hookName] ?? 0;
647
+ hookCallIndices[hookName] = hookCallIndex + 1;
302
648
 
303
- if (hasMultipleCalls) {
649
+ const processResult = processCall(
650
+ importedExport,
651
+ dependencySchemas,
652
+ callIndex,
653
+ undefined,
654
+ options,
655
+ hookCallIndex,
656
+ );
657
+
658
+ if (processResult) {
659
+ // The key is like "trpc.useUtils()" or "trpc.quote.getQuotesByOrg.useQuery()"
660
+ // We need to nest the value at the path AFTER the base name
661
+ const callSignature = processResult.key;
662
+
663
+ // Split the call signature into path parts, handling parens
664
+ // e.g., "trpc.useUtils()" -> ["trpc", "useUtils()"]
665
+ // e.g., "trpc.quote.getQuotesByOrg.useQuery()" -> ["trpc", "quote", "getQuotesByOrg", "useQuery()"]
666
+ const pathParts = splitOutsideParenthesesAndArrays(callSignature);
667
+
668
+ // Skip the base name (first part) and nest the value at the remaining path
669
+ if (pathParts.length > 1 && pathParts[0] === baseName) {
670
+ const nestedPath = pathParts.slice(1);
671
+
672
+ // Set the value at the nested path, merging with existing structure
673
+ let current = nestedResult;
674
+ for (let j = 0; j < nestedPath.length - 1; j++) {
675
+ const part = nestedPath[j];
676
+ if (!(part in current)) {
677
+ current[part] = {};
678
+ }
679
+ current = current[part] as Record<string, unknown>;
680
+ }
681
+ // Set the leaf value
682
+ const leafKey = nestedPath[nestedPath.length - 1];
683
+ current[leafKey] = processResult.value;
684
+ }
685
+ }
686
+ }
687
+
688
+ // Add the nested result under the base import name
689
+ if (Object.keys(nestedResult).length > 0) {
690
+ addResultToAccumulator(
691
+ acc,
692
+ baseName,
693
+ nestedResult as JsonTypeDefinition,
694
+ );
695
+ }
696
+ } else if (hasMultipleDistinctCalls) {
304
697
  // Track how many times each variable name has been seen
305
698
  // to disambiguate keys when the same variable is reused
306
699
  const variableNameCounts: Record<string, number> = {};
@@ -313,21 +706,162 @@ export default function gatherDataForMocks(
313
706
  const occurrence = variableNameCounts[varName] ?? 0;
314
707
  variableNameCounts[varName] = occurrence + 1;
315
708
 
316
- const result = processCall(
709
+ // Get the current hook call index and increment for next call
710
+ const hookCallIndex = hookCallIndices[hookName] ?? 0;
711
+ hookCallIndices[hookName] = hookCallIndex + 1;
712
+
713
+ const processResult = processCall(
317
714
  importedExport,
318
715
  dependencySchemas,
319
716
  i,
320
717
  occurrence,
718
+ options,
719
+ hookCallIndex,
720
+ );
721
+ if (processResult) {
722
+ addResultToAccumulator(acc, processResult.key, processResult.value);
723
+ }
724
+ }
725
+ } else if (
726
+ // Handle multiple UNIQUE type-parameterized direct calls when variable count doesn't match.
727
+ // This happens when a hook is called with different type parameters (useFetcher<TypeA>(), useFetcher<TypeB>()),
728
+ // but the callVariableNames count doesn't match directCallCount (common with rest spread patterns).
729
+ // Each unique call signature should get its own entry in dataForMocks.
730
+ uniqueDirectCalls.length > 1 &&
731
+ !allDirectCallsIdentical(directCalls) &&
732
+ hasDirectFunctionCall
733
+ ) {
734
+ // Process each UNIQUE direct call signature
735
+ for (let i = 0; i < uniqueDirectCalls.length; i++) {
736
+ const callSignature = uniqueDirectCalls[i];
737
+
738
+ // Find the index of this call in the original calls array
739
+ const callIndex = (importedExport.calls ?? []).indexOf(callSignature);
740
+ if (callIndex === -1) continue;
741
+
742
+ const hookCallIndex = hookCallIndices[hookName] ?? 0;
743
+ hookCallIndices[hookName] = hookCallIndex + 1;
744
+
745
+ const processResult = processCall(
746
+ importedExport,
747
+ dependencySchemas,
748
+ callIndex,
749
+ undefined,
750
+ options,
751
+ hookCallIndex,
321
752
  );
322
- if (result) {
323
- acc[result.key] = result.value;
753
+
754
+ if (processResult) {
755
+ addResultToAccumulator(acc, processResult.key, processResult.value);
324
756
  }
325
757
  }
326
758
  } 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;
759
+ // Single calls, or multiple identical calls (from destructuring)
760
+ // Get the current hook call index and increment for next call
761
+ const hookCallIndex = hookCallIndices[hookName] ?? 0;
762
+ hookCallIndices[hookName] = hookCallIndex + 1;
763
+
764
+ // First, try to get result from unqualified schema
765
+ const processResult = processCall(
766
+ importedExport,
767
+ dependencySchemas,
768
+ 0,
769
+ undefined,
770
+ options,
771
+ hookCallIndex,
772
+ );
773
+
774
+ // Check if we got a meaningful result (not empty object or null)
775
+ // Arrays are always meaningful (even empty ones represent valid data structure)
776
+ const hasUnqualifiedResult =
777
+ processResult &&
778
+ processResult.value !== null &&
779
+ (typeof processResult.value !== 'object' ||
780
+ Array.isArray(processResult.value) ||
781
+ Object.keys(processResult.value as object).length > 0);
782
+
783
+ // Check if we have multiple callVariableNames that are DIFFERENT
784
+ // (e.g., from parent + child components using the same hook differently)
785
+ // In this case, we should also merge in variable-qualified schemas
786
+ // to capture all destructured properties from both parent and child.
787
+ const uniqueCallVarNames = new Set(
788
+ importedExport.callVariableNames ?? [],
789
+ );
790
+ const hasDifferentVarNames =
791
+ importedExport.callVariableNames &&
792
+ importedExport.callVariableNames.length > 1 &&
793
+ uniqueCallVarNames.size > 1 &&
794
+ // Only merge variable-qualified schemas when calls are all identical
795
+ // (e.g., useFlags() repeated). Don't do this for method chains
796
+ // or rest spread cases where calls.length !== callVariableNames.length
797
+ allDirectCallsIdentical(importedExport.calls ?? []);
798
+
799
+ if (hasUnqualifiedResult) {
800
+ let finalValue = processResult.value;
801
+
802
+ // If we have different variable names (e.g., from parent and child components),
803
+ // also merge in variable-qualified schemas to ensure we capture all properties.
804
+ // This handles the case where parent uses useFlags().enableNewAdminDashboard
805
+ // and child uses useFlags().flagShowReferenceIdOnQuoteTable.
806
+ if (hasDifferentVarNames) {
807
+ let mergedValue = processResult.value as JsonTypeDefinition;
808
+ for (let i = 0; i < importedExport.callVariableNames!.length; i++) {
809
+ const varQualifiedResult = processCall(
810
+ importedExport,
811
+ dependencySchemas,
812
+ i,
813
+ 0, // Use 0 to trigger variable-qualified lookup
814
+ options,
815
+ hookCallIndex,
816
+ );
817
+ if (varQualifiedResult && varQualifiedResult.value) {
818
+ mergedValue = mergeJsonTypeDefinitions(
819
+ mergedValue as Record<string, unknown>,
820
+ varQualifiedResult.value as Record<string, unknown>,
821
+ ) as JsonTypeDefinition;
822
+ }
823
+ }
824
+ finalValue = mergedValue;
825
+ }
826
+
827
+ addResultToAccumulator(
828
+ acc,
829
+ processResult.key,
830
+ finalValue as JsonTypeDefinition,
831
+ );
832
+ } else if (
833
+ directCallCount > 1 &&
834
+ allDirectCallsIdentical(importedExport.calls ?? []) &&
835
+ importedExport.callVariableNames &&
836
+ importedExport.callVariableNames.length > 0
837
+ ) {
838
+ // No unqualified schema exists, but we have multiple identical calls with variable names
839
+ // Merge all the variable-qualified schemas together
840
+ const callSignature =
841
+ importedExport.calls?.[0] ?? `${importedExport.name}()`;
842
+ let mergedValue: JsonTypeDefinition = {};
843
+
844
+ for (let i = 0; i < importedExport.callVariableNames.length; i++) {
845
+ const varQualifiedResult = processCall(
846
+ importedExport,
847
+ dependencySchemas,
848
+ i,
849
+ 0, // Use 0 to trigger variable-qualified lookup
850
+ options,
851
+ hookCallIndex,
852
+ );
853
+ if (varQualifiedResult && varQualifiedResult.value) {
854
+ // Deep merge the value into the accumulated result
855
+ mergedValue = mergeJsonTypeDefinitions(
856
+ mergedValue,
857
+ varQualifiedResult.value,
858
+ );
859
+ }
860
+ }
861
+
862
+ if (Object.keys(mergedValue as object).length > 0) {
863
+ addResultToAccumulator(acc, callSignature, mergedValue);
864
+ }
331
865
  }
332
866
  }
333
867
 
@@ -335,4 +869,6 @@ export default function gatherDataForMocks(
335
869
  },
336
870
  {} as { [importAlias: string]: JsonTypeDefinition },
337
871
  );
872
+
873
+ return result;
338
874
  }