## Description evalTreeWithChanges is sending a redundant property unevalTree in the payload, we should remove this property to reduce the serialisation cost of including this property in the payload. Fixes #34766 > [!WARNING] > _If no issue exists, please create an issue first, and check with the maintainers if the issue is valid._ ## Automation /ok-to-test tags="@tag.All" ### 🔍 Cypress test results <!-- This is an auto-generated comment: Cypress test results --> > [!CAUTION] > 🔴 🔴 🔴 Some tests have failed. > Workflow run: <https://github.com/appsmithorg/appsmith/actions/runs/9807127090> > Commit: 73e226d70644bd0995e5c1c0b5b1d9c73e93e83a > <a href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=9807127090&attempt=1&selectiontype=test&testsstatus=failed&specsstatus=fail" target="_blank">Cypress dashboard</a>. > Tags: @tag.All > The following are new failures, please fix them before merging the PR: <ol> > <li>cypress/e2e/Regression/ClientSide/PartialImportExport/PartialExport_spec.ts > <li>cypress/e2e/Regression/ClientSide/Workspace/MemberRoles_Spec.ts > <li>cypress/e2e/Regression/ClientSide/Workspace/ShareAppTests_Spec.ts</ol> > <a href="https://internal.appsmith.com/app/cypress-dashboard/identified-flaky-tests-65890b3c81d7400d08fa9ee3?branch=master" target="_blank">List of identified flaky tests</a>. > <hr>Fri, 05 Jul 2024 11:46:05 UTC <!-- end of auto-generated comment: Cypress test results --> ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Refactor** - Improved the handling of `unevalTree` by accessing it from `unEvalAndConfigTree` instead of directly from the message data in message handling logic. - **Tests** - Updated tests to reflect the removal of the `unevalTree` property and related assertions. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
172 lines
5.0 KiB
TypeScript
172 lines
5.0 KiB
TypeScript
import { dataTreeEvaluator } from "./handlers/evalTree";
|
|
import type { EvalMetaUpdates } from "@appsmith/workers/common/DataTreeEvaluator/types";
|
|
import { makeEntityConfigsAsObjProperties } from "@appsmith/workers/Evaluation/dataTreeUtils";
|
|
import type {
|
|
EvalTreeResponseData,
|
|
EvalWorkerSyncRequest,
|
|
UpdateTreeResponse,
|
|
} from "./types";
|
|
import { MessageType, sendMessage } from "utils/MessageUtil";
|
|
import { MAIN_THREAD_ACTION } from "@appsmith/workers/Evaluation/evalWorkerActions";
|
|
import type { UpdateDataTreeMessageData } from "sagas/EvalWorkerActionSagas";
|
|
import {
|
|
generateOptimisedUpdatesAndSetPrevState,
|
|
getNewDataTreeUpdates,
|
|
uniqueOrderUpdatePaths,
|
|
} from "./helpers";
|
|
import type { DataTreeDiff } from "@appsmith/workers/Evaluation/evaluationUtils";
|
|
import type DataTreeEvaluator from "workers/common/DataTreeEvaluator";
|
|
|
|
const getDefaultEvalResponse = (): EvalTreeResponseData => ({
|
|
updates: "[]",
|
|
dependencies: {},
|
|
errors: [],
|
|
evalMetaUpdates: [],
|
|
evaluationOrder: [],
|
|
jsUpdates: {},
|
|
logs: [],
|
|
unEvalUpdates: [],
|
|
isCreateFirstTree: false,
|
|
staleMetaIds: [],
|
|
removedPaths: [],
|
|
isNewWidgetAdded: false,
|
|
undefinedEvalValuesMap: {},
|
|
jsVarsCreatedEvent: [],
|
|
});
|
|
|
|
export function evalTreeWithChanges(
|
|
request: EvalWorkerSyncRequest<{
|
|
metaUpdates?: EvalMetaUpdates;
|
|
updatedValuePaths: string[][];
|
|
}>,
|
|
) {
|
|
const { data } = request;
|
|
const { metaUpdates = [], updatedValuePaths } = data;
|
|
|
|
const pathsToSkipFromEval = updatedValuePaths.map((path) => path.join("."));
|
|
|
|
let setupUpdateTreeResponse = {} as UpdateTreeResponse;
|
|
if (dataTreeEvaluator) {
|
|
setupUpdateTreeResponse = dataTreeEvaluator.setupUpdateTreeWithDifferences(
|
|
updatedValuePaths,
|
|
pathsToSkipFromEval,
|
|
);
|
|
}
|
|
|
|
evaluateAndPushResponse(
|
|
dataTreeEvaluator,
|
|
setupUpdateTreeResponse,
|
|
metaUpdates,
|
|
pathsToSkipFromEval,
|
|
);
|
|
}
|
|
|
|
export const getAffectedNodesInTheDataTree = (
|
|
unEvalUpdates: DataTreeDiff[],
|
|
evalOrder: string[],
|
|
) => {
|
|
const allUnevalUpdates = unEvalUpdates.map(
|
|
(update) => update.payload.propertyPath,
|
|
);
|
|
// merge unevalUpdate paths and evalOrder paths
|
|
return uniqueOrderUpdatePaths([...allUnevalUpdates, ...evalOrder]);
|
|
};
|
|
|
|
export const evaluateAndPushResponse = (
|
|
dataTreeEvaluator: DataTreeEvaluator | undefined,
|
|
setupUpdateTreeResponse: UpdateTreeResponse,
|
|
metaUpdates: EvalMetaUpdates,
|
|
additionalPathsAddedAsUpdates: string[],
|
|
) => {
|
|
const response = evaluateAndGenerateResponse(
|
|
dataTreeEvaluator,
|
|
setupUpdateTreeResponse,
|
|
metaUpdates,
|
|
additionalPathsAddedAsUpdates,
|
|
);
|
|
return pushResponseToMainThread(response);
|
|
};
|
|
|
|
export const evaluateAndGenerateResponse = (
|
|
dataTreeEvaluator: DataTreeEvaluator | undefined,
|
|
setupUpdateTreeResponse: UpdateTreeResponse,
|
|
metaUpdates: EvalMetaUpdates,
|
|
additionalPathsAddedAsUpdates: string[],
|
|
): UpdateDataTreeMessageData => {
|
|
// generate default response first and later add updates to it
|
|
const defaultResponse = getDefaultEvalResponse();
|
|
|
|
if (!dataTreeEvaluator) {
|
|
const updates = generateOptimisedUpdatesAndSetPrevState(
|
|
{},
|
|
dataTreeEvaluator,
|
|
[],
|
|
);
|
|
defaultResponse.updates = updates;
|
|
defaultResponse.evalMetaUpdates = [...(metaUpdates || [])];
|
|
return {
|
|
workerResponse: defaultResponse,
|
|
};
|
|
}
|
|
|
|
const { evalOrder, jsUpdates, unEvalUpdates } = setupUpdateTreeResponse;
|
|
defaultResponse.evaluationOrder = evalOrder;
|
|
defaultResponse.unEvalUpdates = unEvalUpdates;
|
|
defaultResponse.jsUpdates = jsUpdates;
|
|
|
|
const updateResponse = dataTreeEvaluator.evalAndValidateSubTree(
|
|
evalOrder,
|
|
dataTreeEvaluator.oldConfigTree,
|
|
unEvalUpdates,
|
|
);
|
|
|
|
const dataTree = makeEntityConfigsAsObjProperties(
|
|
dataTreeEvaluator.evalTree,
|
|
{
|
|
evalProps: dataTreeEvaluator.evalProps,
|
|
},
|
|
);
|
|
|
|
/** Make sure evalMetaUpdates is sanitized to prevent postMessage failure */
|
|
defaultResponse.evalMetaUpdates = JSON.parse(
|
|
JSON.stringify([...(metaUpdates || []), ...updateResponse.evalMetaUpdates]),
|
|
);
|
|
|
|
defaultResponse.staleMetaIds = updateResponse.staleMetaIds;
|
|
|
|
// when additional paths are required to be added as updates, we extract the updates from the data tree using these paths.
|
|
const additionalUpdates = getNewDataTreeUpdates(
|
|
additionalPathsAddedAsUpdates,
|
|
dataTree,
|
|
);
|
|
// the affected paths is a combination of the eval order and the uneval updates
|
|
// we use this collection to limit the diff between the old and new data tree
|
|
const affectedNodePaths = getAffectedNodesInTheDataTree(
|
|
unEvalUpdates,
|
|
evalOrder,
|
|
);
|
|
|
|
defaultResponse.updates = generateOptimisedUpdatesAndSetPrevState(
|
|
dataTree,
|
|
dataTreeEvaluator,
|
|
affectedNodePaths,
|
|
additionalUpdates,
|
|
);
|
|
dataTreeEvaluator.undefinedEvalValuesMap =
|
|
dataTreeEvaluator.undefinedEvalValuesMap || {};
|
|
|
|
return {
|
|
workerResponse: defaultResponse,
|
|
};
|
|
};
|
|
|
|
export const pushResponseToMainThread = (data: UpdateDataTreeMessageData) => {
|
|
sendMessage.call(self, {
|
|
messageType: MessageType.DEFAULT,
|
|
body: {
|
|
data,
|
|
method: MAIN_THREAD_ACTION.UPDATE_DATATREE,
|
|
},
|
|
});
|
|
};
|