2023-04-07 07:41:36 +00:00
|
|
|
import { dataTreeEvaluator } from "./handlers/evalTree";
|
|
|
|
|
import type { EvalMetaUpdates } from "@appsmith/workers/common/DataTreeEvaluator/types";
|
|
|
|
|
import { makeEntityConfigsAsObjProperties } from "@appsmith/workers/Evaluation/dataTreeUtils";
|
2024-06-27 06:38:53 +00:00
|
|
|
import type {
|
|
|
|
|
EvalTreeResponseData,
|
|
|
|
|
EvalWorkerSyncRequest,
|
|
|
|
|
UpdateTreeResponse,
|
|
|
|
|
} from "./types";
|
2023-04-07 07:41:36 +00:00
|
|
|
import { MessageType, sendMessage } from "utils/MessageUtil";
|
|
|
|
|
import { MAIN_THREAD_ACTION } from "@appsmith/workers/Evaluation/evalWorkerActions";
|
|
|
|
|
import type { UpdateDataTreeMessageData } from "sagas/EvalWorkerActionSagas";
|
2024-03-27 09:07:46 +00:00
|
|
|
import {
|
|
|
|
|
generateOptimisedUpdatesAndSetPrevState,
|
|
|
|
|
getNewDataTreeUpdates,
|
|
|
|
|
uniqueOrderUpdatePaths,
|
|
|
|
|
} from "./helpers";
|
2024-06-18 09:45:24 +00:00
|
|
|
import type { DataTreeDiff } from "@appsmith/workers/Evaluation/evaluationUtils";
|
2024-06-27 06:38:53 +00:00
|
|
|
import type DataTreeEvaluator from "workers/common/DataTreeEvaluator";
|
2024-06-18 09:45:24 +00:00
|
|
|
|
|
|
|
|
const getDefaultEvalResponse = (): EvalTreeResponseData => ({
|
|
|
|
|
updates: "[]",
|
|
|
|
|
dependencies: {},
|
|
|
|
|
errors: [],
|
|
|
|
|
evalMetaUpdates: [],
|
|
|
|
|
evaluationOrder: [],
|
|
|
|
|
jsUpdates: {},
|
|
|
|
|
logs: [],
|
|
|
|
|
unEvalUpdates: [],
|
|
|
|
|
isCreateFirstTree: false,
|
|
|
|
|
staleMetaIds: [],
|
|
|
|
|
removedPaths: [],
|
|
|
|
|
isNewWidgetAdded: false,
|
|
|
|
|
undefinedEvalValuesMap: {},
|
|
|
|
|
jsVarsCreatedEvent: [],
|
|
|
|
|
});
|
2023-04-07 07:41:36 +00:00
|
|
|
|
2023-07-08 14:07:26 +00:00
|
|
|
export function evalTreeWithChanges(
|
2024-06-27 06:38:53 +00:00
|
|
|
request: EvalWorkerSyncRequest<{
|
|
|
|
|
metaUpdates?: EvalMetaUpdates;
|
|
|
|
|
updatedValuePaths: string[][];
|
|
|
|
|
}>,
|
2023-07-08 14:07:26 +00:00
|
|
|
) {
|
2024-06-27 06:38:53 +00:00
|
|
|
const { data } = request;
|
|
|
|
|
const { metaUpdates = [], updatedValuePaths } = data;
|
|
|
|
|
|
|
|
|
|
const pathsToSkipFromEval = updatedValuePaths.map((path) => path.join("."));
|
|
|
|
|
|
2024-06-18 09:45:24 +00:00
|
|
|
let setupUpdateTreeResponse = {} as UpdateTreeResponse;
|
2023-04-07 07:41:36 +00:00
|
|
|
if (dataTreeEvaluator) {
|
2024-06-27 06:38:53 +00:00
|
|
|
setupUpdateTreeResponse = dataTreeEvaluator.setupUpdateTreeWithDifferences(
|
|
|
|
|
updatedValuePaths,
|
|
|
|
|
pathsToSkipFromEval,
|
|
|
|
|
);
|
2024-06-18 09:45:24 +00:00
|
|
|
}
|
2023-04-07 07:41:36 +00:00
|
|
|
|
2024-06-18 09:45:24 +00:00
|
|
|
evaluateAndPushResponse(
|
|
|
|
|
dataTreeEvaluator,
|
|
|
|
|
setupUpdateTreeResponse,
|
|
|
|
|
metaUpdates,
|
2024-06-27 06:38:53 +00:00
|
|
|
pathsToSkipFromEval,
|
2024-06-18 09:45:24 +00:00
|
|
|
);
|
|
|
|
|
}
|
2023-07-08 14:07:26 +00:00
|
|
|
|
2024-06-18 09:45:24 +00:00
|
|
|
export const getAffectedNodesInTheDataTree = (
|
|
|
|
|
unEvalUpdates: DataTreeDiff[],
|
|
|
|
|
evalOrder: string[],
|
|
|
|
|
) => {
|
2024-03-27 09:07:46 +00:00
|
|
|
const allUnevalUpdates = unEvalUpdates.map(
|
|
|
|
|
(update) => update.payload.propertyPath,
|
|
|
|
|
);
|
2024-06-18 09:45:24 +00:00
|
|
|
// merge unevalUpdate paths and evalOrder paths
|
|
|
|
|
return uniqueOrderUpdatePaths([...allUnevalUpdates, ...evalOrder]);
|
|
|
|
|
};
|
2024-03-27 09:07:46 +00:00
|
|
|
|
2024-06-18 09:45:24 +00:00
|
|
|
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,
|
|
|
|
|
unevalTree: {},
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
const unevalTree = dataTreeEvaluator.getOldUnevalTree();
|
|
|
|
|
|
|
|
|
|
// 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,
|
2024-03-27 09:07:46 +00:00
|
|
|
dataTree,
|
|
|
|
|
);
|
2024-06-18 09:45:24 +00:00
|
|
|
// 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,
|
|
|
|
|
);
|
2023-04-07 07:41:36 +00:00
|
|
|
|
2024-06-18 09:45:24 +00:00
|
|
|
defaultResponse.updates = generateOptimisedUpdatesAndSetPrevState(
|
2023-04-07 07:41:36 +00:00
|
|
|
dataTree,
|
2023-08-16 05:34:32 +00:00
|
|
|
dataTreeEvaluator,
|
2024-06-18 09:45:24 +00:00
|
|
|
affectedNodePaths,
|
|
|
|
|
additionalUpdates,
|
2023-08-16 05:34:32 +00:00
|
|
|
);
|
2024-06-18 09:45:24 +00:00
|
|
|
dataTreeEvaluator.undefinedEvalValuesMap =
|
|
|
|
|
dataTreeEvaluator.undefinedEvalValuesMap || {};
|
2024-03-27 09:07:46 +00:00
|
|
|
|
2024-06-18 09:45:24 +00:00
|
|
|
return {
|
|
|
|
|
workerResponse: defaultResponse,
|
2023-05-22 06:17:23 +00:00
|
|
|
unevalTree,
|
2023-04-07 07:41:36 +00:00
|
|
|
};
|
2024-06-18 09:45:24 +00:00
|
|
|
};
|
2024-06-27 06:38:53 +00:00
|
|
|
|
|
|
|
|
export const pushResponseToMainThread = (data: UpdateDataTreeMessageData) => {
|
|
|
|
|
sendMessage.call(self, {
|
|
|
|
|
messageType: MessageType.DEFAULT,
|
|
|
|
|
body: {
|
|
|
|
|
data,
|
|
|
|
|
method: MAIN_THREAD_ACTION.UPDATE_DATATREE,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|