refactor(core): Move execution engine code out of n8n-workflow (no-changelog) (#12147)

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™
2024-12-12 13:54:44 +01:00
committed by GitHub
parent 73f0c4cca9
commit 5a055ed526
44 changed files with 1995 additions and 1795 deletions

View File

@@ -162,7 +162,7 @@ const executeButtonTooltip = computed(() => {
node.value &&
isLatestNodeVersion.value &&
props.inputSize > 1 &&
!NodeHelpers.isSingleExecution(node.value.type, node.value.parameters)
!nodeHelpers.isSingleExecution(node.value.type, node.value.parameters)
) {
return i18n.baseText('nodeSettings.executeButtonTooltip.times', {
interpolate: { inputSize: props.inputSize },

View File

@@ -234,4 +234,37 @@ describe('useNodeHelpers()', () => {
expect(webhook.webhookId).toMatch(/\w+(-\w+)+/);
});
});
describe('isSingleExecution', () => {
let isSingleExecution: ReturnType<typeof useNodeHelpers>['isSingleExecution'];
beforeEach(() => {
isSingleExecution = useNodeHelpers().isSingleExecution;
});
test('should determine based on node parameters if it would be executed once', () => {
expect(isSingleExecution('n8n-nodes-base.code', {})).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.code', { mode: 'runOnceForEachItem' })).toEqual(
false,
);
expect(isSingleExecution('n8n-nodes-base.executeWorkflow', {})).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.executeWorkflow', { mode: 'each' })).toEqual(false);
expect(isSingleExecution('n8n-nodes-base.crateDb', {})).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.crateDb', { operation: 'update' })).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.timescaleDb', {})).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.timescaleDb', { operation: 'update' })).toEqual(
true,
);
expect(isSingleExecution('n8n-nodes-base.microsoftSql', {})).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.microsoftSql', { operation: 'update' })).toEqual(
true,
);
expect(isSingleExecution('n8n-nodes-base.microsoftSql', { operation: 'delete' })).toEqual(
true,
);
expect(isSingleExecution('n8n-nodes-base.questDb', {})).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.mongoDb', { operation: 'insert' })).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.mongoDb', { operation: 'update' })).toEqual(true);
expect(isSingleExecution('n8n-nodes-base.redis', {})).toEqual(true);
});
});
});

View File

@@ -35,6 +35,7 @@ import type {
INodeTypeNameVersion,
IConnection,
IPinData,
NodeParameterValue,
} from 'n8n-workflow';
import type {
@@ -1268,6 +1269,50 @@ export function useNodeHelpers() {
return id;
}
/** nodes that would execute only once with such parameters add 'undefined' to parameters values if it is parameter's default value */
const SINGLE_EXECUTION_NODES: { [key: string]: { [key: string]: NodeParameterValue[] } } = {
'n8n-nodes-base.code': {
mode: [undefined, 'runOnceForAllItems'],
},
'n8n-nodes-base.executeWorkflow': {
mode: [undefined, 'once'],
},
'n8n-nodes-base.crateDb': {
operation: [undefined, 'update'], // default insert
},
'n8n-nodes-base.timescaleDb': {
operation: [undefined, 'update'], // default insert
},
'n8n-nodes-base.microsoftSql': {
operation: [undefined, 'update', 'delete'], // default insert
},
'n8n-nodes-base.questDb': {
operation: [undefined], // default insert
},
'n8n-nodes-base.mongoDb': {
operation: ['insert', 'update'],
},
'n8n-nodes-base.redis': {
operation: [undefined], // default info
},
};
function isSingleExecution(type: string, parameters: INodeParameters): boolean {
const singleExecutionCase = SINGLE_EXECUTION_NODES[type];
if (singleExecutionCase) {
for (const parameter of Object.keys(singleExecutionCase)) {
if (!singleExecutionCase[parameter].includes(parameters[parameter] as NodeParameterValue)) {
return false;
}
}
return true;
}
return false;
}
return {
hasProxyAuth,
isCustomApiCallSelected,
@@ -1305,5 +1350,6 @@ export function useNodeHelpers() {
getNodeTaskData,
assignNodeId,
assignWebhookId,
isSingleExecution,
};
}