From 8420f6c5faa6032765909bdde682f5af8116a1dc Mon Sep 17 00:00:00 2001 From: Anand Srinivasan <66776129+eco-monk@users.noreply.github.com> Date: Wed, 13 Apr 2022 11:07:46 +0530 Subject: [PATCH] fix: Js object - set async tag after all objects are parsed (#12684) * set isAsync after all parsing is done * clean up --- app/client/src/utils/JSPaneUtils.tsx | 2 + .../DataTreeEvaluator/DataTreeEvaluator.ts | 44 ++++++++++--------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/app/client/src/utils/JSPaneUtils.tsx b/app/client/src/utils/JSPaneUtils.tsx index f421d2f9c1..f4eeb58e15 100644 --- a/app/client/src/utils/JSPaneUtils.tsx +++ b/app/client/src/utils/JSPaneUtils.tsx @@ -9,6 +9,8 @@ export type ParsedJSSubAction = { body: string; arguments: Array; isAsync: boolean; + // parsedFunction - used only to determine if function is async + parsedFunction?: () => unknown; }; export type ParsedBody = { diff --git a/app/client/src/workers/DataTreeEvaluator/DataTreeEvaluator.ts b/app/client/src/workers/DataTreeEvaluator/DataTreeEvaluator.ts index 03fa6120a9..e5b2e9c914 100644 --- a/app/client/src/workers/DataTreeEvaluator/DataTreeEvaluator.ts +++ b/app/client/src/workers/DataTreeEvaluator/DataTreeEvaluator.ts @@ -73,7 +73,7 @@ import { Severity } from "entities/AppsmithConsole"; import { getLintingErrors } from "workers/lint"; import { error as logError } from "loglevel"; import { extractIdentifiersFromCode } from "workers/ast"; -import { JSUpdate } from "utils/JSPaneUtils"; +import { JSUpdate, ParsedJSSubAction } from "utils/JSPaneUtils"; import { addWidgetPropertyDependencies, overrideWidgetProperties, @@ -1021,7 +1021,7 @@ export default class DataTreeEvaluator { saveResolvedFunctionsAndJSUpdates( entity: DataTreeJSAction, - jsUpdates: Record, + jsUpdates: Record, unEvalDataTree: DataTree, entityName: string, ) { @@ -1034,7 +1034,7 @@ export default class DataTreeEvaluator { delete this.resolvedFunctions[`${entityName}`]; delete this.currentJSCollectionState[`${entityName}`]; if (result) { - const actions: any = []; + const actions: ParsedJSSubAction[] = []; const variables: any = []; Object.keys(result).forEach((unEvalFunc) => { const unEvalValue = result[unEvalFunc]; @@ -1055,7 +1055,8 @@ export default class DataTreeEvaluator { name: unEvalFunc, body: functionString, arguments: params, - value: unEvalValue, + parsedFunction: unEvalValue, + isAsync: false, }); } else { variables.push({ @@ -1070,23 +1071,9 @@ export default class DataTreeEvaluator { } }); - const modifiedActions = actions.map((action: any) => { - return { - name: action.name, - body: action.body, - arguments: action.arguments, - isAsync: isFunctionAsync( - action.value, - unEvalDataTree, - this.resolvedFunctions, - this.logs, - ), - }; - }); - const parsedBody = { body: entity.body, - actions: modifiedActions, + actions: actions, variables, }; _.set(jsUpdates, `${entityName}`, { @@ -1129,7 +1116,7 @@ export default class DataTreeEvaluator { differences?: DataTreeDiff[], oldUnEvalTree?: DataTree, ) { - let jsUpdates = {}; + let jsUpdates: Record = {}; if (!!differences && !!oldUnEvalTree) { differences.forEach((diff) => { const { entityName, propertyPath } = getEntityNameAndPropertyPath( @@ -1183,6 +1170,23 @@ export default class DataTreeEvaluator { ); }); } + Object.keys(jsUpdates).forEach((entityName) => { + const parsedBody = jsUpdates[entityName].parsedBody; + if (!parsedBody) return; + parsedBody.actions = parsedBody.actions.map((action) => { + return { + ...action, + isAsync: isFunctionAsync( + action.parsedFunction, + unEvalDataTree, + this.resolvedFunctions, + this.logs, + ), + // parsedFunction - used only to determine if function is async + parsedFunction: undefined, + } as ParsedJSSubAction; + }); + }); return { jsUpdates }; }