import type { ITriggerFunctions, INodeType, INodeTypeDescription, ITriggerResponse, TriggerTime, } from 'n8n-workflow'; import { NodeConnectionType, NodeHelpers, toCronExpression } from 'n8n-workflow'; export class Cron implements INodeType { description: INodeTypeDescription = { displayName: 'Cron', name: 'cron', icon: 'fa:clock', group: ['trigger', 'schedule'], version: 1, hidden: true, description: 'Triggers the workflow at a specific time', eventTriggerDescription: '', activationMessage: 'Your cron trigger will now trigger executions on the schedule you have defined.', defaults: { name: 'Cron', color: '#29a568', }, // eslint-disable-next-line n8n-nodes-base/node-class-description-inputs-wrong-regular-node inputs: [], outputs: [NodeConnectionType.Main], properties: [ { displayName: 'This workflow will run on the schedule you define here once you activate it.

For testing, you can also trigger it manually: by going back to the canvas and clicking \'test workflow\'', name: 'notice', type: 'notice', default: '', }, { displayName: 'Trigger Times', name: 'triggerTimes', type: 'fixedCollection', typeOptions: { multipleValues: true, multipleValueButtonText: 'Add Time', }, default: {}, description: 'Triggers for the workflow', placeholder: 'Add Cron Time', options: NodeHelpers.cronNodeOptions, }, ], }; async trigger(this: ITriggerFunctions): Promise { const triggerTimes = this.getNodeParameter('triggerTimes') as unknown as { item: TriggerTime[]; }; // Get all the trigger times const cronTimes = (triggerTimes.item || []).map(toCronExpression); // The trigger function to execute when the cron-time got reached // or when manually triggered const executeTrigger = () => { this.emit([this.helpers.returnJsonArray([{}])]); }; // Register the cron-jobs cronTimes.forEach((cronTime) => this.helpers.registerCron(cronTime, executeTrigger)); return { manualTriggerFunction: async () => executeTrigger(), }; } }