import { ActionDataState, ActionDataWithMeta, } from "reducers/entityReducers/actionsReducer"; import { WidgetProps } from "widgets/BaseWidget"; import { ActionResponse } from "api/ActionAPI"; import { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; import { MetaState } from "reducers/entityReducers/metaReducer"; import { PageListPayload } from "constants/ReduxActionConstants"; import { ActionConfig, PluginType } from "entities/Action"; import { AppDataState } from "reducers/entityReducers/appReducer"; import { DependencyMap, DynamicPath } from "utils/DynamicBindingUtils"; import { generateDataTreeAction } from "entities/DataTree/dataTreeAction"; import { generateDataTreeJSAction } from "entities/DataTree/dataTreeJSAction"; import { generateDataTreeWidget } from "entities/DataTree/dataTreeWidget"; import { JSCollectionDataState } from "reducers/entityReducers/jsActionsReducer"; import { ValidationConfig } from "constants/PropertyControlConstants"; import { Variable } from "entities/JSCollection"; import { ActionDescription, ClearPluginActionDescription, RunPluginActionDescription, } from "entities/DataTree/actionTriggers"; export type ActionDispatcher = ( ...args: any[] ) => Promise | ActionDescription; export enum ENTITY_TYPE { ACTION = "ACTION", WIDGET = "WIDGET", APPSMITH = "APPSMITH", JSACTION = "JSACTION", } export enum EvaluationSubstitutionType { TEMPLATE = "TEMPLATE", PARAMETER = "PARAMETER", SMART_SUBSTITUTE = "SMART_SUBSTITUTE", } export interface DataTreeAction extends Omit { data: ActionResponse["body"]; actionId: string; config: Partial; pluginType: PluginType; name: string; run: ActionDispatcher | RunPluginActionDescription | Record; clear: | ActionDispatcher | ClearPluginActionDescription | Record; dynamicBindingPathList: DynamicPath[]; bindingPaths: Record; ENTITY_TYPE: ENTITY_TYPE.ACTION; dependencyMap: DependencyMap; logBlackList: Record; } export interface DataTreeJSAction { pluginType: PluginType.JS; name: string; ENTITY_TYPE: ENTITY_TYPE.JSACTION; body: string; [propName: string]: any; meta: Record; dynamicBindingPathList: DynamicPath[]; bindingPaths: Record; variables: Array; dependencyMap: DependencyMap; } export interface MetaArgs { arguments: Variable[]; } export interface DataTreeWidget extends WidgetProps { bindingPaths: Record; triggerPaths: Record; validationPaths: Record; ENTITY_TYPE: ENTITY_TYPE.WIDGET; logBlackList: Record; } export interface DataTreeAppsmith extends Omit { ENTITY_TYPE: ENTITY_TYPE.APPSMITH; store: Record; } export type DataTreeObjectEntity = | DataTreeAction | DataTreeJSAction | DataTreeWidget | DataTreeAppsmith; export type DataTreeEntity = | DataTreeObjectEntity | PageListPayload | ActionDispatcher; export type DataTree = { [entityName: string]: DataTreeEntity; }; type DataTreeSeed = { actions: ActionDataState; editorConfigs: Record; pluginDependencyConfig: Record; widgets: CanvasWidgetsReduxState; widgetsMeta: MetaState; pageList: PageListPayload; appData: AppDataState; jsActions: JSCollectionDataState; }; export class DataTreeFactory { static create({ actions, appData, editorConfigs, jsActions, pageList, pluginDependencyConfig, widgets, widgetsMeta, }: DataTreeSeed): DataTree { const dataTree: DataTree = {}; actions.forEach((action) => { const editorConfig = editorConfigs[action.config.pluginId]; const dependencyConfig = pluginDependencyConfig[action.config.pluginId]; dataTree[action.config.name] = generateDataTreeAction( action, editorConfig, dependencyConfig, ); }); jsActions.forEach((js) => { dataTree[js.config.name] = generateDataTreeJSAction(js); }); Object.values(widgets).forEach((widget) => { dataTree[widget.widgetName] = generateDataTreeWidget( widget, widgetsMeta[widget.widgetId], ); }); dataTree.pageList = pageList; dataTree.appsmith = { ...appData, // combine both persistent and transient state with the transient state // taking precedence in case the key is the same store: { ...appData.store.persistent, ...appData.store.transient }, } as DataTreeAppsmith; (dataTree.appsmith as DataTreeAppsmith).ENTITY_TYPE = ENTITY_TYPE.APPSMITH; return dataTree; } }