@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.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +2 -2
- package/analyzer-template/packages/ai/index.ts +6 -1
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +39 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +308 -50
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +15 -6
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +664 -242
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +20 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +35 -13
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +160 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +289 -83
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +269 -1
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +11 -3
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +297 -7
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +20 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +57 -13
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +29 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +35 -4
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +199 -17
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
- package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/package.json +1 -1
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/project/constructMockCode.ts +54 -9
- package/analyzer-template/project/writeMockDataTsx.ts +73 -2
- package/background/src/lib/virtualized/project/constructMockCode.js +45 -3
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +71 -2
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +146 -0
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +7 -5
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +22 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/reviewedRules.js +92 -0
- package/codeyam-cli/src/utils/reviewedRules.js.map +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-CX9f-5xM.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{manifest-7522edd4.js → manifest-bba56ec1.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-DuTFSyJ2.js +92 -0
- package/codeyam-cli/src/webserver/build/client/assets/{root-eVAaavTS.js → root-DTfSQARG.js} +6 -6
- package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-TD1f-DHV.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BQ-1XyEa.js +258 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/templates/codeyam:memory.md +174 -233
- package/codeyam-cli/templates/codeyam:new-rule.md +41 -2
- package/codeyam-cli/templates/rule-reflection-hook.py +161 -0
- package/codeyam-cli/templates/rules-instructions.md +126 -0
- package/package.json +1 -1
- package/packages/ai/index.js +2 -1
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +29 -12
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +239 -43
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +503 -165
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +22 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +34 -9
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +159 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +237 -73
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +195 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +10 -2
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +209 -3
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/mergeStatements.js +70 -51
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +13 -5
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +52 -10
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +25 -8
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +34 -4
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +168 -9
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
- package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
- package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
- 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]: {
|
package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"ScenariosDataStructure.d.ts","sourceRoot":"","sources":["../../../../../types/src/types/ScenariosDataStructure.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
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
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|