fix(core): Make node execution order configurable, and backward-compatible (#6507)

* fix(core): Make node execution order configurable, and backward-compatible

*  Also add new Merge-Node behaviour

*  Fix typo

* Fix lint issue

* update labels

* rename legacy to v0

* remove the unnecessary log

* default all new workflows to use v1 execution-order

* remove the controller changes

* clone default settings to avoid it getting modified

---------

Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™
2023-07-05 18:47:34 +02:00
committed by GitHub
parent f0dfc3cf4e
commit d97edbcffa
18 changed files with 2156 additions and 1042 deletions

View File

@@ -1429,8 +1429,7 @@ export interface INodeTypeDescription extends INodeTypeBaseDescription {
eventTriggerDescription?: string;
activationMessage?: string;
inputs: string[];
forceInputNodeExecution?: string | boolean; // TODO: This option should be deprecated after a while
requiredInputs?: string | number[] | number;
requiredInputs?: string | number[] | number; // Ony available with executionOrder => "v1"
inputNames?: string[];
outputs: string[];
outputNames?: string[];
@@ -1770,6 +1769,7 @@ export interface IWorkflowSettings {
saveManualExecutions?: 'DEFAULT' | boolean;
saveExecutionProgress?: 'DEFAULT' | boolean;
executionTimeout?: number;
executionOrder?: 'v0' | 'v1';
}
export interface WorkflowTestData {

View File

@@ -1191,26 +1191,14 @@ export class Workflow {
connectionInputData = inputData.main[0] as INodeExecutionData[];
}
let forceInputNodeExecution = nodeType.description.forceInputNodeExecution;
if (forceInputNodeExecution !== undefined) {
if (typeof forceInputNodeExecution === 'string') {
forceInputNodeExecution = !!this.expression.getSimpleParameterValue(
node,
forceInputNodeExecution,
mode,
additionalData.timezone,
{ $version: node.typeVersion },
);
}
if (!forceInputNodeExecution) {
// If the nodes do not get force executed data of some inputs may be missing
// for that reason do we use the data of the first one that contains any
for (const mainData of inputData.main) {
if (mainData?.length) {
connectionInputData = mainData;
break;
}
const forceInputNodeExecution = this.settings.executionOrder !== 'v1';
if (!forceInputNodeExecution) {
// If the nodes do not get force executed data of some inputs may be missing
// for that reason do we use the data of the first one that contains any
for (const mainData of inputData.main) {
if (mainData?.length) {
connectionInputData = mainData;
break;
}
}
}