diff --git a/app/client/src/workers/common/DataTreeEvaluator/index.ts b/app/client/src/workers/common/DataTreeEvaluator/index.ts index 6bd7724111..2b8bdc569c 100644 --- a/app/client/src/workers/common/DataTreeEvaluator/index.ts +++ b/app/client/src/workers/common/DataTreeEvaluator/index.ts @@ -344,7 +344,8 @@ export default class DataTreeEvaluator { const evaluationOrder = this.sortedDependencies; // Evaluate const { evalMetaUpdates, evaluatedTree, staleMetaIds } = this.evaluateTree( - this.oldUnEvalTree, + //we need to deep clone oldUnEvalTree because evaluateTree will mutate it + klona(this.oldUnEvalTree), evaluationOrder, undefined, this.oldConfigTree, @@ -781,6 +782,7 @@ export default class DataTreeEvaluator { evaluatedTree: newEvalTree, staleMetaIds, } = this.evaluateTree( + // should not clone evalTree unnessarily because it is anyways being overwritten in the subsequent statement this.evalTree, evaluationOrder, { @@ -922,7 +924,7 @@ export default class DataTreeEvaluator { } evaluateTree( - oldUnevalTree: DataTree, + dataTree: DataTree, evaluationOrder: Array, options: { isFirstTree: boolean; @@ -939,9 +941,8 @@ export default class DataTreeEvaluator { evalMetaUpdates: EvalMetaUpdates; staleMetaIds: string[]; } { - const tree = klona(oldUnevalTree); errorModifier.updateAsyncFunctions( - tree, + dataTree, this.getConfigTree(), this.dependencyMap, ); @@ -1167,7 +1168,7 @@ export default class DataTreeEvaluator { return set(currentTree, fullPropertyPath, evalPropertyValue); } }, - tree, + dataTree, ); return { @@ -1180,7 +1181,7 @@ export default class DataTreeEvaluator { type: EvalErrorTypes.EVAL_TREE_ERROR, message: (error as Error).message, }); - return { evaluatedTree: tree, evalMetaUpdates, staleMetaIds: [] }; + return { evaluatedTree: dataTree, evalMetaUpdates, staleMetaIds: [] }; } } @@ -1465,7 +1466,9 @@ export default class DataTreeEvaluator { // setting parseValue in dataTree set(currentTree, fullPropertyPath, parsedValue); // setting evalPropertyValue in unParsedEvalTree - set(this.getUnParsedEvalTree(), fullPropertyPath, evalPropertyValue); + // cloning evalPropertyValue because parsedValue and evalPropertyValue could be equal, they both could share the same reference + //hence we are cloning evalPropertyValue to seperate them + set(this.getUnParsedEvalTree(), fullPropertyPath, klona(evalPropertyValue)); } reValidateWidgetDependentProperty({ diff --git a/app/client/src/workers/common/DataTreeEvaluator/test.ts b/app/client/src/workers/common/DataTreeEvaluator/test.ts index 7b78bbe691..1c4dc3ae3c 100644 --- a/app/client/src/workers/common/DataTreeEvaluator/test.ts +++ b/app/client/src/workers/common/DataTreeEvaluator/test.ts @@ -16,6 +16,7 @@ import { replaceThisDotParams } from "./utils"; import { isDataField } from "./utils"; import widgets from "widgets"; import type { WidgetConfiguration } from "WidgetProvider/constants"; +import { klona } from "klona"; const widgetConfigMap: Record< string, @@ -359,7 +360,7 @@ describe("DataTreeEvaluator", () => { nonDynamicFieldValidationOrder: nonDynamicFieldValidationOrder5, unEvalUpdates, } = dataTreeEvaluator.setupUpdateTree( - nestedArrayAccessorCyclicDependency.apiSuccessUnEvalTree, + klona(nestedArrayAccessorCyclicDependency.apiSuccessUnEvalTree), nestedArrayAccessorCyclicDependencyConfig.apiSuccessConfigTree, ); dataTreeEvaluator.evalAndValidateSubTree( @@ -423,7 +424,7 @@ describe("DataTreeEvaluator", () => { nonDynamicFieldValidationOrder, unEvalUpdates, } = dataTreeEvaluator.setupUpdateTree( - nestedArrayAccessorCyclicDependency.apiSuccessUnEvalTree, + klona(nestedArrayAccessorCyclicDependency.apiSuccessUnEvalTree), nestedArrayAccessorCyclicDependencyConfig.apiSuccessConfigTree, ); dataTreeEvaluator.evalAndValidateSubTree( @@ -470,7 +471,7 @@ describe("DataTreeEvaluator", () => { nonDynamicFieldValidationOrder: nonDynamicFieldValidationOrder2, unEvalUpdates, } = dataTreeEvaluator.setupUpdateTree( - nestedArrayAccessorCyclicDependency.apiSuccessUnEvalTree, + klona(nestedArrayAccessorCyclicDependency.apiSuccessUnEvalTree), nestedArrayAccessorCyclicDependencyConfig.apiSuccessConfigTree, ); dataTreeEvaluator.evalAndValidateSubTree(