@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.483fdc2

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 (171) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +2 -2
  4. package/analyzer-template/packages/ai/index.ts +6 -1
  5. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +39 -17
  6. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
  7. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +308 -50
  8. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +15 -6
  9. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +664 -242
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  11. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +20 -1
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +35 -13
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +160 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +289 -83
  17. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +269 -1
  18. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  19. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +11 -3
  20. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  21. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +297 -7
  22. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  23. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  24. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  25. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  26. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  27. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  28. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  29. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  30. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  31. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  32. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  33. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  34. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  35. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +20 -6
  36. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -4
  37. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  38. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
  39. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  40. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  41. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +57 -13
  42. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +29 -0
  43. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +35 -4
  44. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
  45. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +199 -17
  46. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  47. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  48. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  49. package/analyzer-template/packages/aws/package.json +1 -1
  50. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  51. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  52. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  53. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  54. package/analyzer-template/packages/github/package.json +1 -1
  55. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  56. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  57. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  58. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  59. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  60. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  61. package/analyzer-template/project/constructMockCode.ts +54 -9
  62. package/analyzer-template/project/writeMockDataTsx.ts +73 -2
  63. package/background/src/lib/virtualized/project/constructMockCode.js +45 -3
  64. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  65. package/background/src/lib/virtualized/project/writeMockDataTsx.js +71 -2
  66. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  67. package/codeyam-cli/scripts/apply-setup.js +146 -0
  68. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  69. package/codeyam-cli/src/commands/debug.js +7 -5
  70. package/codeyam-cli/src/commands/debug.js.map +1 -1
  71. package/codeyam-cli/src/utils/install-skills.js +22 -0
  72. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  73. package/codeyam-cli/src/utils/reviewedRules.js +92 -0
  74. package/codeyam-cli/src/utils/reviewedRules.js.map +1 -0
  75. package/codeyam-cli/src/webserver/build/client/assets/globals-CX9f-5xM.css +1 -0
  76. package/codeyam-cli/src/webserver/build/client/assets/{manifest-7522edd4.js → manifest-bba56ec1.js} +1 -1
  77. package/codeyam-cli/src/webserver/build/client/assets/memory-DuTFSyJ2.js +92 -0
  78. package/codeyam-cli/src/webserver/build/client/assets/{root-eVAaavTS.js → root-DTfSQARG.js} +6 -6
  79. package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-TD1f-DHV.js} +1 -1
  80. package/codeyam-cli/src/webserver/build/server/assets/server-build-BQ-1XyEa.js +258 -0
  81. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  82. package/codeyam-cli/src/webserver/build-info.json +5 -5
  83. package/codeyam-cli/templates/codeyam:memory.md +174 -233
  84. package/codeyam-cli/templates/codeyam:new-rule.md +41 -2
  85. package/codeyam-cli/templates/rule-reflection-hook.py +161 -0
  86. package/codeyam-cli/templates/rules-instructions.md +126 -0
  87. package/package.json +1 -1
  88. package/packages/ai/index.js +2 -1
  89. package/packages/ai/index.js.map +1 -1
  90. package/packages/ai/src/lib/analyzeScope.js +29 -12
  91. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  92. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  93. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  94. package/packages/ai/src/lib/astScopes/processExpression.js +239 -43
  95. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  96. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +503 -165
  97. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  98. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  99. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  100. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  101. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  102. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +22 -1
  103. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  104. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +34 -9
  105. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  106. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +159 -0
  107. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  108. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  109. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  110. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +237 -73
  111. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  112. package/packages/ai/src/lib/generateEntityScenarioData.js +195 -1
  113. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  114. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  115. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  116. package/packages/ai/src/lib/generateExecutionFlows.js +10 -2
  117. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  118. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +209 -3
  119. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  120. package/packages/ai/src/lib/mergeStatements.js +70 -51
  121. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  122. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  123. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  124. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  125. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  126. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  127. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  128. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  129. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  130. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  131. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  132. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  133. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  134. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  135. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  136. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  137. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  138. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  139. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  140. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  141. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  142. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  143. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +13 -5
  144. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  145. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -4
  146. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  147. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  148. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  149. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  150. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  151. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  152. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  153. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  154. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  155. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +52 -10
  156. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  157. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +25 -8
  158. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  159. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +34 -4
  160. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  161. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  162. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  163. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +168 -9
  164. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  165. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  166. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  167. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  168. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  169. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  170. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
  171. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
@@ -14,8 +14,8 @@ export interface ConditionalUsage {
14
14
  conditionType: 'truthiness' | 'comparison' | 'switch';
15
15
  /** For comparison conditions, the literal values being compared against */
16
16
  comparedValues?: string[];
17
- /** Where this conditional usage occurs */
18
- location: 'if' | 'ternary' | 'logical-and' | 'switch';
17
+ /** Where this conditional usage occurs. 'unconditional' is for always-rendered children with data props. */
18
+ location: 'if' | 'ternary' | 'logical-and' | 'switch' | 'unconditional';
19
19
  /** Source location information for this conditional usage */
20
20
  sourceLocation?: {
21
21
  /** Line number (1-based) */
@@ -91,8 +91,8 @@ export interface CompoundConditional {
91
91
  /** Required value for this condition to be true */
92
92
  requiredValue?: string | boolean;
93
93
  }[];
94
- /** Where this compound conditional occurs */
95
- location: 'if' | 'ternary' | 'logical-and' | 'switch';
94
+ /** Where this compound conditional occurs. 'unconditional' is for always-rendered children. */
95
+ location: 'if' | 'ternary' | 'logical-and' | 'switch' | 'unconditional';
96
96
  /** Source location for the entire compound expression */
97
97
  sourceLocation: {
98
98
  lineNumber: number;
@@ -175,7 +175,7 @@ export interface DataStructure {
175
175
  [key: string]: string;
176
176
  };
177
177
  equivalentSignatureVariables: {
178
- [key: string]: string;
178
+ [key: string]: string | string[];
179
179
  };
180
180
  usageEquivalencies?: {
181
181
  [key: string]: {
@@ -1 +1 @@
1
- {"version":3,"file":"ScenariosDataStructure.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScenariosDataStructure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScenariosDataStructure.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScenariosDataStructure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,aAAa,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IACtD,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4GAA4G;IAC5G,QAAQ,EAAE,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,eAAe,CAAC;IACxE,6DAA6D;IAC7D,cAAc,CAAC,EAAE;QACf,4BAA4B;QAC5B,UAAU,EAAE,MAAM,CAAC;QACnB,8BAA8B;QAC9B,MAAM,EAAE,MAAM,CAAC;QACf,mDAAmD;QACnD,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE;QACZ,4DAA4D;QAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,6CAA6C;QAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,+CAA+C;QAC/C,SAAS,EACL,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,IAAI,GACJ,KAAK,GACL,eAAe,GACf,WAAW,GACX,YAAY,GACZ,aAAa,CAAC;QAClB,6DAA6D;QAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;QACtD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,SAAS,EAAE,OAAO,CAAC;QACnB,mDAAmD;QACnD,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KAClC,EAAE,CAAC;IACJ,+FAA+F;IAC/F,QAAQ,EAAE,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,eAAe,CAAC;IACxE,yDAAyD;IACzD,cAAc,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV,oDAAoD;QACpD,IAAI,EAAE,MAAM,CAAC;QACb,8BAA8B;QAC9B,aAAa,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;QACtD,4DAA4D;QAC5D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,kDAAkD;QAClD,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;KACjC,CAAC;IAEF;;;OAGG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,6BAA6B;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,8BAA8B;QAC9B,aAAa,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;QACtD,oCAAoC;QACpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,uDAAuD;QACvD,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;KACjC,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,EAAE;QACN,oEAAoE;QACpE,IAAI,EAAE,QAAQ,CAAC;QACf,iFAAiF;QACjF,aAAa,EAAE,MAAM,CAAC;QACtB,sDAAsD;QACtD,UAAU,EAAE,MAAM,CAAC;QACnB,uDAAuD;QACvD,KAAK,EAAE,MAAM,CAAC;QACd,kCAAkC;QAClC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;KACjE,CAAC;IAEF;;OAEG;IACH,cAAc,CAAC,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC3C,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAE7C,4BAA4B,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC;IACnE,kBAAkB,CAAC,EAAE;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,aAAa,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAChE,CAAC;IACF,mBAAmB,CAAC,EAAE;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,aAAa,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAChE,CAAC;IACF,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE;QACjB,CAAC,kBAAkB,EAAE,MAAM,GAAG;YAC5B,CAAC,oBAAoB,EAAE,MAAM,GAAG;gBAC9B,eAAe,EAAE;oBAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;iBAAE,CAAC;gBAC3C,iBAAiB,EAAE;oBAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;iBAAE,CAAC;gBAC7C,kBAAkB,CAAC,EAAE;oBACnB,CAAC,GAAG,EAAE,MAAM,GAAG;wBAAE,aAAa,EAAE,MAAM,CAAC;wBAAC,UAAU,EAAE,MAAM,CAAA;qBAAE,EAAE,CAAC;iBAChE,CAAC;gBACF,mBAAmB,CAAC,EAAE;oBACpB,CAAC,GAAG,EAAE,MAAM,GAAG;wBAAE,aAAa,EAAE,MAAM,CAAC;wBAAC,UAAU,EAAE,MAAM,CAAA;qBAAE,EAAE,CAAC;iBAChE,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE;QAAE,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAA;KAAE,CAAC;IACpE,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7C,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,iIAAiI;IACjI,6BAA6B,CAAC,EAAE;QAC9B,CAAC,kBAAkB,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAC;KAClD,CAAC;IACF,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,+IAA+I;IAC/I,gBAAgB,CAAC,EAAE;QACjB,CAAC,YAAY,EAAE,MAAM,GAAG;YACtB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;YACvB,SAAS,EACL,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,IAAI,GACJ,KAAK,GACL,eAAe,GACf,WAAW,GACX,YAAY,GACZ,aAAa,CAAC;YAClB,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,CAAC;IACF,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,kBAAkB,CAAC,EAAE,GAAG,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,aAAa,EAAE,WAAW,GAAG,oBAAoB,CAAC;IAClD,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,kCAAkC;IAClC,cAAc,CAAC,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH"}
@@ -4,8 +4,13 @@ export interface ScopeAnalysis {
4
4
  isolatedStructure: {
5
5
  [key: string]: string;
6
6
  };
7
+ /**
8
+ * Maps variable names to their equivalent paths.
9
+ * Supports multiple equivalencies per key (e.g., for OR expressions like `x = a || b`
10
+ * where x is equivalent to both a and b).
11
+ */
7
12
  isolatedEquivalentVariables: {
8
- [key: string]: string;
13
+ [key: string]: string | string[];
9
14
  };
10
15
  llmCalls: LlmCall[];
11
16
  environmentVariables: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"ScopeAnalysis.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScopeAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7C,2BAA2B,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACvD,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC"}
1
+ {"version":3,"file":"ScopeAnalysis.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScopeAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7C;;;;OAIG;IACH,2BAA2B,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC;IAClE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC"}
@@ -1189,11 +1189,20 @@ export default function constructMockCode(
1189
1189
  // Valid patterns where arrow function is NOT bare:
1190
1190
  // 1. Property value: "key: (arg) => ..." - ends with ':'
1191
1191
  // 2. Function argument: ".map((arg) => ..." - ends with '('
1192
+ // 3. Method call: "?.map" followed directly by the arrow function
1193
+ // In this case, the '(' is consumed by the arrow function regex match,
1194
+ // so beforeTrimmed ends with the method name (e.g., 'map'), not '('.
1195
+ // We detect this by checking if beforeTrimmed ends with an identifier
1196
+ // that could be a method name (preceded by '.' or '?.').
1192
1197
  // NOTE: We don't include ',' because "{ prop, () => {} }" is invalid
1193
1198
  // (can't distinguish function argument from object property context)
1194
1199
  const isPropertyValue = beforeTrimmed.endsWith(':');
1195
1200
  const isFunctionArg = beforeTrimmed.endsWith('(');
1196
- const hasPropertyName = isPropertyValue || isFunctionArg;
1201
+ // Check if before ends with a method call pattern like ".map" or "?.map"
1202
+ // The '(' after the method name is consumed by the arrow function regex
1203
+ const isMethodCallArg = /\??\.\w+$/.test(beforeTrimmed);
1204
+ const hasPropertyName =
1205
+ isPropertyValue || isFunctionArg || isMethodCallArg;
1197
1206
 
1198
1207
  if (!hasPropertyName) {
1199
1208
  // This is a bare arrow function - filter it out
@@ -1693,6 +1702,42 @@ export default function constructMockCode(
1693
1702
  return 0;
1694
1703
  });
1695
1704
 
1705
+ // OPTIMIZATION: Pre-compute prefix indexes for O(1) lookups instead of O(n) scans.
1706
+ // This reduces complexity from O(n²) to O(n) for large schemas (9k+ keys).
1707
+ //
1708
+ // 1. extendedReturnValuePrefixes: Set of all path prefixes that have a .functionCallReturnValue extension
1709
+ // Used by hasExtendedFunctionCallReturnValue check at line ~1754
1710
+ // 2. functionCallsWithReturnValue: Set of function call paths where .functionCallReturnValue IMMEDIATELY follows
1711
+ // Used by hasProperFunctionCallPath check at line ~1787
1712
+ // IMPORTANT: Only includes paths where the function call is directly followed by .functionCallReturnValue
1713
+ // e.g., "a.b().functionCallReturnValue" -> adds "a.b()" but NOT "a" even if "a" ends with ")"
1714
+ const extendedReturnValuePrefixes = new Set<string>();
1715
+ const functionCallsWithReturnValue = new Set<string>();
1716
+
1717
+ for (const k of relevantKeys) {
1718
+ const parts = splitOutsideParenthesesAndArrays(k);
1719
+ const returnValueIndex = parts.findIndex((part) =>
1720
+ part.startsWith(RETURN_VALUE),
1721
+ );
1722
+ if (returnValueIndex !== -1) {
1723
+ // Add all prefixes of k up to (but not including) functionCallReturnValue
1724
+ const prefix = joinParenthesesAndArrays(parts.slice(0, returnValueIndex));
1725
+ extendedReturnValuePrefixes.add(prefix);
1726
+
1727
+ // ONLY add to functionCallsWithReturnValue if functionCallReturnValue IMMEDIATELY follows
1728
+ if (prefix.endsWith(')')) {
1729
+ functionCallsWithReturnValue.add(prefix);
1730
+ }
1731
+
1732
+ // Also add intermediate prefixes for nested paths to extendedReturnValuePrefixes
1733
+ // This helps hasExtendedFunctionCallReturnValue which checks key + '.'
1734
+ for (let i = 1; i < returnValueIndex; i++) {
1735
+ const partialPrefix = joinParenthesesAndArrays(parts.slice(0, i));
1736
+ extendedReturnValuePrefixes.add(partialPrefix);
1737
+ }
1738
+ }
1739
+ }
1740
+
1696
1741
  for (const key of sortedKeys) {
1697
1742
  const value = relevantReturnValueSchema[key];
1698
1743
  const parts = splitOutsideParenthesesAndArrays(key);
@@ -1749,9 +1794,10 @@ export default function constructMockCode(
1749
1794
  // nested inside (e.g., methods on array elements passed as arguments).
1750
1795
  if (hasSignaturePath) continue;
1751
1796
 
1752
- const hasExtendedFunctionCallReturnValue = Object.keys(
1753
- relevantReturnValueSchema,
1754
- ).some((k) => k.startsWith(key + '.') && k.includes(`.${RETURN_VALUE}`));
1797
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1798
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes('.functionCallReturnValue'))
1799
+ const hasExtendedFunctionCallReturnValue =
1800
+ extendedReturnValuePrefixes.has(key);
1755
1801
 
1756
1802
  // Skip JSX components - they look like function calls (e.g., Context.Provider())
1757
1803
  // but they're React components used in JSX, not functions that need mocking
@@ -1780,11 +1826,10 @@ export default function constructMockCode(
1780
1826
  const functionCallPath = joinParenthesesAndArrays(
1781
1827
  parts.slice(0, i + 1),
1782
1828
  );
1783
- const hasProperFunctionCallPath = Object.keys(
1784
- relevantReturnValueSchema,
1785
- ).some((k) =>
1786
- k.startsWith(functionCallPath + '.functionCallReturnValue'),
1787
- );
1829
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1830
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'))
1831
+ const hasProperFunctionCallPath =
1832
+ functionCallsWithReturnValue.has(functionCallPath);
1788
1833
  if (hasProperFunctionCallPath) {
1789
1834
  // Skip this path - the .functionCallReturnValue path will handle it correctly
1790
1835
  shouldSkipKey = true;
@@ -336,6 +336,59 @@ const isBareTypeMarker = (value: unknown): boolean => {
336
336
  return false;
337
337
  };
338
338
 
339
+ /**
340
+ * Escape newlines that appear inside string literals within a code string,
341
+ * while preserving structural newlines (those between statements/lines of code).
342
+ *
343
+ * This handles cases where LLM generates function bodies like:
344
+ * - "() => { console.log('line1\nline2'); }" - escape the \n inside the string
345
+ * - "() => {\n console.log('x');\n}" - preserve structural \n between statements
346
+ * - "() => Promise.resolve('a\nb')" - escape the \n inside the string argument
347
+ *
348
+ * The algorithm tracks whether we're inside a string literal (single, double, or
349
+ * backtick quotes) and only escapes newlines that appear within quotes.
350
+ */
351
+ const escapeNewlinesInStringLiterals = (code: string): string => {
352
+ let result = '';
353
+ let inString = false;
354
+ let stringChar = ''; // The quote character that started the current string
355
+
356
+ for (let i = 0; i < code.length; i++) {
357
+ const char = code[i];
358
+ const prevChar = i > 0 ? code[i - 1] : '';
359
+
360
+ // Check for string literal boundaries (single, double, or backtick quotes)
361
+ // Skip escaped quotes (preceded by backslash)
362
+ if ((char === '"' || char === "'" || char === '`') && prevChar !== '\\') {
363
+ if (!inString) {
364
+ // Starting a string literal
365
+ inString = true;
366
+ stringChar = char;
367
+ } else if (char === stringChar) {
368
+ // Ending the current string literal
369
+ inString = false;
370
+ stringChar = '';
371
+ }
372
+ // If char is a different quote type while in a string, it's just a character
373
+ }
374
+
375
+ // Escape newlines only when inside a string literal
376
+ if (char === '\n') {
377
+ if (inString) {
378
+ // Inside a string literal - escape the newline
379
+ result += '\\n';
380
+ } else {
381
+ // Outside string - keep the structural newline
382
+ result += char;
383
+ }
384
+ } else {
385
+ result += char;
386
+ }
387
+ }
388
+
389
+ return result;
390
+ };
391
+
339
392
  /**
340
393
  * Normalize mock data by merging entries that have the same normalized function name.
341
394
  * e.g., "useLastLogLine(projectSlug, !!simulatingEntitySha)" and
@@ -734,13 +787,19 @@ const jsonToCode = (
734
787
  stringValue.startsWith('Promise.') ||
735
788
  stringValue.startsWith('new Promise');
736
789
 
790
+ // Check if the string contains newlines (potential issue for string literals)
791
+ const hasNewlines = stringValue.includes('\n');
792
+
737
793
  // Handle special type indicators that need transformation
738
794
  let outputValue: string;
739
795
  if (stringValue === 'promise' || looksLikePromise) {
740
796
  // The key is a function call (e.g., "revalidate()"), so output a function
741
797
  // that returns a Promise, not the Promise itself
798
+ // Important: Escape newlines inside Promise expressions to avoid
799
+ // "unterminated string literal" errors when the Promise contains
800
+ // multi-line string arguments like Promise.resolve('line1\nline2')
742
801
  const promiseExpr = looksLikePromise
743
- ? stringValue
802
+ ? stringValue.replace(/\n/g, '\\n')
744
803
  : 'Promise.resolve()';
745
804
  outputValue = `() => ${promiseExpr}`;
746
805
  console.log(
@@ -752,7 +811,19 @@ const jsonToCode = (
752
811
  `CodeYam: Nested func transform (string->function): "${key}" -> "${funcName}": () => {}`,
753
812
  );
754
813
  } else if (looksLikeFunction) {
755
- outputValue = stringValue;
814
+ // Handle newlines in function expressions:
815
+ // - Newlines inside string literals must be escaped to avoid
816
+ // "unterminated string literal" errors
817
+ // - Structural newlines (between statements) should be kept as-is
818
+ // to produce valid multi-line JavaScript
819
+ //
820
+ // We escape ONLY newlines that appear inside string literals (single,
821
+ // double, or template quotes). Structural newlines are preserved.
822
+ if (hasNewlines) {
823
+ outputValue = escapeNewlinesInStringLiterals(stringValue);
824
+ } else {
825
+ outputValue = stringValue;
826
+ }
756
827
  console.log(
757
828
  `CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
758
829
  );
@@ -957,11 +957,19 @@ options) {
957
957
  // Valid patterns where arrow function is NOT bare:
958
958
  // 1. Property value: "key: (arg) => ..." - ends with ':'
959
959
  // 2. Function argument: ".map((arg) => ..." - ends with '('
960
+ // 3. Method call: "?.map" followed directly by the arrow function
961
+ // In this case, the '(' is consumed by the arrow function regex match,
962
+ // so beforeTrimmed ends with the method name (e.g., 'map'), not '('.
963
+ // We detect this by checking if beforeTrimmed ends with an identifier
964
+ // that could be a method name (preceded by '.' or '?.').
960
965
  // NOTE: We don't include ',' because "{ prop, () => {} }" is invalid
961
966
  // (can't distinguish function argument from object property context)
962
967
  const isPropertyValue = beforeTrimmed.endsWith(':');
963
968
  const isFunctionArg = beforeTrimmed.endsWith('(');
964
- const hasPropertyName = isPropertyValue || isFunctionArg;
969
+ // Check if before ends with a method call pattern like ".map" or "?.map"
970
+ // The '(' after the method name is consumed by the arrow function regex
971
+ const isMethodCallArg = /\??\.\w+$/.test(beforeTrimmed);
972
+ const hasPropertyName = isPropertyValue || isFunctionArg || isMethodCallArg;
965
973
  if (!hasPropertyName) {
966
974
  // This is a bare arrow function - filter it out
967
975
  // Found arrow function start, need to find its end
@@ -1423,6 +1431,36 @@ options) {
1423
1431
  }
1424
1432
  return 0;
1425
1433
  });
1434
+ // OPTIMIZATION: Pre-compute prefix indexes for O(1) lookups instead of O(n) scans.
1435
+ // This reduces complexity from O(n²) to O(n) for large schemas (9k+ keys).
1436
+ //
1437
+ // 1. extendedReturnValuePrefixes: Set of all path prefixes that have a .functionCallReturnValue extension
1438
+ // Used by hasExtendedFunctionCallReturnValue check at line ~1754
1439
+ // 2. functionCallsWithReturnValue: Set of function call paths where .functionCallReturnValue IMMEDIATELY follows
1440
+ // Used by hasProperFunctionCallPath check at line ~1787
1441
+ // IMPORTANT: Only includes paths where the function call is directly followed by .functionCallReturnValue
1442
+ // e.g., "a.b().functionCallReturnValue" -> adds "a.b()" but NOT "a" even if "a" ends with ")"
1443
+ const extendedReturnValuePrefixes = new Set();
1444
+ const functionCallsWithReturnValue = new Set();
1445
+ for (const k of relevantKeys) {
1446
+ const parts = splitOutsideParenthesesAndArrays(k);
1447
+ const returnValueIndex = parts.findIndex((part) => part.startsWith(RETURN_VALUE));
1448
+ if (returnValueIndex !== -1) {
1449
+ // Add all prefixes of k up to (but not including) functionCallReturnValue
1450
+ const prefix = joinParenthesesAndArrays(parts.slice(0, returnValueIndex));
1451
+ extendedReturnValuePrefixes.add(prefix);
1452
+ // ONLY add to functionCallsWithReturnValue if functionCallReturnValue IMMEDIATELY follows
1453
+ if (prefix.endsWith(')')) {
1454
+ functionCallsWithReturnValue.add(prefix);
1455
+ }
1456
+ // Also add intermediate prefixes for nested paths to extendedReturnValuePrefixes
1457
+ // This helps hasExtendedFunctionCallReturnValue which checks key + '.'
1458
+ for (let i = 1; i < returnValueIndex; i++) {
1459
+ const partialPrefix = joinParenthesesAndArrays(parts.slice(0, i));
1460
+ extendedReturnValuePrefixes.add(partialPrefix);
1461
+ }
1462
+ }
1463
+ }
1426
1464
  for (const key of sortedKeys) {
1427
1465
  const value = relevantReturnValueSchema[key];
1428
1466
  const parts = splitOutsideParenthesesAndArrays(key);
@@ -1468,7 +1506,9 @@ options) {
1468
1506
  // nested inside (e.g., methods on array elements passed as arguments).
1469
1507
  if (hasSignaturePath)
1470
1508
  continue;
1471
- const hasExtendedFunctionCallReturnValue = Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes(`.${RETURN_VALUE}`));
1509
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1510
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes('.functionCallReturnValue'))
1511
+ const hasExtendedFunctionCallReturnValue = extendedReturnValuePrefixes.has(key);
1472
1512
  // Skip JSX components - they look like function calls (e.g., Context.Provider())
1473
1513
  // but they're React components used in JSX, not functions that need mocking
1474
1514
  // Check both the value type and whether the functionCallReturnValue is jsx-component
@@ -1493,7 +1533,9 @@ options) {
1493
1533
  // This part is a function call, and the next part is NOT .functionCallReturnValue
1494
1534
  // Check if there's any path with .functionCallReturnValue for this function call
1495
1535
  const functionCallPath = joinParenthesesAndArrays(parts.slice(0, i + 1));
1496
- const hasProperFunctionCallPath = Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'));
1536
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1537
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'))
1538
+ const hasProperFunctionCallPath = functionCallsWithReturnValue.has(functionCallPath);
1497
1539
  if (hasProperFunctionCallPath) {
1498
1540
  // Skip this path - the .functionCallReturnValue path will handle it correctly
1499
1541
  shouldSkipKey = true;