@fsai-flow/workflow 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/README.md +31 -0
- package/dist/package.json +42 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +68 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/Constants.d.ts +69 -0
- package/dist/src/lib/Constants.d.ts.map +1 -0
- package/dist/src/lib/Constants.js +106 -0
- package/dist/src/lib/Constants.js.map +1 -0
- package/dist/src/lib/DeferredPromise.d.ts +7 -0
- package/dist/src/lib/DeferredPromise.d.ts.map +1 -0
- package/dist/src/lib/DeferredPromise.js +11 -0
- package/dist/src/lib/DeferredPromise.js.map +1 -0
- package/dist/src/lib/Expression.d.ts +66 -0
- package/dist/src/lib/Expression.d.ts.map +1 -0
- package/dist/src/lib/Expression.js +247 -0
- package/dist/src/lib/Expression.js.map +1 -0
- package/dist/src/lib/Interfaces.d.ts +1623 -0
- package/dist/src/lib/Interfaces.d.ts.map +1 -0
- package/dist/src/lib/Interfaces.js +44 -0
- package/dist/src/lib/Interfaces.js.map +1 -0
- package/dist/src/lib/LoggerProxy.d.ts +10 -0
- package/dist/src/lib/LoggerProxy.d.ts.map +1 -0
- package/dist/src/lib/LoggerProxy.js +40 -0
- package/dist/src/lib/LoggerProxy.js.map +1 -0
- package/dist/src/lib/MetadataUtils.d.ts +5 -0
- package/dist/src/lib/MetadataUtils.d.ts.map +1 -0
- package/dist/src/lib/MetadataUtils.js +27 -0
- package/dist/src/lib/MetadataUtils.js.map +1 -0
- package/dist/src/lib/NodeErrors.d.ts +83 -0
- package/dist/src/lib/NodeErrors.d.ts.map +1 -0
- package/dist/src/lib/NodeErrors.js +284 -0
- package/dist/src/lib/NodeErrors.js.map +1 -0
- package/dist/src/lib/NodeHelpers.d.ts +199 -0
- package/dist/src/lib/NodeHelpers.d.ts.map +1 -0
- package/dist/src/lib/NodeHelpers.js +1335 -0
- package/dist/src/lib/NodeHelpers.js.map +1 -0
- package/dist/src/lib/ObservableObject.d.ts +6 -0
- package/dist/src/lib/ObservableObject.d.ts.map +1 -0
- package/dist/src/lib/ObservableObject.js +61 -0
- package/dist/src/lib/ObservableObject.js.map +1 -0
- package/dist/src/lib/RoutingNode.d.ts +24 -0
- package/dist/src/lib/RoutingNode.d.ts.map +1 -0
- package/dist/src/lib/RoutingNode.js +528 -0
- package/dist/src/lib/RoutingNode.js.map +1 -0
- package/dist/src/lib/TelemetryHelpers.d.ts +4 -0
- package/dist/src/lib/TelemetryHelpers.d.ts.map +1 -0
- package/dist/src/lib/TelemetryHelpers.js +67 -0
- package/dist/src/lib/TelemetryHelpers.js.map +1 -0
- package/dist/src/lib/TypeValidation.d.ts +22 -0
- package/dist/src/lib/TypeValidation.d.ts.map +1 -0
- package/dist/src/lib/TypeValidation.js +376 -0
- package/dist/src/lib/TypeValidation.js.map +1 -0
- package/dist/src/lib/VersionedNodeType.d.ts +10 -0
- package/dist/src/lib/VersionedNodeType.d.ts.map +1 -0
- package/dist/src/lib/VersionedNodeType.js +24 -0
- package/dist/src/lib/VersionedNodeType.js.map +1 -0
- package/dist/src/lib/Workflow.d.ts +249 -0
- package/dist/src/lib/Workflow.d.ts.map +1 -0
- package/dist/src/lib/Workflow.js +899 -0
- package/dist/src/lib/Workflow.js.map +1 -0
- package/dist/src/lib/WorkflowDataProxy.d.ts +88 -0
- package/dist/src/lib/WorkflowDataProxy.d.ts.map +1 -0
- package/dist/src/lib/WorkflowDataProxy.js +583 -0
- package/dist/src/lib/WorkflowDataProxy.js.map +1 -0
- package/dist/src/lib/WorkflowErrors.d.ts +10 -0
- package/dist/src/lib/WorkflowErrors.d.ts.map +1 -0
- package/dist/src/lib/WorkflowErrors.js +18 -0
- package/dist/src/lib/WorkflowErrors.js.map +1 -0
- package/dist/src/lib/WorkflowHooks.d.ts +12 -0
- package/dist/src/lib/WorkflowHooks.d.ts.map +1 -0
- package/dist/src/lib/WorkflowHooks.js +32 -0
- package/dist/src/lib/WorkflowHooks.js.map +1 -0
- package/dist/src/lib/errors/base/base.error.d.ts +30 -0
- package/dist/src/lib/errors/base/base.error.d.ts.map +1 -0
- package/dist/src/lib/errors/base/base.error.js +47 -0
- package/dist/src/lib/errors/base/base.error.js.map +1 -0
- package/dist/src/lib/errors/base/operational.error.d.ts +16 -0
- package/dist/src/lib/errors/base/operational.error.d.ts.map +1 -0
- package/dist/src/lib/errors/base/operational.error.js +19 -0
- package/dist/src/lib/errors/base/operational.error.js.map +1 -0
- package/dist/src/lib/errors/error.types.d.ts +14 -0
- package/dist/src/lib/errors/error.types.d.ts.map +1 -0
- package/dist/src/lib/errors/error.types.js +3 -0
- package/dist/src/lib/errors/error.types.js.map +1 -0
- package/dist/src/lib/errors/index.d.ts +2 -0
- package/dist/src/lib/errors/index.d.ts.map +1 -0
- package/dist/src/lib/errors/index.js +6 -0
- package/dist/src/lib/errors/index.js.map +1 -0
- package/dist/src/lib/result.d.ts +20 -0
- package/dist/src/lib/result.d.ts.map +1 -0
- package/dist/src/lib/result.js +36 -0
- package/dist/src/lib/result.js.map +1 -0
- package/dist/src/lib/utils.d.ts +51 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +119 -0
- package/dist/src/lib/utils.js.map +1 -0
- package/package.json +49 -35
- package/.eslintrc.json +0 -33
- package/eslint.config.js +0 -19
- package/jest.config.ts +0 -10
- package/project.json +0 -19
- package/src/index.ts +0 -33
- package/src/lib/Constants.ts +0 -124
- package/src/lib/DeferredPromise.ts +0 -14
- package/src/lib/Expression.ts +0 -375
- package/src/lib/Interfaces.ts +0 -2262
- package/src/lib/LoggerProxy.ts +0 -43
- package/src/lib/MetadataUtils.ts +0 -34
- package/src/lib/NodeErrors.ts +0 -332
- package/src/lib/NodeHelpers.ts +0 -1666
- package/src/lib/ObservableObject.ts +0 -77
- package/src/lib/RoutingNode.ts +0 -862
- package/src/lib/TelemetryHelpers.ts +0 -86
- package/src/lib/TypeValidation.ts +0 -431
- package/src/lib/VersionedNodeType.ts +0 -30
- package/src/lib/Workflow.ts +0 -1270
- package/src/lib/WorkflowDataProxy.ts +0 -708
- package/src/lib/WorkflowErrors.ts +0 -18
- package/src/lib/WorkflowHooks.ts +0 -51
- package/src/lib/errors/base/base.error.ts +0 -68
- package/src/lib/errors/base/operational.error.ts +0 -21
- package/src/lib/errors/error.types.ts +0 -14
- package/src/lib/errors/index.ts +0 -1
- package/src/lib/result.ts +0 -34
- package/src/lib/utils.ts +0 -166
- package/tests/Helpers.ts +0 -667
- package/tests/NodeHelpers.test.ts +0 -3053
- package/tests/ObservableObject.test.ts +0 -171
- package/tests/RoutingNode.test.ts +0 -1680
- package/tests/Workflow.test.ts +0 -1284
- package/tests/WorkflowDataProxy.test.ts +0 -199
- package/tsconfig.json +0 -27
- package/tsconfig.lib.json +0 -11
- package/tsconfig.spec.json +0 -14
package/project.json
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "workflow",
|
|
3
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "libs/workflow/src",
|
|
5
|
-
"projectType": "library",
|
|
6
|
-
"tags": [],
|
|
7
|
-
"targets": {
|
|
8
|
-
"build": {
|
|
9
|
-
"executor": "@nx/js:tsc",
|
|
10
|
-
"outputs": ["{options.outputPath}"],
|
|
11
|
-
"options": {
|
|
12
|
-
"outputPath": "libs/workflow/dist",
|
|
13
|
-
"main": "libs/workflow/src/index.ts",
|
|
14
|
-
"tsConfig": "libs/workflow/tsconfig.lib.json",
|
|
15
|
-
"assets": ["libs/workflow/*.md"]
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import * as LoggerProxy from './lib/LoggerProxy';
|
|
2
|
-
import * as NodeHelpers from './lib/NodeHelpers';
|
|
3
|
-
import * as ObservableObject from './lib/ObservableObject';
|
|
4
|
-
|
|
5
|
-
export * from './lib/MetadataUtils';
|
|
6
|
-
|
|
7
|
-
export * from './lib/errors'
|
|
8
|
-
export * from './lib/DeferredPromise';
|
|
9
|
-
export * from './lib/Interfaces';
|
|
10
|
-
export * from './lib/Expression';
|
|
11
|
-
export * from './lib/NodeErrors';
|
|
12
|
-
export * from './lib/Constants';
|
|
13
|
-
export * from './lib/NodeHelpers';
|
|
14
|
-
export * as TelemetryHelpers from './lib/TelemetryHelpers';
|
|
15
|
-
export * from './lib/RoutingNode';
|
|
16
|
-
export * from './lib/Workflow';
|
|
17
|
-
export * from './lib/TypeValidation';
|
|
18
|
-
export * from './lib/WorkflowDataProxy';
|
|
19
|
-
export * from './lib/WorkflowErrors';
|
|
20
|
-
export * from './lib/WorkflowHooks';
|
|
21
|
-
export * from './lib/result';
|
|
22
|
-
export {
|
|
23
|
-
LoggerProxy,
|
|
24
|
-
NodeHelpers,
|
|
25
|
-
ObservableObject
|
|
26
|
-
};
|
|
27
|
-
export {
|
|
28
|
-
updateDisplayOptions,
|
|
29
|
-
randomInt,
|
|
30
|
-
jsonParse,
|
|
31
|
-
jsonStringify,
|
|
32
|
-
replaceCircularReferences,
|
|
33
|
-
} from './lib/utils';
|
package/src/lib/Constants.ts
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { NodeConnectionType, NodeConnectionTypes } from "./Interfaces";
|
|
2
|
-
|
|
3
|
-
export const DIGITS = '0123456789';
|
|
4
|
-
export const UPPERCASE_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
5
|
-
export const LOWERCASE_LETTERS = UPPERCASE_LETTERS.toLowerCase();
|
|
6
|
-
export const ALPHABET = [DIGITS, UPPERCASE_LETTERS, LOWERCASE_LETTERS].join('');
|
|
7
|
-
|
|
8
|
-
export const BINARY_ENCODING = 'base64';
|
|
9
|
-
export const WAIT_INDEFINITELY = new Date('3000-01-01T00:00:00.000Z');
|
|
10
|
-
|
|
11
|
-
export const LOG_LEVELS = ['silent', 'error', 'warn', 'info', 'debug'] as const;
|
|
12
|
-
|
|
13
|
-
export const CODE_LANGUAGES = ['javaScript', 'python'] as const;
|
|
14
|
-
export const CODE_EXECUTION_MODES = ['runOnceForAllItems', 'runOnceForEachItem'] as const;
|
|
15
|
-
|
|
16
|
-
// Arbitrary value to represent an empty credential value
|
|
17
|
-
export const CREDENTIAL_EMPTY_VALUE = '__n8n_EMPTY_VALUE_7b1af746-3729-4c60-9b9b-e08eb29e58da';
|
|
18
|
-
|
|
19
|
-
export const FORM_TRIGGER_PATH_IDENTIFIER = 'n8n-form';
|
|
20
|
-
|
|
21
|
-
export const UNKNOWN_ERROR_MESSAGE = 'There was an unknown issue while executing the node';
|
|
22
|
-
export const UNKNOWN_ERROR_DESCRIPTION =
|
|
23
|
-
'Double-check the node configuration and the service it connects to. Check the error details below and refer to the <a href="https://docs.n8n.io" target="_blank">n8n documentation</a> to troubleshoot the issue.';
|
|
24
|
-
export const UNKNOWN_ERROR_MESSAGE_CRED = 'UNKNOWN ERROR';
|
|
25
|
-
|
|
26
|
-
//n8n-nodes-base
|
|
27
|
-
export const STICKY_NODE_TYPE = 'n8n-nodes-base.stickyNote';
|
|
28
|
-
export const NO_OP_NODE_TYPE = 'n8n-nodes-base.noOp';
|
|
29
|
-
export const HTTP_REQUEST_NODE_TYPE = 'n8n-nodes-base.httpRequest';
|
|
30
|
-
export const WEBHOOK_NODE_TYPE = 'n8n-nodes-base.webhook';
|
|
31
|
-
export const MANUAL_TRIGGER_NODE_TYPE = 'n8n-nodes-base.manualTrigger';
|
|
32
|
-
export const ERROR_TRIGGER_NODE_TYPE = 'n8n-nodes-base.errorTrigger';
|
|
33
|
-
export const START_NODE_TYPE = 'n8n-nodes-base.start';
|
|
34
|
-
export const EXECUTE_WORKFLOW_NODE_TYPE = 'n8n-nodes-base.executeWorkflow';
|
|
35
|
-
export const EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE = 'n8n-nodes-base.executeWorkflowTrigger';
|
|
36
|
-
export const CODE_NODE_TYPE = 'n8n-nodes-base.code';
|
|
37
|
-
export const FUNCTION_NODE_TYPE = 'n8n-nodes-base.function';
|
|
38
|
-
export const FUNCTION_ITEM_NODE_TYPE = 'n8n-nodes-base.functionItem';
|
|
39
|
-
export const MERGE_NODE_TYPE = 'n8n-nodes-base.merge';
|
|
40
|
-
export const AI_TRANSFORM_NODE_TYPE = 'n8n-nodes-base.aiTransform';
|
|
41
|
-
export const FORM_NODE_TYPE = 'n8n-nodes-base.form';
|
|
42
|
-
export const FORM_TRIGGER_NODE_TYPE = 'n8n-nodes-base.formTrigger';
|
|
43
|
-
export const CHAT_TRIGGER_NODE_TYPE = '@n8n/n8n-nodes-langchain.chatTrigger';
|
|
44
|
-
export const WAIT_NODE_TYPE = 'n8n-nodes-base.wait';
|
|
45
|
-
|
|
46
|
-
export const ConnectionTypeDisplayNames: { [key in NodeConnectionType]: string } = {
|
|
47
|
-
[NodeConnectionTypes.Main]: 'Main',
|
|
48
|
-
[NodeConnectionTypes.AiAgent]: 'IA Agent',
|
|
49
|
-
[NodeConnectionTypes.AiChain]: 'Chain',
|
|
50
|
-
[NodeConnectionTypes.AiDocument]: 'Document',
|
|
51
|
-
[NodeConnectionTypes.AiEmbedding]: 'Embedding',
|
|
52
|
-
[NodeConnectionTypes.AiLanguageModel]: 'Model',
|
|
53
|
-
[NodeConnectionTypes.AiMemory]: 'Memory',
|
|
54
|
-
[NodeConnectionTypes.AiOutputParser]: 'Output Parser',
|
|
55
|
-
[NodeConnectionTypes.AiRetriever]: 'Retriever',
|
|
56
|
-
[NodeConnectionTypes.AiTextSplitter]: 'Text Splitter',
|
|
57
|
-
[NodeConnectionTypes.AiTool]: 'Tool',
|
|
58
|
-
[NodeConnectionTypes.AiVectorStore]: 'Vector Store',
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export const STARTING_NODE_TYPES = [
|
|
62
|
-
MANUAL_TRIGGER_NODE_TYPE,
|
|
63
|
-
EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,
|
|
64
|
-
ERROR_TRIGGER_NODE_TYPE,
|
|
65
|
-
START_NODE_TYPE,
|
|
66
|
-
];
|
|
67
|
-
|
|
68
|
-
export const SCRIPTING_NODE_TYPES = [
|
|
69
|
-
FUNCTION_NODE_TYPE,
|
|
70
|
-
FUNCTION_ITEM_NODE_TYPE,
|
|
71
|
-
CODE_NODE_TYPE,
|
|
72
|
-
AI_TRANSFORM_NODE_TYPE,
|
|
73
|
-
];
|
|
74
|
-
|
|
75
|
-
export const ADD_FORM_NOTICE = 'addFormPage';
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Nodes whose parameter values may refer to other nodes without expressions.
|
|
79
|
-
* Their content may need to be updated when the referenced node is renamed.
|
|
80
|
-
*/
|
|
81
|
-
export const NODES_WITH_RENAMABLE_CONTENT = new Set([
|
|
82
|
-
CODE_NODE_TYPE,
|
|
83
|
-
FUNCTION_NODE_TYPE,
|
|
84
|
-
FUNCTION_ITEM_NODE_TYPE,
|
|
85
|
-
AI_TRANSFORM_NODE_TYPE,
|
|
86
|
-
]);
|
|
87
|
-
|
|
88
|
-
//@n8n/n8n-nodes-langchain
|
|
89
|
-
export const MANUAL_CHAT_TRIGGER_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.manualChatTrigger';
|
|
90
|
-
export const AGENT_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.agent';
|
|
91
|
-
export const CHAIN_LLM_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.chainLlm';
|
|
92
|
-
export const OPENAI_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.openAi';
|
|
93
|
-
export const CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE =
|
|
94
|
-
'@n8n/n8n-nodes-langchain.chainSummarization';
|
|
95
|
-
export const CODE_TOOL_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.toolCode';
|
|
96
|
-
export const WORKFLOW_TOOL_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.toolWorkflow';
|
|
97
|
-
export const HTTP_REQUEST_TOOL_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.toolHttpRequest';
|
|
98
|
-
|
|
99
|
-
export const LANGCHAIN_CUSTOM_TOOLS = [
|
|
100
|
-
CODE_TOOL_LANGCHAIN_NODE_TYPE,
|
|
101
|
-
WORKFLOW_TOOL_LANGCHAIN_NODE_TYPE,
|
|
102
|
-
HTTP_REQUEST_TOOL_LANGCHAIN_NODE_TYPE,
|
|
103
|
-
];
|
|
104
|
-
|
|
105
|
-
export const SEND_AND_WAIT_OPERATION = 'sendAndWait';
|
|
106
|
-
export const AI_TRANSFORM_CODE_GENERATED_FOR_PROMPT = 'codeGeneratedForPrompt';
|
|
107
|
-
export const AI_TRANSFORM_JS_CODE = 'jsCode';
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Key for an item standing in for a manual execution data item too large to be
|
|
111
|
-
* sent live via pubsub. See {@link TRIMMED_TASK_DATA_CONNECTIONS} in constants
|
|
112
|
-
* in `cli` package.
|
|
113
|
-
*/
|
|
114
|
-
export const TRIMMED_TASK_DATA_CONNECTIONS_KEY = '__isTrimmedManualExecutionDataItem';
|
|
115
|
-
|
|
116
|
-
export const OPEN_AI_API_CREDENTIAL_TYPE = 'openAiApi';
|
|
117
|
-
export const FREE_AI_CREDITS_ERROR_TYPE = 'free_ai_credits_request_error';
|
|
118
|
-
export const FREE_AI_CREDITS_USED_ALL_CREDITS_ERROR_CODE = 400;
|
|
119
|
-
|
|
120
|
-
export const FROM_AI_AUTO_GENERATED_MARKER = '/*n8n-auto-generated-fromAI-override*/';
|
|
121
|
-
|
|
122
|
-
export const PROJECT_ROOT = '0';
|
|
123
|
-
|
|
124
|
-
export const WAITING_FORMS_EXECUTION_STATUS = 'n8n-execution-status';
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// From: https://gist.github.com/compulim/8b49b0a744a3eeb2205e2b9506201e50
|
|
2
|
-
export interface IDeferredPromise<T> {
|
|
3
|
-
promise: () => Promise<T>;
|
|
4
|
-
reject: (error: Error) => void;
|
|
5
|
-
resolve: (result: T) => void;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export async function createDeferredPromise<T>(): Promise<IDeferredPromise<T>> {
|
|
9
|
-
return new Promise<IDeferredPromise<T>>((resolveCreate) => {
|
|
10
|
-
const promise = new Promise<T>((resolve, reject) => {
|
|
11
|
-
resolveCreate({ promise: async () => promise, resolve, reject });
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
}
|
package/src/lib/Expression.ts
DELETED
|
@@ -1,375 +0,0 @@
|
|
|
1
|
-
// @ts-ignore
|
|
2
|
-
import * as tmpl from 'riot-tmpl';
|
|
3
|
-
import { DateTime, Duration, Interval } from 'luxon';
|
|
4
|
-
|
|
5
|
-
// eslint-disable-next-line import/no-cycle
|
|
6
|
-
import {
|
|
7
|
-
INode,
|
|
8
|
-
INodeExecutionData,
|
|
9
|
-
INodeParameters,
|
|
10
|
-
IRunExecutionData,
|
|
11
|
-
IWorkflowDataProxyAdditionalKeys,
|
|
12
|
-
NodeParameterValue,
|
|
13
|
-
Workflow,
|
|
14
|
-
WorkflowDataProxy,
|
|
15
|
-
WorkflowExecuteMode,
|
|
16
|
-
} from '..';
|
|
17
|
-
|
|
18
|
-
// @ts-ignore
|
|
19
|
-
|
|
20
|
-
// Set it to use double curly brackets instead of single ones
|
|
21
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
22
|
-
tmpl.brackets.set('{{ }}');
|
|
23
|
-
|
|
24
|
-
// Make sure that it does not always print an error when it could not resolve
|
|
25
|
-
// a variable
|
|
26
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
27
|
-
tmpl.tmpl.errorHandler = () => { };
|
|
28
|
-
|
|
29
|
-
export class Expression {
|
|
30
|
-
workflow: Workflow;
|
|
31
|
-
|
|
32
|
-
constructor(workflow: Workflow) {
|
|
33
|
-
this.workflow = workflow;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Converts an object to a string in a way to make it clear that
|
|
38
|
-
* the value comes from an object
|
|
39
|
-
*
|
|
40
|
-
* @param {object} value
|
|
41
|
-
* @returns {string}
|
|
42
|
-
* @memberof Workflow
|
|
43
|
-
*/
|
|
44
|
-
convertObjectValueToString(value: object): string {
|
|
45
|
-
const typeName = Array.isArray(value) ? 'Array' : 'Object';
|
|
46
|
-
return `[${typeName}: ${JSON.stringify(value)}]`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Resolves the paramter value. If it is an expression it will execute it and
|
|
51
|
-
* return the result. For everything simply the supplied value will be returned.
|
|
52
|
-
*
|
|
53
|
-
* @param {NodeParameterValue} parameterValue
|
|
54
|
-
* @param {(IRunExecutionData | null)} runExecutionData
|
|
55
|
-
* @param {number} runIndex
|
|
56
|
-
* @param {number} itemIndex
|
|
57
|
-
* @param {string} activeNodeName
|
|
58
|
-
* @param {INodeExecutionData[]} connectionInputData
|
|
59
|
-
* @param {boolean} [returnObjectAsString=false]
|
|
60
|
-
* @returns {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[])}
|
|
61
|
-
* @memberof Workflow
|
|
62
|
-
*/
|
|
63
|
-
resolveSimpleParameterValue(
|
|
64
|
-
parameterValue: NodeParameterValue,
|
|
65
|
-
siblingParameters: INodeParameters,
|
|
66
|
-
runExecutionData: IRunExecutionData | null,
|
|
67
|
-
runIndex: number,
|
|
68
|
-
itemIndex: number,
|
|
69
|
-
activeNodeName: string,
|
|
70
|
-
connectionInputData: INodeExecutionData[],
|
|
71
|
-
mode: WorkflowExecuteMode,
|
|
72
|
-
additionalKeys: IWorkflowDataProxyAdditionalKeys,
|
|
73
|
-
returnObjectAsString = false,
|
|
74
|
-
selfData = {},
|
|
75
|
-
): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] {
|
|
76
|
-
// Check if it is an expression
|
|
77
|
-
if (typeof parameterValue !== 'string' || parameterValue.charAt(0) !== '=') {
|
|
78
|
-
// Is no expression so return value
|
|
79
|
-
return parameterValue;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Is an expression
|
|
83
|
-
|
|
84
|
-
// Remove the equal sign
|
|
85
|
-
// eslint-disable-next-line no-param-reassign
|
|
86
|
-
parameterValue = parameterValue.substr(1);
|
|
87
|
-
|
|
88
|
-
// Generate a data proxy which allows to query workflow data
|
|
89
|
-
const dataProxy = new WorkflowDataProxy(
|
|
90
|
-
this.workflow,
|
|
91
|
-
runExecutionData,
|
|
92
|
-
runIndex,
|
|
93
|
-
itemIndex,
|
|
94
|
-
activeNodeName,
|
|
95
|
-
connectionInputData,
|
|
96
|
-
siblingParameters,
|
|
97
|
-
mode,
|
|
98
|
-
additionalKeys,
|
|
99
|
-
-1,
|
|
100
|
-
selfData,
|
|
101
|
-
);
|
|
102
|
-
const data = dataProxy.getDataProxy();
|
|
103
|
-
|
|
104
|
-
// Support only a subset of process properties
|
|
105
|
-
// @ts-ignore
|
|
106
|
-
data.process = {
|
|
107
|
-
arch: process.arch,
|
|
108
|
-
env: process.env,
|
|
109
|
-
platform: process.platform,
|
|
110
|
-
pid: process.pid,
|
|
111
|
-
ppid: process.ppid,
|
|
112
|
-
release: process.release,
|
|
113
|
-
version: process.pid,
|
|
114
|
-
versions: process.versions,
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
// @ts-ignore
|
|
118
|
-
data.document = {};
|
|
119
|
-
|
|
120
|
-
// @ts-ignore
|
|
121
|
-
data.DateTime = DateTime;
|
|
122
|
-
data['Interval'] = Interval;
|
|
123
|
-
data['Duration'] = Duration;
|
|
124
|
-
|
|
125
|
-
// @ts-ignore
|
|
126
|
-
data.constructor = {};
|
|
127
|
-
|
|
128
|
-
// Execute the expression
|
|
129
|
-
try {
|
|
130
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
131
|
-
const returnValue = tmpl.tmpl(parameterValue, data);
|
|
132
|
-
if (typeof returnValue === 'function') {
|
|
133
|
-
throw new Error('Expression resolved to a function. Please add "()"');
|
|
134
|
-
} else if (returnValue !== null && typeof returnValue === 'object') {
|
|
135
|
-
if (returnObjectAsString) {
|
|
136
|
-
return this.convertObjectValueToString(returnValue);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
140
|
-
return returnValue;
|
|
141
|
-
} catch (e: any) {
|
|
142
|
-
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-member-access
|
|
143
|
-
throw new Error(`Expression is not valid: ${e.message}`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Resolves value of parameter. But does not work for workflow-data.
|
|
149
|
-
*
|
|
150
|
-
* @param {INode} node
|
|
151
|
-
* @param {(string | undefined)} parameterValue
|
|
152
|
-
* @param {string} [defaultValue]
|
|
153
|
-
* @returns {(string | undefined)}
|
|
154
|
-
* @memberof Workflow
|
|
155
|
-
*/
|
|
156
|
-
getSimpleParameterValue(
|
|
157
|
-
node: INode,
|
|
158
|
-
parameterValue: string | boolean | undefined,
|
|
159
|
-
mode: WorkflowExecuteMode,
|
|
160
|
-
additionalKeys: IWorkflowDataProxyAdditionalKeys,
|
|
161
|
-
defaultValue?: boolean | number | string,
|
|
162
|
-
): boolean | number | string | undefined {
|
|
163
|
-
if (parameterValue === undefined) {
|
|
164
|
-
// Value is not set so return the default
|
|
165
|
-
return defaultValue;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Get the value of the node (can be an expression)
|
|
169
|
-
const runIndex = 0;
|
|
170
|
-
const itemIndex = 0;
|
|
171
|
-
const connectionInputData: INodeExecutionData[] = [];
|
|
172
|
-
const runData: IRunExecutionData = {
|
|
173
|
-
resultData: {
|
|
174
|
-
runData: {},
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
return this.getParameterValue(
|
|
179
|
-
parameterValue,
|
|
180
|
-
runData,
|
|
181
|
-
runIndex,
|
|
182
|
-
itemIndex,
|
|
183
|
-
node.name,
|
|
184
|
-
connectionInputData,
|
|
185
|
-
mode,
|
|
186
|
-
additionalKeys,
|
|
187
|
-
) as boolean | number | string | undefined;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Resolves value of complex parameter. But does not work for workflow-data.
|
|
192
|
-
*
|
|
193
|
-
* @param {INode} node
|
|
194
|
-
* @param {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[])} parameterValue
|
|
195
|
-
* @param {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | undefined)} [defaultValue]
|
|
196
|
-
* @returns {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | undefined)}
|
|
197
|
-
* @memberof Workflow
|
|
198
|
-
*/
|
|
199
|
-
getComplexParameterValue(
|
|
200
|
-
node: INode,
|
|
201
|
-
parameterValue: NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[],
|
|
202
|
-
mode: WorkflowExecuteMode,
|
|
203
|
-
additionalKeys: IWorkflowDataProxyAdditionalKeys,
|
|
204
|
-
defaultValue:
|
|
205
|
-
| NodeParameterValue
|
|
206
|
-
| INodeParameters
|
|
207
|
-
| NodeParameterValue[]
|
|
208
|
-
| INodeParameters[]
|
|
209
|
-
| undefined = undefined,
|
|
210
|
-
selfData = {},
|
|
211
|
-
): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | undefined {
|
|
212
|
-
if (parameterValue === undefined) {
|
|
213
|
-
// Value is not set so return the default
|
|
214
|
-
return defaultValue;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Get the value of the node (can be an expression)
|
|
218
|
-
const runIndex = 0;
|
|
219
|
-
const itemIndex = 0;
|
|
220
|
-
const connectionInputData: INodeExecutionData[] = [];
|
|
221
|
-
const runData: IRunExecutionData = {
|
|
222
|
-
resultData: {
|
|
223
|
-
runData: {},
|
|
224
|
-
},
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
// Resolve the "outer" main values
|
|
228
|
-
const returnData = this.getParameterValue(
|
|
229
|
-
parameterValue,
|
|
230
|
-
runData,
|
|
231
|
-
runIndex,
|
|
232
|
-
itemIndex,
|
|
233
|
-
node.name,
|
|
234
|
-
connectionInputData,
|
|
235
|
-
mode,
|
|
236
|
-
additionalKeys,
|
|
237
|
-
false,
|
|
238
|
-
selfData,
|
|
239
|
-
);
|
|
240
|
-
|
|
241
|
-
// Resolve the "inner" values
|
|
242
|
-
return this.getParameterValue(
|
|
243
|
-
returnData,
|
|
244
|
-
runData,
|
|
245
|
-
runIndex,
|
|
246
|
-
itemIndex,
|
|
247
|
-
node.name,
|
|
248
|
-
connectionInputData,
|
|
249
|
-
mode,
|
|
250
|
-
additionalKeys,
|
|
251
|
-
false,
|
|
252
|
-
selfData,
|
|
253
|
-
);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Returns the resolved node parameter value. If it is an expression it will execute it and
|
|
258
|
-
* return the result. If the value to resolve is an array or object it will do the same
|
|
259
|
-
* for all of the items and values.
|
|
260
|
-
*
|
|
261
|
-
* @param {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[])} parameterValue
|
|
262
|
-
* @param {(IRunExecutionData | null)} runExecutionData
|
|
263
|
-
* @param {number} runIndex
|
|
264
|
-
* @param {number} itemIndex
|
|
265
|
-
* @param {string} activeNodeName
|
|
266
|
-
* @param {INodeExecutionData[]} connectionInputData
|
|
267
|
-
* @param {boolean} [returnObjectAsString=false]
|
|
268
|
-
* @returns {(NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[])}
|
|
269
|
-
* @memberof Workflow
|
|
270
|
-
*/
|
|
271
|
-
getParameterValue(
|
|
272
|
-
parameterValue: NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[],
|
|
273
|
-
runExecutionData: IRunExecutionData | null,
|
|
274
|
-
runIndex: number,
|
|
275
|
-
itemIndex: number,
|
|
276
|
-
activeNodeName: string,
|
|
277
|
-
connectionInputData: INodeExecutionData[],
|
|
278
|
-
mode: WorkflowExecuteMode,
|
|
279
|
-
additionalKeys: IWorkflowDataProxyAdditionalKeys,
|
|
280
|
-
returnObjectAsString = false,
|
|
281
|
-
selfData = {},
|
|
282
|
-
): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] {
|
|
283
|
-
// Helper function which returns true when the parameter is a complex one or array
|
|
284
|
-
const isComplexParameter = (
|
|
285
|
-
value: NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[],
|
|
286
|
-
) => {
|
|
287
|
-
return typeof value === 'object';
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
// Helper function which resolves a parameter value depending on if it is simply or not
|
|
291
|
-
const resolveParameterValue = (
|
|
292
|
-
value: NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[],
|
|
293
|
-
siblingParameters: INodeParameters,
|
|
294
|
-
) => {
|
|
295
|
-
if (isComplexParameter(value)) {
|
|
296
|
-
return this.getParameterValue(
|
|
297
|
-
value,
|
|
298
|
-
runExecutionData,
|
|
299
|
-
runIndex,
|
|
300
|
-
itemIndex,
|
|
301
|
-
activeNodeName,
|
|
302
|
-
connectionInputData,
|
|
303
|
-
mode,
|
|
304
|
-
additionalKeys,
|
|
305
|
-
returnObjectAsString,
|
|
306
|
-
selfData,
|
|
307
|
-
);
|
|
308
|
-
}
|
|
309
|
-
return this.resolveSimpleParameterValue(
|
|
310
|
-
value as NodeParameterValue,
|
|
311
|
-
siblingParameters,
|
|
312
|
-
runExecutionData,
|
|
313
|
-
runIndex,
|
|
314
|
-
itemIndex,
|
|
315
|
-
activeNodeName,
|
|
316
|
-
connectionInputData,
|
|
317
|
-
mode,
|
|
318
|
-
additionalKeys,
|
|
319
|
-
returnObjectAsString,
|
|
320
|
-
selfData,
|
|
321
|
-
);
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
// Check if it value is a simple one that we can get it resolved directly
|
|
325
|
-
if (!isComplexParameter(parameterValue)) {
|
|
326
|
-
return this.resolveSimpleParameterValue(
|
|
327
|
-
parameterValue as NodeParameterValue,
|
|
328
|
-
{},
|
|
329
|
-
runExecutionData,
|
|
330
|
-
runIndex,
|
|
331
|
-
itemIndex,
|
|
332
|
-
activeNodeName,
|
|
333
|
-
connectionInputData,
|
|
334
|
-
mode,
|
|
335
|
-
additionalKeys,
|
|
336
|
-
returnObjectAsString,
|
|
337
|
-
selfData,
|
|
338
|
-
);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// The parameter value is complex so resolve depending on type
|
|
342
|
-
|
|
343
|
-
if (Array.isArray(parameterValue)) {
|
|
344
|
-
// Data is an array
|
|
345
|
-
const returnData = [];
|
|
346
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
347
|
-
for (const item of parameterValue) {
|
|
348
|
-
returnData.push(resolveParameterValue(item, {}));
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
if (returnObjectAsString && typeof returnData === 'object') {
|
|
352
|
-
return this.convertObjectValueToString(returnData);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
return returnData as NodeParameterValue[] | INodeParameters[];
|
|
356
|
-
}
|
|
357
|
-
if (parameterValue === null || parameterValue === undefined) {
|
|
358
|
-
return parameterValue;
|
|
359
|
-
}
|
|
360
|
-
// Data is an object
|
|
361
|
-
const returnData: INodeParameters = {};
|
|
362
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
363
|
-
for (const key of Object.keys(parameterValue)) {
|
|
364
|
-
returnData[key] = resolveParameterValue(
|
|
365
|
-
(parameterValue as INodeParameters)[key],
|
|
366
|
-
parameterValue as INodeParameters,
|
|
367
|
-
);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
if (returnObjectAsString && typeof returnData === 'object') {
|
|
371
|
-
return this.convertObjectValueToString(returnData);
|
|
372
|
-
}
|
|
373
|
-
return returnData;
|
|
374
|
-
}
|
|
375
|
-
}
|