@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.
Files changed (136) hide show
  1. package/dist/README.md +31 -0
  2. package/dist/package.json +42 -0
  3. package/dist/src/index.d.ts +22 -0
  4. package/dist/src/index.d.ts.map +1 -0
  5. package/dist/src/index.js +68 -0
  6. package/dist/src/index.js.map +1 -0
  7. package/dist/src/lib/Constants.d.ts +69 -0
  8. package/dist/src/lib/Constants.d.ts.map +1 -0
  9. package/dist/src/lib/Constants.js +106 -0
  10. package/dist/src/lib/Constants.js.map +1 -0
  11. package/dist/src/lib/DeferredPromise.d.ts +7 -0
  12. package/dist/src/lib/DeferredPromise.d.ts.map +1 -0
  13. package/dist/src/lib/DeferredPromise.js +11 -0
  14. package/dist/src/lib/DeferredPromise.js.map +1 -0
  15. package/dist/src/lib/Expression.d.ts +66 -0
  16. package/dist/src/lib/Expression.d.ts.map +1 -0
  17. package/dist/src/lib/Expression.js +247 -0
  18. package/dist/src/lib/Expression.js.map +1 -0
  19. package/dist/src/lib/Interfaces.d.ts +1623 -0
  20. package/dist/src/lib/Interfaces.d.ts.map +1 -0
  21. package/dist/src/lib/Interfaces.js +44 -0
  22. package/dist/src/lib/Interfaces.js.map +1 -0
  23. package/dist/src/lib/LoggerProxy.d.ts +10 -0
  24. package/dist/src/lib/LoggerProxy.d.ts.map +1 -0
  25. package/dist/src/lib/LoggerProxy.js +40 -0
  26. package/dist/src/lib/LoggerProxy.js.map +1 -0
  27. package/dist/src/lib/MetadataUtils.d.ts +5 -0
  28. package/dist/src/lib/MetadataUtils.d.ts.map +1 -0
  29. package/dist/src/lib/MetadataUtils.js +27 -0
  30. package/dist/src/lib/MetadataUtils.js.map +1 -0
  31. package/dist/src/lib/NodeErrors.d.ts +83 -0
  32. package/dist/src/lib/NodeErrors.d.ts.map +1 -0
  33. package/dist/src/lib/NodeErrors.js +284 -0
  34. package/dist/src/lib/NodeErrors.js.map +1 -0
  35. package/dist/src/lib/NodeHelpers.d.ts +199 -0
  36. package/dist/src/lib/NodeHelpers.d.ts.map +1 -0
  37. package/dist/src/lib/NodeHelpers.js +1335 -0
  38. package/dist/src/lib/NodeHelpers.js.map +1 -0
  39. package/dist/src/lib/ObservableObject.d.ts +6 -0
  40. package/dist/src/lib/ObservableObject.d.ts.map +1 -0
  41. package/dist/src/lib/ObservableObject.js +61 -0
  42. package/dist/src/lib/ObservableObject.js.map +1 -0
  43. package/dist/src/lib/RoutingNode.d.ts +24 -0
  44. package/dist/src/lib/RoutingNode.d.ts.map +1 -0
  45. package/dist/src/lib/RoutingNode.js +528 -0
  46. package/dist/src/lib/RoutingNode.js.map +1 -0
  47. package/dist/src/lib/TelemetryHelpers.d.ts +4 -0
  48. package/dist/src/lib/TelemetryHelpers.d.ts.map +1 -0
  49. package/dist/src/lib/TelemetryHelpers.js +67 -0
  50. package/dist/src/lib/TelemetryHelpers.js.map +1 -0
  51. package/dist/src/lib/TypeValidation.d.ts +22 -0
  52. package/dist/src/lib/TypeValidation.d.ts.map +1 -0
  53. package/dist/src/lib/TypeValidation.js +376 -0
  54. package/dist/src/lib/TypeValidation.js.map +1 -0
  55. package/dist/src/lib/VersionedNodeType.d.ts +10 -0
  56. package/dist/src/lib/VersionedNodeType.d.ts.map +1 -0
  57. package/dist/src/lib/VersionedNodeType.js +24 -0
  58. package/dist/src/lib/VersionedNodeType.js.map +1 -0
  59. package/dist/src/lib/Workflow.d.ts +249 -0
  60. package/dist/src/lib/Workflow.d.ts.map +1 -0
  61. package/dist/src/lib/Workflow.js +899 -0
  62. package/dist/src/lib/Workflow.js.map +1 -0
  63. package/dist/src/lib/WorkflowDataProxy.d.ts +88 -0
  64. package/dist/src/lib/WorkflowDataProxy.d.ts.map +1 -0
  65. package/dist/src/lib/WorkflowDataProxy.js +583 -0
  66. package/dist/src/lib/WorkflowDataProxy.js.map +1 -0
  67. package/dist/src/lib/WorkflowErrors.d.ts +10 -0
  68. package/dist/src/lib/WorkflowErrors.d.ts.map +1 -0
  69. package/dist/src/lib/WorkflowErrors.js +18 -0
  70. package/dist/src/lib/WorkflowErrors.js.map +1 -0
  71. package/dist/src/lib/WorkflowHooks.d.ts +12 -0
  72. package/dist/src/lib/WorkflowHooks.d.ts.map +1 -0
  73. package/dist/src/lib/WorkflowHooks.js +32 -0
  74. package/dist/src/lib/WorkflowHooks.js.map +1 -0
  75. package/dist/src/lib/errors/base/base.error.d.ts +30 -0
  76. package/dist/src/lib/errors/base/base.error.d.ts.map +1 -0
  77. package/dist/src/lib/errors/base/base.error.js +47 -0
  78. package/dist/src/lib/errors/base/base.error.js.map +1 -0
  79. package/dist/src/lib/errors/base/operational.error.d.ts +16 -0
  80. package/dist/src/lib/errors/base/operational.error.d.ts.map +1 -0
  81. package/dist/src/lib/errors/base/operational.error.js +19 -0
  82. package/dist/src/lib/errors/base/operational.error.js.map +1 -0
  83. package/dist/src/lib/errors/error.types.d.ts +14 -0
  84. package/dist/src/lib/errors/error.types.d.ts.map +1 -0
  85. package/dist/src/lib/errors/error.types.js +3 -0
  86. package/dist/src/lib/errors/error.types.js.map +1 -0
  87. package/dist/src/lib/errors/index.d.ts +2 -0
  88. package/dist/src/lib/errors/index.d.ts.map +1 -0
  89. package/dist/src/lib/errors/index.js +6 -0
  90. package/dist/src/lib/errors/index.js.map +1 -0
  91. package/dist/src/lib/result.d.ts +20 -0
  92. package/dist/src/lib/result.d.ts.map +1 -0
  93. package/dist/src/lib/result.js +36 -0
  94. package/dist/src/lib/result.js.map +1 -0
  95. package/dist/src/lib/utils.d.ts +51 -0
  96. package/dist/src/lib/utils.d.ts.map +1 -0
  97. package/dist/src/lib/utils.js +119 -0
  98. package/dist/src/lib/utils.js.map +1 -0
  99. package/package.json +49 -35
  100. package/.eslintrc.json +0 -33
  101. package/eslint.config.js +0 -19
  102. package/jest.config.ts +0 -10
  103. package/project.json +0 -19
  104. package/src/index.ts +0 -33
  105. package/src/lib/Constants.ts +0 -124
  106. package/src/lib/DeferredPromise.ts +0 -14
  107. package/src/lib/Expression.ts +0 -375
  108. package/src/lib/Interfaces.ts +0 -2262
  109. package/src/lib/LoggerProxy.ts +0 -43
  110. package/src/lib/MetadataUtils.ts +0 -34
  111. package/src/lib/NodeErrors.ts +0 -332
  112. package/src/lib/NodeHelpers.ts +0 -1666
  113. package/src/lib/ObservableObject.ts +0 -77
  114. package/src/lib/RoutingNode.ts +0 -862
  115. package/src/lib/TelemetryHelpers.ts +0 -86
  116. package/src/lib/TypeValidation.ts +0 -431
  117. package/src/lib/VersionedNodeType.ts +0 -30
  118. package/src/lib/Workflow.ts +0 -1270
  119. package/src/lib/WorkflowDataProxy.ts +0 -708
  120. package/src/lib/WorkflowErrors.ts +0 -18
  121. package/src/lib/WorkflowHooks.ts +0 -51
  122. package/src/lib/errors/base/base.error.ts +0 -68
  123. package/src/lib/errors/base/operational.error.ts +0 -21
  124. package/src/lib/errors/error.types.ts +0 -14
  125. package/src/lib/errors/index.ts +0 -1
  126. package/src/lib/result.ts +0 -34
  127. package/src/lib/utils.ts +0 -166
  128. package/tests/Helpers.ts +0 -667
  129. package/tests/NodeHelpers.test.ts +0 -3053
  130. package/tests/ObservableObject.test.ts +0 -171
  131. package/tests/RoutingNode.test.ts +0 -1680
  132. package/tests/Workflow.test.ts +0 -1284
  133. package/tests/WorkflowDataProxy.test.ts +0 -199
  134. package/tsconfig.json +0 -27
  135. package/tsconfig.lib.json +0 -11
  136. 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';
@@ -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
- }
@@ -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
- }