diff --git a/packages/nodes-base/nodes/Schedule/GenericFunctions.ts b/packages/nodes-base/nodes/Schedule/GenericFunctions.ts index 15b753656c..7b8dc463ee 100644 --- a/packages/nodes-base/nodes/Schedule/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Schedule/GenericFunctions.ts @@ -1,3 +1,4 @@ +import type { IDataObject } from 'n8n-workflow'; import type { IRecurencyRule } from './SchedulerInterface'; import moment from 'moment'; @@ -55,3 +56,28 @@ export function recurencyCheck( } return false; } + +export function convertMonthToUnix(expression: string): string { + if (!isNaN(parseInt(expression)) || expression.includes('-') || expression.includes(',')) { + let matches = expression.match(/([0-9])+/g) as string[]; + if (matches) { + matches = matches.map((match) => + parseInt(match) !== 0 ? String(parseInt(match) - 1) : match, + ); + } + expression = matches?.join(expression.includes('-') ? '-' : ',') || ''; + } + return expression; +} + +export function convertToUnixFormat(interval: IDataObject) { + const expression = (interval.expression as string).split(' '); + if (expression.length === 5) { + expression[3] = convertMonthToUnix(expression[3]); + expression[4] = expression[4].replace('7', '0'); + } else if (expression.length === 6) { + expression[4] = convertMonthToUnix(expression[4]); + expression[5] = expression[5].replace('7', '0'); + } + interval.expression = expression.join(' '); +} diff --git a/packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts b/packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts index 6990c746a3..20748917c9 100644 --- a/packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts +++ b/packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts @@ -10,7 +10,7 @@ import { NodeOperationError } from 'n8n-workflow'; import { CronJob } from 'cron'; import moment from 'moment'; import type { IRecurencyRule } from './SchedulerInterface'; -import { recurencyCheck } from './GenericFunctions'; +import { convertToUnixFormat, recurencyCheck } from './GenericFunctions'; export class ScheduleTrigger implements INodeType { description: INodeTypeDescription = { @@ -18,7 +18,7 @@ export class ScheduleTrigger implements INodeType { name: 'scheduleTrigger', icon: 'fa:clock', group: ['trigger', 'schedule'], - version: 1, + version: [1, 1.1], description: 'Triggers the workflow on a given schedule', eventTriggerDescription: '', activationMessage: @@ -415,6 +415,7 @@ export class ScheduleTrigger implements INodeType { const rule = this.getNodeParameter('rule', []) as IDataObject; const interval = rule.interval as IDataObject[]; const timezone = this.getTimezone(); + const version = this.getNode().typeVersion; const cronJobs: CronJob[] = []; const intervalArr: NodeJS.Timeout[] = []; const staticData = this.getWorkflowStaticData('node') as { @@ -450,6 +451,10 @@ export class ScheduleTrigger implements INodeType { for (let i = 0; i < interval.length; i++) { let intervalValue = 1000; if (interval[i].field === 'cronExpression') { + if (version > 1) { + // ! Remove this part if we use a cron library that follows unix cron expression + convertToUnixFormat(interval[i]); + } const cronExpression = interval[i].expression as string; try { const cronJob = new CronJob(