2021-09-08 17:32:22 +00:00
|
|
|
//check difference for after body change and parsing
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
import type { JSCollection, JSAction, Variable } from "entities/JSCollection";
|
chore: Import debugger fixes (#31080)
## Description
To add debugger error for import path for module instance on EE, this PR
enables code to be extended on EE
#### PR fixes following issue(s)
Fixes # (issue number)
> if no issue exists, please create an issue and ask the maintainers
about this first
>
>
#### Media
> A video or a GIF is preferred. when using Loom, don’t embed because it
looks like it’s a GIF. instead, just link to the video
>
>
#### Type of change
> Please delete options that are not relevant.
- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
- Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- Chore (housekeeping or task changes that don't impact user perception)
- This change requires a documentation update
>
>
>
## Testing
>
#### How Has This Been Tested?
> Please describe the tests that you ran to verify your changes. Also
list any relevant details for your test configuration.
> Delete anything that is not relevant
- [ ] Manual
- [ ] JUnit
- [ ] Jest
- [ ] Cypress
>
>
#### Test Plan
> Add Testsmith test cases links that relate to this PR
>
>
#### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
>
>
>
## Checklist:
#### Dev activity
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
#### QA activity:
- [ ] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [ ] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [ ] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Refactor**
- Updated import paths and references for `ENTITY_TYPE` to
`EntityTypeValue` across various components and utilities for improved
code consistency.
- Reorganized import statements related to `AppsmithConsole` utilities
and constants to enhance code maintainability.
- Adjusted usage of enums and types, specifically for entity and
platform error handling, to align with updated import paths.
- **New Features**
- Introduced utility functions for handling entity types and platform
errors in AppsmithConsole, including new constants and error retrieval
functions.
- Added a new enum value `MISSING_MODULE` to better categorize log types
in debugging scenarios.
- **Bug Fixes**
- Implemented changes to error logging and handling mechanisms,
including the addition of new case handling for
`LOG_TYPE.MISSING_MODULE` in debugger logs, to improve the debugging
experience.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-02-14 06:30:18 +00:00
|
|
|
import { ENTITY_TYPE } from "@appsmith/entities/AppsmithConsole/utils";
|
2021-09-28 07:31:46 +00:00
|
|
|
import LOG_TYPE from "entities/AppsmithConsole/logtype";
|
|
|
|
|
import AppsmithConsole from "utils/AppsmithConsole";
|
2021-09-08 17:32:22 +00:00
|
|
|
|
2023-10-11 07:35:24 +00:00
|
|
|
export interface ParsedJSSubAction {
|
2021-09-08 17:32:22 +00:00
|
|
|
name: string;
|
|
|
|
|
body: string;
|
|
|
|
|
arguments: Array<Variable>;
|
2023-10-11 07:35:24 +00:00
|
|
|
}
|
2021-09-08 17:32:22 +00:00
|
|
|
|
2023-10-11 07:35:24 +00:00
|
|
|
export interface ParsedBody {
|
2021-09-08 17:32:22 +00:00
|
|
|
actions: Array<ParsedJSSubAction>;
|
|
|
|
|
variables: Array<Variable>;
|
2023-10-11 07:35:24 +00:00
|
|
|
}
|
2021-09-08 17:32:22 +00:00
|
|
|
|
2023-10-11 07:35:24 +00:00
|
|
|
export interface JSUpdate {
|
2021-11-08 06:49:22 +00:00
|
|
|
id: string;
|
|
|
|
|
parsedBody: ParsedBody | undefined;
|
2023-10-11 07:35:24 +00:00
|
|
|
}
|
2021-11-08 06:49:22 +00:00
|
|
|
|
2024-05-24 06:19:29 +00:00
|
|
|
export interface JSCollectionDifference {
|
|
|
|
|
newActions: Partial<JSAction>[];
|
|
|
|
|
updateActions: JSAction[];
|
|
|
|
|
deletedActions: JSAction[];
|
|
|
|
|
nameChangedActions: Array<{
|
|
|
|
|
id: string;
|
|
|
|
|
collectionId?: string;
|
|
|
|
|
oldName: string;
|
|
|
|
|
newName: string;
|
|
|
|
|
pageId: string;
|
|
|
|
|
moduleId?: string;
|
|
|
|
|
}>;
|
|
|
|
|
changedVariables: Variable[];
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-08 17:32:22 +00:00
|
|
|
export const getDifferenceInJSCollection = (
|
|
|
|
|
parsedBody: ParsedBody,
|
|
|
|
|
jsAction: JSCollection,
|
2024-05-24 06:19:29 +00:00
|
|
|
): JSCollectionDifference => {
|
2021-09-08 17:32:22 +00:00
|
|
|
const newActions: ParsedJSSubAction[] = [];
|
|
|
|
|
const toBearchivedActions: JSAction[] = [];
|
2021-09-28 07:31:46 +00:00
|
|
|
const toBeUpdatedActions: JSAction[] = [];
|
2021-09-08 17:32:22 +00:00
|
|
|
const nameChangedActions = [];
|
|
|
|
|
const toBeAddedActions: Partial<JSAction>[] = [];
|
|
|
|
|
//check if body is changed and update if exists or
|
|
|
|
|
// add to new array so it can be added to main collection
|
|
|
|
|
if (parsedBody.actions && parsedBody.actions.length > 0) {
|
|
|
|
|
for (let i = 0; i < parsedBody.actions.length; i++) {
|
|
|
|
|
const action = parsedBody.actions[i];
|
|
|
|
|
const preExisted = jsAction.actions.find((js) => js.name === action.name);
|
|
|
|
|
if (preExisted) {
|
2024-05-06 13:05:19 +00:00
|
|
|
if (preExisted.actionConfiguration.body !== action.body) {
|
2021-09-28 07:31:46 +00:00
|
|
|
toBeUpdatedActions.push({
|
|
|
|
|
...preExisted,
|
|
|
|
|
actionConfiguration: {
|
|
|
|
|
...preExisted.actionConfiguration,
|
|
|
|
|
body: action.body,
|
|
|
|
|
jsArguments: action.arguments,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
2021-09-08 17:32:22 +00:00
|
|
|
} else {
|
|
|
|
|
newActions.push(action);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//create deleted action list
|
|
|
|
|
if (jsAction.actions && jsAction.actions.length > 0 && parsedBody.actions) {
|
|
|
|
|
for (let i = 0; i < jsAction.actions.length; i++) {
|
|
|
|
|
const preAction = jsAction.actions[i];
|
|
|
|
|
const existed = parsedBody.actions.find(
|
|
|
|
|
(js: ParsedJSSubAction) => js.name === preAction.name,
|
|
|
|
|
);
|
|
|
|
|
if (!existed) {
|
|
|
|
|
toBearchivedActions.push(preAction);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//check if new is name changed from deleted actions
|
|
|
|
|
if (toBearchivedActions.length && newActions.length) {
|
|
|
|
|
for (let i = 0; i < newActions.length; i++) {
|
|
|
|
|
const nameChange = toBearchivedActions.find(
|
|
|
|
|
(js) => js.actionConfiguration.body === newActions[i].body,
|
|
|
|
|
);
|
|
|
|
|
if (nameChange) {
|
|
|
|
|
const updateExisting = jsAction.actions.find(
|
|
|
|
|
(js) => js.id === nameChange.id,
|
|
|
|
|
);
|
|
|
|
|
if (updateExisting) {
|
|
|
|
|
const indexOfArchived = toBearchivedActions.findIndex((js) => {
|
|
|
|
|
js.id === updateExisting.id;
|
|
|
|
|
});
|
|
|
|
|
//will be part of new nameChangedActions for now
|
2021-09-28 07:31:46 +00:00
|
|
|
toBeUpdatedActions.push({
|
2021-09-08 17:32:22 +00:00
|
|
|
...updateExisting,
|
|
|
|
|
name: newActions[i].name,
|
|
|
|
|
});
|
|
|
|
|
nameChangedActions.push({
|
|
|
|
|
id: updateExisting.id,
|
|
|
|
|
collectionId: updateExisting.collectionId,
|
|
|
|
|
oldName: updateExisting.name,
|
|
|
|
|
newName: newActions[i].name,
|
|
|
|
|
pageId: updateExisting.pageId,
|
2024-01-09 05:19:21 +00:00
|
|
|
moduleId: updateExisting.moduleId,
|
2021-09-08 17:32:22 +00:00
|
|
|
});
|
|
|
|
|
newActions.splice(i, 1);
|
|
|
|
|
toBearchivedActions.splice(indexOfArchived, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (newActions.length > 0) {
|
|
|
|
|
for (let i = 0; i < newActions.length; i++) {
|
|
|
|
|
const action = newActions[i];
|
|
|
|
|
const obj = {
|
|
|
|
|
name: action.name,
|
|
|
|
|
collectionId: jsAction.id,
|
|
|
|
|
executeOnLoad: false,
|
|
|
|
|
pageId: jsAction.pageId,
|
2022-06-15 15:37:41 +00:00
|
|
|
workspaceId: jsAction.workspaceId,
|
2021-09-08 17:32:22 +00:00
|
|
|
actionConfiguration: {
|
|
|
|
|
body: action.body,
|
2022-03-17 12:05:17 +00:00
|
|
|
timeoutInMillisecond: 0,
|
2023-04-06 16:49:12 +00:00
|
|
|
jsArguments: action.arguments || [],
|
2021-09-08 17:32:22 +00:00
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
toBeAddedActions.push(obj);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (toBearchivedActions.length > 0) {
|
|
|
|
|
for (let i = 0; i < toBearchivedActions.length; i++) {
|
|
|
|
|
const action = toBearchivedActions[i];
|
|
|
|
|
const deleteArchived = jsAction.actions.findIndex((js) => {
|
|
|
|
|
action.id === js.id;
|
|
|
|
|
});
|
|
|
|
|
jsAction.actions.splice(deleteArchived, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-02-26 15:44:35 +00:00
|
|
|
//change in variables. In cases the variable list is not present, jsAction.variables will be undefined
|
|
|
|
|
// we are setting to empty array to avoid undefined errors further in the code (especially in case of workflows main file)
|
|
|
|
|
const varList = jsAction.variables || [];
|
2021-11-08 06:49:22 +00:00
|
|
|
let changedVariables: Array<Variable> = [];
|
|
|
|
|
if (parsedBody.variables.length) {
|
|
|
|
|
for (let i = 0; i < parsedBody.variables.length; i++) {
|
|
|
|
|
const newVar = parsedBody.variables[i];
|
|
|
|
|
const existedVar = varList.find((item) => item.name === newVar.name);
|
|
|
|
|
if (!!existedVar) {
|
|
|
|
|
const existedValue = existedVar.value;
|
2021-12-14 07:31:40 +00:00
|
|
|
if (
|
|
|
|
|
(!!existedValue &&
|
|
|
|
|
existedValue.toString() !==
|
|
|
|
|
(newVar.value && newVar.value.toString())) ||
|
|
|
|
|
(!existedValue && !!newVar.value)
|
|
|
|
|
) {
|
2021-11-08 06:49:22 +00:00
|
|
|
changedVariables.push(newVar);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
changedVariables.push(newVar);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2024-02-26 15:44:35 +00:00
|
|
|
changedVariables = varList;
|
2021-11-08 06:49:22 +00:00
|
|
|
}
|
2022-06-24 04:06:52 +00:00
|
|
|
//delete variable
|
|
|
|
|
if (varList && varList.length > 0 && parsedBody.variables) {
|
|
|
|
|
for (let i = 0; i < varList.length; i++) {
|
|
|
|
|
const preVar = varList[i];
|
|
|
|
|
const existed = parsedBody.variables.find(
|
|
|
|
|
(jsVar: Variable) => jsVar.name === preVar.name,
|
|
|
|
|
);
|
|
|
|
|
if (!existed) {
|
|
|
|
|
const newvarList = varList.filter(
|
|
|
|
|
(deletedVar) => deletedVar.name !== preVar.name,
|
|
|
|
|
);
|
|
|
|
|
changedVariables = changedVariables.concat(newvarList);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-09-08 17:32:22 +00:00
|
|
|
return {
|
|
|
|
|
newActions: toBeAddedActions,
|
2021-09-28 07:31:46 +00:00
|
|
|
updateActions: toBeUpdatedActions,
|
2021-09-08 17:32:22 +00:00
|
|
|
deletedActions: toBearchivedActions,
|
|
|
|
|
nameChangedActions: nameChangedActions,
|
2021-11-08 06:49:22 +00:00
|
|
|
changedVariables: changedVariables,
|
2021-09-08 17:32:22 +00:00
|
|
|
};
|
|
|
|
|
};
|
2021-09-28 07:31:46 +00:00
|
|
|
|
|
|
|
|
export const pushLogsForObjectUpdate = (
|
2021-10-19 11:53:15 +00:00
|
|
|
actions: Partial<JSAction>[],
|
2021-09-28 07:31:46 +00:00
|
|
|
jsCollection: JSCollection,
|
|
|
|
|
text: string,
|
|
|
|
|
) => {
|
|
|
|
|
for (let i = 0; i < actions.length; i++) {
|
|
|
|
|
AppsmithConsole.info({
|
|
|
|
|
logType: LOG_TYPE.JS_ACTION_UPDATE,
|
|
|
|
|
text: text,
|
|
|
|
|
source: {
|
|
|
|
|
type: ENTITY_TYPE.JSACTION,
|
|
|
|
|
name: jsCollection.name + "." + actions[i].name,
|
|
|
|
|
id: jsCollection.id,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
2021-10-26 12:53:58 +00:00
|
|
|
|
|
|
|
|
export const createDummyJSCollectionActions = (
|
2022-06-15 15:37:41 +00:00
|
|
|
workspaceId: string,
|
2023-12-13 10:46:27 +00:00
|
|
|
additionalParams: Record<string, unknown> = {},
|
2021-10-26 12:53:58 +00:00
|
|
|
) => {
|
|
|
|
|
const body =
|
2023-03-30 05:18:55 +00:00
|
|
|
"export default {\n\tmyVar1: [],\n\tmyVar2: {},\n\tmyFun1 () {\n\t\t//\twrite code here\n\t\t//\tthis.myVar1 = [1,2,3]\n\t},\n\tasync myFun2 () {\n\t\t//\tuse async-await or promises\n\t\t//\tawait storeValue('varName', 'hello world')\n\t}\n}";
|
2021-10-26 12:53:58 +00:00
|
|
|
|
|
|
|
|
const actions = [
|
|
|
|
|
{
|
|
|
|
|
name: "myFun1",
|
2022-06-15 15:37:41 +00:00
|
|
|
workspaceId,
|
2021-10-26 12:53:58 +00:00
|
|
|
executeOnLoad: false,
|
|
|
|
|
actionConfiguration: {
|
2023-03-30 05:18:55 +00:00
|
|
|
body: "function (){\n\t\t//\twrite code here\n\t\t//\tthis.myVar1 = [1,2,3]\n\t}",
|
2022-03-17 12:05:17 +00:00
|
|
|
timeoutInMillisecond: 0,
|
2021-10-26 12:53:58 +00:00
|
|
|
jsArguments: [],
|
|
|
|
|
},
|
2022-03-17 12:05:17 +00:00
|
|
|
clientSideExecution: true,
|
2023-12-13 10:46:27 +00:00
|
|
|
...additionalParams,
|
2021-10-26 12:53:58 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "myFun2",
|
2022-06-15 15:37:41 +00:00
|
|
|
workspaceId,
|
2021-10-26 12:53:58 +00:00
|
|
|
executeOnLoad: false,
|
|
|
|
|
actionConfiguration: {
|
2023-03-30 05:18:55 +00:00
|
|
|
body: "async function () {\n\t\t//\tuse async-await or promises\n\t\t//\tawait storeValue('varName', 'hello world')\n\t}",
|
2022-03-17 12:05:17 +00:00
|
|
|
timeoutInMillisecond: 0,
|
2021-10-26 12:53:58 +00:00
|
|
|
jsArguments: [],
|
|
|
|
|
},
|
2022-03-17 12:05:17 +00:00
|
|
|
clientSideExecution: true,
|
2023-12-13 10:46:27 +00:00
|
|
|
...additionalParams,
|
2021-10-26 12:53:58 +00:00
|
|
|
},
|
|
|
|
|
];
|
2023-12-13 10:46:27 +00:00
|
|
|
|
|
|
|
|
const variables = [
|
|
|
|
|
{
|
|
|
|
|
name: "myVar1",
|
|
|
|
|
value: [],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "myVar2",
|
|
|
|
|
value: {},
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
2021-10-26 12:53:58 +00:00
|
|
|
return {
|
|
|
|
|
actions,
|
|
|
|
|
body,
|
2023-12-13 10:46:27 +00:00
|
|
|
variables,
|
2021-10-26 12:53:58 +00:00
|
|
|
};
|
|
|
|
|
};
|
2024-04-05 05:58:47 +00:00
|
|
|
|
|
|
|
|
export const createSingleFunctionJsCollection = (
|
|
|
|
|
workspaceId: string,
|
|
|
|
|
functionName: string,
|
|
|
|
|
additionalParams: Record<string, unknown> = {},
|
|
|
|
|
) => {
|
|
|
|
|
const body = `export default {\n\t${functionName} () {\n\t\t//\twrite code here\n\t}\n}`;
|
|
|
|
|
|
|
|
|
|
const actions = [
|
|
|
|
|
{
|
|
|
|
|
name: functionName,
|
|
|
|
|
workspaceId,
|
|
|
|
|
executeOnLoad: false,
|
|
|
|
|
actionConfiguration: {
|
|
|
|
|
body: "function (){\n\t\t//\twrite code here\n\t}",
|
|
|
|
|
timeoutInMillisecond: 0,
|
|
|
|
|
jsArguments: [],
|
|
|
|
|
},
|
|
|
|
|
clientSideExecution: true,
|
|
|
|
|
...additionalParams,
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const variables: Variable[] = [];
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
actions,
|
|
|
|
|
body,
|
|
|
|
|
variables,
|
|
|
|
|
};
|
|
|
|
|
};
|