@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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"buildTimestamp": "2026-
|
|
3
|
-
"buildTime":
|
|
4
|
-
"gitCommit": "
|
|
2
|
+
"buildTimestamp": "2026-02-04T17:33:57.768Z",
|
|
3
|
+
"buildTime": 1770226437768,
|
|
4
|
+
"gitCommit": "483fdc20d9d24e266e9bca6a25b473ccb58957fd",
|
|
5
5
|
"nodeVersion": "v20.20.0",
|
|
6
|
-
"contentHash": "
|
|
7
|
-
"buildNumber":
|
|
8
|
-
"semanticVersion": "0.1.
|
|
9
|
-
"version": "0.1.
|
|
6
|
+
"contentHash": "21dbd7d480c0c50901df9ce172ec9316ac759c210f7ad6216cdfbd7d9f65446e",
|
|
7
|
+
"buildNumber": 563,
|
|
8
|
+
"semanticVersion": "0.1.563",
|
|
9
|
+
"version": "0.1.563 (2026-02-04T17:33+21dbd7d)"
|
|
10
10
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
[
|
|
3
|
-
[
|
|
2
|
+
[2/4/2026, 5:33:57 PM] > codeyam-combo@1.0.0 mergeDependencies
|
|
3
|
+
[2/4/2026, 5:33:57 PM] > node ./scripts/mergePackageJsonFiles.cjs
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
[
|
|
6
|
+
[2/4/2026, 5:33:57 PM] Merged dependencies into root package.json
|
|
7
7
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"build": "tsc && node ./scripts/postbuild.cjs"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@aws-sdk/client-cloudwatch-logs": "^3.
|
|
10
|
+
"@aws-sdk/client-cloudwatch-logs": "^3.980.0",
|
|
11
11
|
"@aws-sdk/client-cloudfront": "^3.966.0",
|
|
12
12
|
"@aws-sdk/client-codebuild": "^3.948.0",
|
|
13
13
|
"@aws-sdk/client-dynamodb": "^3.956.0",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@types/jest": "^30.0.0",
|
|
65
65
|
"@types/pg": "^8.15.5",
|
|
66
66
|
"@types/ws": "^8.18.1",
|
|
67
|
-
"@octokit/types": "^
|
|
67
|
+
"@octokit/types": "^16.0.0",
|
|
68
68
|
"@types/react": "^19.2.7",
|
|
69
69
|
"@types/react-dom": "^19.2.3",
|
|
70
70
|
"@types/react-resizable": "^3.0.7",
|
|
@@ -57,8 +57,13 @@ export {
|
|
|
57
57
|
removeDuplicateFunctionCalls,
|
|
58
58
|
} from './src/lib/dataStructure/helpers/cleanNonObjectFunctions';
|
|
59
59
|
export { default as convertDotNotation } from './src/lib/dataStructure/helpers/convertDotNotation';
|
|
60
|
+
export { default as convertTypeAnnotationsToValues } from './src/lib/dataStructure/helpers/convertTypeAnnotationsToValues';
|
|
60
61
|
export { default as cleanOutBoundary } from './src/lib/cleanOutBoundary';
|
|
61
|
-
export {
|
|
62
|
+
export {
|
|
63
|
+
fillInDirectSchemaGapsAndUnknowns,
|
|
64
|
+
buildSchemaIndexes,
|
|
65
|
+
type SchemaIndexes,
|
|
66
|
+
} from './src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns';
|
|
62
67
|
export { default as deduplicateFunctionSchemas } from './src/lib/dataStructure/helpers/deduplicateFunctionSchemas';
|
|
63
68
|
export { default as getConditionalUsagesFromCode } from './src/lib/getConditionalUsagesFromCode';
|
|
64
69
|
export type {
|
|
@@ -372,7 +372,7 @@ export async function analyzeScopeLocal({
|
|
|
372
372
|
}
|
|
373
373
|
|
|
374
374
|
for (const mapping of [structure, equivalentVariables]) {
|
|
375
|
-
for (let [key,
|
|
375
|
+
for (let [key, rawValue] of Object.entries(mapping)) {
|
|
376
376
|
for (const [childScopeId, childScope] of sortedEntries) {
|
|
377
377
|
const scopeText = fileAnalyzer.sourceFile.text.slice(
|
|
378
378
|
childScope.start,
|
|
@@ -392,27 +392,49 @@ export async function analyzeScopeLocal({
|
|
|
392
392
|
return text;
|
|
393
393
|
};
|
|
394
394
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
if (
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
395
|
+
// Handle both string and string[] values (for OR expressions)
|
|
396
|
+
const processValue = (value: string): string => {
|
|
397
|
+
if (value.includes(scopeText)) {
|
|
398
|
+
// DEBUG: Log when replacement happens
|
|
399
|
+
if (key.includes('Fetcher') || key.includes('fetcher')) {
|
|
400
|
+
console.log(
|
|
401
|
+
'CodeYam DEBUG value replacement:',
|
|
402
|
+
JSON.stringify({
|
|
403
|
+
key,
|
|
404
|
+
oldValue: value,
|
|
405
|
+
childScopeId,
|
|
406
|
+
scopeTextPreview: scopeText.slice(0, 50),
|
|
407
|
+
}),
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
return replaceChildScopeId(value);
|
|
411
|
+
}
|
|
412
|
+
return value;
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
if (Array.isArray(rawValue)) {
|
|
416
|
+
const newValues = rawValue.map(processValue);
|
|
417
|
+
(mapping as Record<string, string | string[]>)[key] =
|
|
418
|
+
newValues;
|
|
419
|
+
rawValue = newValues;
|
|
420
|
+
} else if (typeof rawValue === 'string') {
|
|
421
|
+
const newValue = processValue(rawValue);
|
|
422
|
+
if (newValue !== rawValue) {
|
|
423
|
+
(mapping as Record<string, string | string[]>)[key] =
|
|
424
|
+
newValue;
|
|
425
|
+
rawValue = newValue;
|
|
407
426
|
}
|
|
408
|
-
value = replaceChildScopeId(value);
|
|
409
|
-
mapping[key] = value;
|
|
410
427
|
}
|
|
428
|
+
|
|
411
429
|
if (key.includes(scopeText)) {
|
|
412
430
|
const oldKey = key;
|
|
413
431
|
key = replaceChildScopeId(key);
|
|
414
|
-
mapping[key] =
|
|
415
|
-
|
|
432
|
+
(mapping as Record<string, string | string[]>)[key] = (
|
|
433
|
+
mapping as Record<string, string | string[]>
|
|
434
|
+
)[oldKey];
|
|
435
|
+
delete (mapping as Record<string, string | string[]>)[
|
|
436
|
+
oldKey
|
|
437
|
+
];
|
|
416
438
|
}
|
|
417
439
|
}
|
|
418
440
|
}
|
|
@@ -102,7 +102,7 @@ import { ThrowStatementHandler } from './patterns/throwStatementHandler';
|
|
|
102
102
|
*/
|
|
103
103
|
export class ASTScopeAnalyzer {
|
|
104
104
|
private structure: Record<string, string> = {};
|
|
105
|
-
private equivalentVariables: Record<string, string> = {};
|
|
105
|
+
private equivalentVariables: Record<string, string | string[]> = {};
|
|
106
106
|
private environmentVariables: string[] = [];
|
|
107
107
|
private conditionalUsages: Record<string, ConditionalUsage[]> = {};
|
|
108
108
|
private compoundConditionals: CompoundConditional[] = [];
|
|
@@ -235,6 +235,8 @@ export class ASTScopeAnalyzer {
|
|
|
235
235
|
typeChecker: this.fileAnalyzer.typeChecker,
|
|
236
236
|
addEquivalence: (leftSide, rightSide) =>
|
|
237
237
|
this.addEquivalence(leftSide, rightSide),
|
|
238
|
+
addMultipleEquivalencies: (leftSide, rightSides) =>
|
|
239
|
+
this.addMultipleEquivalencies(leftSide, rightSides),
|
|
238
240
|
addType: (path, type) => this.addType(path, type),
|
|
239
241
|
addEnvironmentVariable: (variablePath) =>
|
|
240
242
|
this.addEnvironmentVariable(variablePath),
|
|
@@ -592,7 +594,9 @@ export class ASTScopeAnalyzer {
|
|
|
592
594
|
}
|
|
593
595
|
|
|
594
596
|
/**
|
|
595
|
-
* Adds an equivalence relationship between two variable paths
|
|
597
|
+
* Adds an equivalence relationship between two variable paths.
|
|
598
|
+
* Uses overwrite semantics - if an equivalence already exists, the new value replaces it
|
|
599
|
+
* (unless the new value is 'undefined' or 'null').
|
|
596
600
|
*/
|
|
597
601
|
private addEquivalence(
|
|
598
602
|
leftSide: StructuredPath,
|
|
@@ -622,6 +626,44 @@ export class ASTScopeAnalyzer {
|
|
|
622
626
|
}
|
|
623
627
|
}
|
|
624
628
|
|
|
629
|
+
/**
|
|
630
|
+
* Adds multiple equivalence relationships for a single variable path.
|
|
631
|
+
* Used for OR expressions like `x = a || b` where x is equivalent to both a and b.
|
|
632
|
+
* The values are stored as an array to track all possible sources.
|
|
633
|
+
*/
|
|
634
|
+
private addMultipleEquivalencies(
|
|
635
|
+
leftSide: StructuredPath,
|
|
636
|
+
rightSides: StructuredPath[],
|
|
637
|
+
): void {
|
|
638
|
+
if (leftSide?.isLiteral()) {
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
const leftSideStr = leftSide?.toLeftHandSideString();
|
|
643
|
+
if (!leftSideStr) return;
|
|
644
|
+
|
|
645
|
+
// Filter out invalid paths and convert to strings
|
|
646
|
+
const validRightSides = rightSides
|
|
647
|
+
.map((r) => r?.toRightHandSideString())
|
|
648
|
+
.filter((r): r is string => !!r && r !== leftSideStr);
|
|
649
|
+
|
|
650
|
+
// Remove duplicates while preserving order
|
|
651
|
+
const uniqueRightSides = [...new Set(validRightSides)];
|
|
652
|
+
|
|
653
|
+
// Filter out 'undefined' and 'null' unless they're the only values
|
|
654
|
+
const meaningfulValues = uniqueRightSides.filter(
|
|
655
|
+
(v) => v !== 'undefined' && v !== 'null',
|
|
656
|
+
);
|
|
657
|
+
const finalValues =
|
|
658
|
+
meaningfulValues.length > 0 ? meaningfulValues : uniqueRightSides;
|
|
659
|
+
|
|
660
|
+
if (finalValues.length === 0) return;
|
|
661
|
+
|
|
662
|
+
// Store as single value if only one, otherwise as array
|
|
663
|
+
this.equivalentVariables[leftSideStr] =
|
|
664
|
+
finalValues.length === 1 ? finalValues[0] : finalValues;
|
|
665
|
+
}
|
|
666
|
+
|
|
625
667
|
/**
|
|
626
668
|
* Adds a type for a variable path
|
|
627
669
|
*/
|
|
@@ -785,22 +827,38 @@ export class ASTScopeAnalyzer {
|
|
|
785
827
|
// Update the type for the given path
|
|
786
828
|
this.structure[pathStr] = newType;
|
|
787
829
|
|
|
788
|
-
// Also update the type for any equivalent path
|
|
830
|
+
// Also update the type for any equivalent path(s)
|
|
789
831
|
// e.g., if "state" -> "signature[0]", update "signature[0]" as well
|
|
790
|
-
const
|
|
791
|
-
|
|
792
|
-
|
|
832
|
+
const rawEquivalentPath = this.equivalentVariables[pathStr];
|
|
833
|
+
const equivalentPaths = Array.isArray(rawEquivalentPath)
|
|
834
|
+
? rawEquivalentPath
|
|
835
|
+
: rawEquivalentPath
|
|
836
|
+
? [rawEquivalentPath]
|
|
837
|
+
: [];
|
|
838
|
+
for (const equivalentPath of equivalentPaths) {
|
|
839
|
+
if (typeof equivalentPath === 'string') {
|
|
840
|
+
this.structure[equivalentPath] = newType;
|
|
841
|
+
}
|
|
793
842
|
}
|
|
794
843
|
|
|
795
844
|
// For property paths like "data.status", check if the base has an equivalence
|
|
796
845
|
// e.g., if "data" -> "signature[0]", transform "data.status" to "signature[0].status"
|
|
797
|
-
for (const [varPath,
|
|
846
|
+
for (const [varPath, rawEquivalence] of Object.entries(
|
|
798
847
|
this.equivalentVariables,
|
|
799
848
|
)) {
|
|
800
849
|
if (pathStr.startsWith(varPath + '.')) {
|
|
850
|
+
const equivalences = Array.isArray(rawEquivalence)
|
|
851
|
+
? rawEquivalence
|
|
852
|
+
: rawEquivalence
|
|
853
|
+
? [rawEquivalence]
|
|
854
|
+
: [];
|
|
801
855
|
const suffix = pathStr.slice(varPath.length);
|
|
802
|
-
const
|
|
803
|
-
|
|
856
|
+
for (const equivalence of equivalences) {
|
|
857
|
+
if (typeof equivalence === 'string') {
|
|
858
|
+
const transformedPath = equivalence + suffix;
|
|
859
|
+
this.structure[transformedPath] = newType;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
804
862
|
}
|
|
805
863
|
}
|
|
806
864
|
}
|