@xtr-dev/payload-automation 0.0.35 → 0.0.37

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 (74) hide show
  1. package/README.md +61 -0
  2. package/dist/collections/Workflow.js +30 -305
  3. package/dist/collections/Workflow.js.map +1 -1
  4. package/dist/components/ErrorDisplay.js +3 -3
  5. package/dist/components/ErrorDisplay.js.map +1 -1
  6. package/dist/core/workflow-executor.d.ts +33 -85
  7. package/dist/core/workflow-executor.js +136 -229
  8. package/dist/core/workflow-executor.js.map +1 -1
  9. package/dist/exports/client.d.ts +0 -2
  10. package/dist/exports/client.js +1 -3
  11. package/dist/exports/client.js.map +1 -1
  12. package/dist/fields/parameter.d.ts +4 -0
  13. package/dist/fields/parameter.js +32 -0
  14. package/dist/fields/parameter.js.map +1 -0
  15. package/dist/plugin/collection-hook.d.ts +1 -0
  16. package/dist/plugin/collection-hook.js +58 -0
  17. package/dist/plugin/collection-hook.js.map +1 -0
  18. package/dist/plugin/config-types.d.ts +14 -17
  19. package/dist/plugin/config-types.js.map +1 -1
  20. package/dist/plugin/global-hook.d.ts +1 -0
  21. package/dist/plugin/global-hook.js +83 -0
  22. package/dist/plugin/global-hook.js.map +1 -0
  23. package/dist/plugin/index.js +83 -206
  24. package/dist/plugin/index.js.map +1 -1
  25. package/dist/plugin/logger.js +23 -7
  26. package/dist/plugin/logger.js.map +1 -1
  27. package/dist/test/workflow-executor.test.js +2 -2
  28. package/dist/test/workflow-executor.test.js.map +1 -1
  29. package/dist/triggers/collection-trigger.d.ts +2 -0
  30. package/dist/triggers/collection-trigger.js +36 -0
  31. package/dist/triggers/collection-trigger.js.map +1 -0
  32. package/dist/triggers/global-trigger.d.ts +2 -0
  33. package/dist/triggers/global-trigger.js +29 -0
  34. package/dist/triggers/global-trigger.js.map +1 -0
  35. package/dist/triggers/index.d.ts +2 -0
  36. package/dist/triggers/index.js +4 -0
  37. package/dist/triggers/index.js.map +1 -0
  38. package/dist/triggers/types.d.ts +5 -0
  39. package/dist/triggers/types.js +3 -0
  40. package/dist/triggers/types.js.map +1 -0
  41. package/package.json +1 -1
  42. package/dist/components/TriggerWorkflowButton.d.ts +0 -7
  43. package/dist/components/TriggerWorkflowButton.js +0 -46
  44. package/dist/components/TriggerWorkflowButton.js.map +0 -1
  45. package/dist/components/WorkflowExecutionStatus.d.ts +0 -6
  46. package/dist/components/WorkflowExecutionStatus.js +0 -287
  47. package/dist/components/WorkflowExecutionStatus.js.map +0 -1
  48. package/dist/exports/helpers.d.ts +0 -25
  49. package/dist/exports/helpers.js +0 -28
  50. package/dist/exports/helpers.js.map +0 -1
  51. package/dist/plugin/cron-scheduler.d.ts +0 -32
  52. package/dist/plugin/cron-scheduler.js +0 -537
  53. package/dist/plugin/cron-scheduler.js.map +0 -1
  54. package/dist/plugin/init-collection-hooks.d.ts +0 -4
  55. package/dist/plugin/init-collection-hooks.js +0 -100
  56. package/dist/plugin/init-collection-hooks.js.map +0 -1
  57. package/dist/plugin/init-global-hooks.d.ts +0 -3
  58. package/dist/plugin/init-global-hooks.js +0 -83
  59. package/dist/plugin/init-global-hooks.js.map +0 -1
  60. package/dist/plugin/init-step-tasks.d.ts +0 -3
  61. package/dist/plugin/init-step-tasks.js +0 -22
  62. package/dist/plugin/init-step-tasks.js.map +0 -1
  63. package/dist/plugin/init-webhook.d.ts +0 -2
  64. package/dist/plugin/init-webhook.js +0 -163
  65. package/dist/plugin/init-webhook.js.map +0 -1
  66. package/dist/plugin/init-workflow-hooks.d.ts +0 -6
  67. package/dist/plugin/init-workflow-hooks.js +0 -46
  68. package/dist/plugin/init-workflow-hooks.js.map +0 -1
  69. package/dist/utils/trigger-helpers.d.ts +0 -60
  70. package/dist/utils/trigger-helpers.js +0 -130
  71. package/dist/utils/trigger-helpers.js.map +0 -1
  72. package/dist/utils/trigger-presets.d.ts +0 -24
  73. package/dist/utils/trigger-presets.js +0 -177
  74. package/dist/utils/trigger-presets.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/plugin/cron-scheduler.ts"],"sourcesContent":["import type {Config, Payload, TaskConfig} from 'payload'\n\nimport cron from 'node-cron'\n\nimport {type PayloadWorkflow, WorkflowExecutor} from '../core/workflow-executor.js'\nimport {getConfigLogger} from './logger.js'\n\n/**\n * Generate dynamic cron tasks for all workflows with cron triggers\n * This is called at config time to register all scheduled tasks\n */\nexport function generateCronTasks(config: Config): void {\n const logger = getConfigLogger()\n\n // Note: We can't query the database at config time, so we'll need a different approach\n // We'll create a single task that handles all cron-triggered workflows\n const cronTask: TaskConfig = {\n slug: 'workflow-cron-executor',\n handler: async ({ input, req }) => {\n const { cronExpression, timezone, workflowId } = input as {\n cronExpression?: string\n timezone?: string\n workflowId: string\n }\n\n const logger = req.payload.logger.child({ plugin: '@xtr-dev/payload-automation' })\n\n try {\n // Get the workflow\n const workflow = await req.payload.findByID({\n id: workflowId,\n collection: 'workflows',\n depth: 2,\n req\n })\n\n if (!workflow) {\n throw new Error(`Workflow ${workflowId} not found`)\n }\n\n // Create execution context for cron trigger\n const context = {\n steps: {},\n trigger: {\n type: 'cron',\n req,\n triggeredAt: new Date().toISOString()\n }\n }\n\n // Create executor\n const executor = new WorkflowExecutor(req.payload, logger)\n\n // Find the matching cron trigger and check its condition if present\n const triggers = workflow.triggers as Array<{\n condition?: string\n parameters?: {\n cronExpression?: string\n timezone?: string\n [key: string]: any\n }\n type: string\n }>\n\n const matchingTrigger = triggers?.find(trigger =>\n trigger.type === 'cron-trigger' &&\n trigger.parameters?.cronExpression === cronExpression\n )\n\n // Check trigger condition if present\n if (matchingTrigger?.condition) {\n const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context)\n\n if (!conditionMet) {\n logger.info({\n condition: matchingTrigger.condition,\n cronExpression,\n workflowId,\n workflowName: workflow.name\n }, 'Cron trigger condition not met, skipping workflow execution')\n\n // Re-queue for next execution but don't run workflow\n if (cronExpression) {\n void requeueCronJob(workflowId, cronExpression, timezone, req.payload, logger)\n }\n\n return {\n output: {\n executedAt: new Date().toISOString(),\n reason: 'Condition not met',\n status: 'skipped',\n workflowId\n },\n state: 'succeeded'\n }\n }\n\n logger.info({\n condition: matchingTrigger.condition,\n cronExpression,\n workflowId,\n workflowName: workflow.name\n }, 'Cron trigger condition met')\n }\n\n // Execute the workflow\n await executor.execute(workflow as PayloadWorkflow, context, req)\n\n // Re-queue the job for the next scheduled execution if cronExpression is provided\n if (cronExpression) {\n void requeueCronJob(workflowId, cronExpression, timezone, req.payload, logger)\n }\n\n return {\n output: {\n executedAt: new Date().toISOString(),\n status: 'completed',\n workflowId\n },\n state: 'succeeded'\n }\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n workflowId\n }, 'Cron job execution failed')\n\n // Re-queue even on failure to ensure continuity (unless it's a validation error)\n if (cronExpression && !(error instanceof Error && error.message.includes('Invalid cron'))) {\n void requeueCronJob(workflowId, cronExpression, timezone, req.payload, logger)\n .catch((requeueError) => {\n logger.error({\n error: requeueError instanceof Error ? requeueError.message : 'Unknown error',\n workflowId\n }, 'Failed to re-queue cron job after execution failure')\n })\n }\n\n return {\n output: {\n error: error instanceof Error ? error.message : 'Unknown error',\n workflowId\n },\n state: 'failed'\n }\n }\n }\n }\n\n // Add the cron task to config if not already present\n if (!config.jobs) {\n config.jobs = { tasks: [] }\n }\n\n if (!config.jobs.tasks) {\n config.jobs.tasks = []\n }\n\n if (!config.jobs.tasks.find(task => task.slug === cronTask.slug)) {\n logger.debug(`Registering cron executor task: ${cronTask.slug}`)\n config.jobs.tasks.push(cronTask)\n } else {\n logger.debug(`Cron executor task ${cronTask.slug} already registered, skipping`)\n }\n}\n\n/**\n * Register cron jobs for workflows with cron triggers\n * This is called at runtime after PayloadCMS is initialized\n */\nexport async function registerCronJobs(payload: Payload, logger: Payload['logger']): Promise<void> {\n try {\n // Find all workflows with cron triggers\n const workflows = await payload.find({\n collection: 'workflows',\n depth: 0,\n limit: 1000,\n where: {\n 'triggers.type': {\n equals: 'cron-trigger'\n }\n }\n })\n\n logger.info(`Found ${workflows.docs.length} workflows with cron triggers`)\n\n for (const workflow of workflows.docs) {\n const triggers = workflow.triggers as Array<{\n parameters?: {\n cronExpression?: string\n timezone?: string\n [key: string]: any\n }\n type: string\n }>\n\n // Find all cron triggers for this workflow\n const cronTriggers = triggers?.filter(t => t.type === 'cron-trigger') || []\n\n for (const trigger of cronTriggers) {\n if (trigger.parameters?.cronExpression) {\n try {\n // Validate cron expression before queueing\n if (!validateCronExpression(trigger.parameters.cronExpression)) {\n logger.error({\n cronExpression: trigger.parameters.cronExpression,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Invalid cron expression format')\n continue\n }\n\n // Validate timezone if provided\n if (trigger.parameters?.timezone) {\n try {\n // Test if timezone is valid by trying to create a date with it\n new Intl.DateTimeFormat('en', { timeZone: trigger.parameters.timezone })\n } catch {\n logger.error({\n timezone: trigger.parameters.timezone,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Invalid timezone specified')\n continue\n }\n }\n\n // Calculate next execution time\n const nextExecution = getNextCronTime(trigger.parameters.cronExpression, trigger.parameters?.timezone)\n\n // Queue the job\n await payload.jobs.queue({\n input: { cronExpression: trigger.parameters.cronExpression, timezone: trigger.parameters?.timezone, workflowId: workflow.id },\n task: 'workflow-cron-executor',\n waitUntil: nextExecution\n })\n\n logger.info({\n cronExpression: trigger.parameters.cronExpression,\n nextExecution: nextExecution.toISOString(),\n timezone: trigger.parameters?.timezone || 'UTC',\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Queued initial cron job for workflow')\n } catch (error) {\n logger.error({\n cronExpression: trigger.parameters.cronExpression,\n error: error instanceof Error ? error.message : 'Unknown error',\n timezone: trigger.parameters?.timezone,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Failed to queue cron job')\n }\n } else {\n logger.warn({\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Cron trigger found but no cron expression specified')\n }\n }\n }\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 'Failed to register cron jobs')\n }\n}\n\n/**\n * Validate a cron expression\n */\nexport function validateCronExpression(cronExpression: string): boolean {\n return cron.validate(cronExpression)\n}\n\n/**\n * Calculate the next time a cron expression should run\n */\nfunction getNextCronTime(cronExpression: string, timezone?: string): Date {\n if (!validateCronExpression(cronExpression)) {\n throw new Error(`Invalid cron expression: ${cronExpression}`)\n }\n\n const now = new Date()\n const options: { timezone?: string } = timezone ? { timezone } : {}\n\n // Create a task to find the next execution time\n const task = cron.schedule(cronExpression, () => {}, {\n ...options\n })\n\n // Parse cron expression parts\n const cronParts = cronExpression.trim().split(/\\s+/)\n if (cronParts.length !== 5) {\n void task.destroy()\n throw new Error(`Invalid cron format: ${cronExpression}. Expected 5 parts.`)\n }\n\n const [minutePart, hourPart, dayPart, monthPart, weekdayPart] = cronParts\n\n // Calculate next execution with proper lookahead for any schedule frequency\n // Start from next minute and look ahead systematically\n let testTime = new Date(now.getTime() + 60 * 1000) // Start 1 minute from now\n testTime.setSeconds(0, 0) // Reset seconds and milliseconds\n\n // Maximum iterations to prevent infinite loops (covers ~2 years)\n const maxIterations = 2 * 365 * 24 * 60 // 2 years worth of minutes\n let iterations = 0\n\n while (iterations < maxIterations) {\n const minute = testTime.getMinutes()\n const hour = testTime.getHours()\n const dayOfMonth = testTime.getDate()\n const month = testTime.getMonth() + 1\n const dayOfWeek = testTime.getDay()\n\n if (matchesCronPart(minute, minutePart) &&\n matchesCronPart(hour, hourPart) &&\n matchesCronPart(dayOfMonth, dayPart) &&\n matchesCronPart(month, monthPart) &&\n matchesCronPart(dayOfWeek, weekdayPart)) {\n void task.destroy()\n return testTime\n }\n\n // Increment time intelligently based on cron pattern\n testTime = incrementTimeForCronPattern(testTime, cronParts)\n iterations++\n }\n\n void task.destroy()\n throw new Error(`Could not calculate next execution time for cron expression: ${cronExpression} within reasonable timeframe`)\n}\n\n/**\n * Intelligently increment time based on cron pattern to avoid unnecessary iterations\n */\nfunction incrementTimeForCronPattern(currentTime: Date, cronParts: string[]): Date {\n const [minutePart, hourPart, _dayPart, _monthPart, _weekdayPart] = cronParts\n const nextTime = new Date(currentTime)\n\n // If minute is specific (not wildcard), we can jump to next hour\n if (minutePart !== '*' && !minutePart.includes('/')) {\n const targetMinute = getNextValidCronValue(currentTime.getMinutes(), minutePart)\n if (targetMinute <= currentTime.getMinutes()) {\n // Move to next hour\n nextTime.setHours(nextTime.getHours() + 1, targetMinute, 0, 0)\n } else {\n nextTime.setMinutes(targetMinute, 0, 0)\n }\n return nextTime\n }\n\n // If hour is specific and we're past it, jump to next day\n if (hourPart !== '*' && !hourPart.includes('/')) {\n const targetHour = getNextValidCronValue(currentTime.getHours(), hourPart)\n if (targetHour <= currentTime.getHours()) {\n // Move to next day\n nextTime.setDate(nextTime.getDate() + 1)\n nextTime.setHours(targetHour, 0, 0, 0)\n } else {\n nextTime.setHours(targetHour, 0, 0, 0)\n }\n return nextTime\n }\n\n // Default: increment by 1 minute\n nextTime.setTime(nextTime.getTime() + 60 * 1000)\n return nextTime\n}\n\n/**\n * Get the next valid value for a cron part\n */\nfunction getNextValidCronValue(currentValue: number, cronPart: string): number {\n if (cronPart === '*') {return currentValue + 1}\n\n // Handle specific values and ranges\n const values = parseCronPart(cronPart)\n return values.find(v => v > currentValue) || values[0]\n}\n\n/**\n * Parse a cron part into an array of valid values\n */\nfunction parseCronPart(cronPart: string): number[] {\n if (cronPart === '*') {return []}\n\n const values: number[] = []\n\n // Handle comma-separated values\n if (cronPart.includes(',')) {\n cronPart.split(',').forEach(part => {\n values.push(...parseCronPart(part.trim()))\n })\n return values.sort((a, b) => a - b)\n }\n\n // Handle ranges\n if (cronPart.includes('-')) {\n const [start, end] = cronPart.split('-').map(n => parseInt(n, 10))\n for (let i = start; i <= end; i++) {\n values.push(i)\n }\n return values\n }\n\n // Handle step values\n if (cronPart.includes('/')) {\n const [range, step] = cronPart.split('/')\n const stepNum = parseInt(step, 10)\n\n if (range === '*') {\n // For wildcards with steps, return empty - handled elsewhere\n return []\n }\n\n const baseValues = parseCronPart(range)\n return baseValues.filter((_, index) => index % stepNum === 0)\n }\n\n // Single value\n values.push(parseInt(cronPart, 10))\n return values\n}\n\n/**\n * Check if a value matches a cron expression part\n */\nfunction matchesCronPart(value: number, cronPart: string): boolean {\n if (cronPart === '*') {return true}\n\n // Handle step values (e.g., */5)\n if (cronPart.includes('/')) {\n const [range, step] = cronPart.split('/')\n const stepNum = parseInt(step, 10)\n\n if (range === '*') {\n return value % stepNum === 0\n }\n }\n\n // Handle ranges (e.g., 1-5)\n if (cronPart.includes('-')) {\n const [start, end] = cronPart.split('-').map(n => parseInt(n, 10))\n return value >= start && value <= end\n }\n\n // Handle comma-separated values (e.g., 1,3,5)\n if (cronPart.includes(',')) {\n const values = cronPart.split(',').map(n => parseInt(n, 10))\n return values.includes(value)\n }\n\n // Handle single value\n const cronValue = parseInt(cronPart, 10)\n return value === cronValue\n}\n\n/**\n * Handle re-queueing of cron jobs after they execute\n * This ensures the job runs again at the next scheduled time\n */\nexport async function requeueCronJob(\n workflowId: string,\n cronExpression: string,\n timezone: string | undefined,\n payload: Payload,\n logger: Payload['logger']\n): Promise<void> {\n try {\n // Queue the job to run at the next scheduled time\n await payload.jobs.queue({\n input: { cronExpression, timezone, workflowId },\n task: 'workflow-cron-executor',\n waitUntil: getNextCronTime(cronExpression, timezone)\n })\n\n logger.debug({\n nextRun: getNextCronTime(cronExpression, timezone),\n timezone: timezone || 'UTC',\n workflowId\n }, 'Re-queued cron job')\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n workflowId\n }, 'Failed to re-queue cron job')\n }\n}\n\n/**\n * Register or update cron jobs for a specific workflow\n */\nexport async function updateWorkflowCronJobs(\n workflowId: string,\n payload: Payload,\n logger: Payload['logger']\n): Promise<void> {\n try {\n // First, cancel any existing cron jobs for this workflow\n cancelWorkflowCronJobs(workflowId, payload, logger)\n\n // Get the workflow\n const workflow = await payload.findByID({\n id: workflowId,\n collection: 'workflows',\n depth: 0\n })\n\n if (!workflow) {\n logger.warn({ workflowId }, 'Workflow not found for cron job update')\n return\n }\n\n const triggers = workflow.triggers as Array<{\n parameters?: {\n cronExpression?: string\n timezone?: string\n [key: string]: any\n }\n type: string\n }>\n\n // Find all cron triggers for this workflow\n const cronTriggers = triggers?.filter(t => t.type === 'cron-trigger') || []\n\n if (cronTriggers.length === 0) {\n logger.debug({ workflowId }, 'No cron triggers found for workflow')\n return\n }\n\n let scheduledJobs = 0\n\n for (const trigger of cronTriggers) {\n if (trigger.parameters?.cronExpression) {\n try {\n // Validate cron expression before queueing\n if (!validateCronExpression(trigger.parameters.cronExpression)) {\n logger.error({\n cronExpression: trigger.parameters.cronExpression,\n workflowId,\n workflowName: workflow.name\n }, 'Invalid cron expression format')\n continue\n }\n\n // Validate timezone if provided\n if (trigger.parameters?.timezone) {\n try {\n new Intl.DateTimeFormat('en', { timeZone: trigger.parameters.timezone })\n } catch {\n logger.error({\n timezone: trigger.parameters.timezone,\n workflowId,\n workflowName: workflow.name\n }, 'Invalid timezone specified')\n continue\n }\n }\n\n // Calculate next execution time\n const nextExecution = getNextCronTime(trigger.parameters.cronExpression, trigger.parameters?.timezone)\n\n // Queue the job\n await payload.jobs.queue({\n input: { cronExpression: trigger.parameters.cronExpression, timezone: trigger.parameters?.timezone, workflowId },\n task: 'workflow-cron-executor',\n waitUntil: nextExecution\n })\n\n scheduledJobs++\n\n logger.info({\n cronExpression: trigger.parameters.cronExpression,\n nextExecution: nextExecution.toISOString(),\n timezone: trigger.parameters?.timezone || 'UTC',\n workflowId,\n workflowName: workflow.name\n }, 'Scheduled cron job for workflow')\n } catch (error) {\n logger.error({\n cronExpression: trigger.parameters?.cronExpression,\n error: error instanceof Error ? error.message : 'Unknown error',\n timezone: trigger.parameters?.timezone,\n workflowId,\n workflowName: workflow.name\n }, 'Failed to schedule cron job')\n }\n }\n }\n\n if (scheduledJobs > 0) {\n logger.info({ scheduledJobs, workflowId }, 'Updated cron jobs for workflow')\n }\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n workflowId\n }, 'Failed to update workflow cron jobs')\n }\n}\n\n/**\n * Cancel all cron jobs for a specific workflow\n */\nexport function cancelWorkflowCronJobs(\n workflowId: string,\n payload: Payload,\n logger: Payload['logger']\n): void {\n try {\n // Note: PayloadCMS job system doesn't have a built-in way to cancel specific jobs by input\n // This is a limitation we need to work around\n // For now, we log that we would cancel jobs for this workflow\n logger.debug({ workflowId }, 'Would cancel existing cron jobs for workflow (PayloadCMS limitation: cannot selectively cancel jobs)')\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n workflowId\n }, 'Failed to cancel workflow cron jobs')\n }\n}\n\n/**\n * Remove cron jobs for a deleted workflow\n */\nexport function removeWorkflowCronJobs(\n workflowId: string,\n payload: Payload,\n logger: Payload['logger']\n): void {\n try {\n cancelWorkflowCronJobs(workflowId, payload, logger)\n logger.info({ workflowId }, 'Removed cron jobs for deleted workflow')\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n workflowId\n }, 'Failed to remove workflow cron jobs')\n }\n}\n"],"names":["cron","WorkflowExecutor","getConfigLogger","generateCronTasks","config","logger","cronTask","slug","handler","input","req","cronExpression","timezone","workflowId","payload","child","plugin","workflow","findByID","id","collection","depth","Error","context","steps","trigger","type","triggeredAt","Date","toISOString","executor","triggers","matchingTrigger","find","parameters","condition","conditionMet","evaluateCondition","info","workflowName","name","requeueCronJob","output","executedAt","reason","status","state","execute","error","message","includes","catch","requeueError","jobs","tasks","task","debug","push","registerCronJobs","workflows","limit","where","equals","docs","length","cronTriggers","filter","t","validateCronExpression","Intl","DateTimeFormat","timeZone","nextExecution","getNextCronTime","queue","waitUntil","warn","validate","now","options","schedule","cronParts","trim","split","destroy","minutePart","hourPart","dayPart","monthPart","weekdayPart","testTime","getTime","setSeconds","maxIterations","iterations","minute","getMinutes","hour","getHours","dayOfMonth","getDate","month","getMonth","dayOfWeek","getDay","matchesCronPart","incrementTimeForCronPattern","currentTime","_dayPart","_monthPart","_weekdayPart","nextTime","targetMinute","getNextValidCronValue","setHours","setMinutes","targetHour","setDate","setTime","currentValue","cronPart","values","parseCronPart","v","forEach","part","sort","a","b","start","end","map","n","parseInt","i","range","step","stepNum","baseValues","_","index","value","cronValue","nextRun","updateWorkflowCronJobs","cancelWorkflowCronJobs","scheduledJobs","removeWorkflowCronJobs"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { Payload } from "payload";
2
- import type { WorkflowExecutor } from "../core/workflow-executor.js";
3
- import type { WorkflowsPluginConfig } from "./config-types.js";
4
- export declare function initCollectionHooks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor): void;
@@ -1,100 +0,0 @@
1
- export function initCollectionHooks(pluginOptions, payload, logger, executor) {
2
- if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {
3
- logger.warn('No collection triggers configured in plugin options');
4
- return;
5
- }
6
- logger.info({
7
- configuredCollections: Object.keys(pluginOptions.collectionTriggers),
8
- availableCollections: Object.keys(payload.collections)
9
- }, 'Starting collection hook registration');
10
- // Add hooks to configured collections
11
- for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)){
12
- if (!triggerConfig) {
13
- logger.debug({
14
- collectionSlug
15
- }, 'Skipping collection with falsy trigger config');
16
- continue;
17
- }
18
- const collection = payload.collections[collectionSlug];
19
- const crud = triggerConfig === true ? {
20
- create: true,
21
- delete: true,
22
- read: true,
23
- update: true
24
- } : triggerConfig;
25
- if (!collection.config.hooks) {
26
- collection.config.hooks = {};
27
- }
28
- if (crud.update || crud.create) {
29
- collection.config.hooks.afterChange = collection.config.hooks.afterChange || [];
30
- collection.config.hooks.afterChange.push(async (change)=>{
31
- const operation = change.operation;
32
- logger.info({
33
- slug: change.collection.slug,
34
- operation,
35
- docId: change.doc?.id,
36
- previousDocId: change.previousDoc?.id,
37
- hasExecutor: !!executor,
38
- executorType: typeof executor
39
- }, 'Collection automation hook triggered');
40
- try {
41
- // Execute workflows for this trigger
42
- await executor.executeTriggeredWorkflows(change.collection.slug, operation, change.doc, change.previousDoc, change.req);
43
- logger.info({
44
- slug: change.collection.slug,
45
- operation,
46
- docId: change.doc?.id
47
- }, 'Workflow execution completed successfully');
48
- } catch (error) {
49
- logger.error({
50
- slug: change.collection.slug,
51
- operation,
52
- docId: change.doc?.id,
53
- error: error instanceof Error ? error.message : 'Unknown error',
54
- stack: error instanceof Error ? error.stack : undefined
55
- }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed');
56
- // Don't re-throw to avoid breaking other hooks
57
- }
58
- });
59
- }
60
- if (crud.read) {
61
- collection.config.hooks.afterRead = collection.config.hooks.afterRead || [];
62
- collection.config.hooks.afterRead.push(async (change)=>{
63
- logger.debug({
64
- slug: change.collection.slug,
65
- operation: 'read'
66
- }, 'Collection hook triggered');
67
- // Execute workflows for this trigger
68
- await executor.executeTriggeredWorkflows(change.collection.slug, 'read', change.doc, undefined, change.req);
69
- });
70
- }
71
- if (crud.delete) {
72
- collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || [];
73
- collection.config.hooks.afterDelete.push(async (change)=>{
74
- logger.debug({
75
- slug: change.collection.slug,
76
- operation: 'delete'
77
- }, 'Collection hook triggered');
78
- // Execute workflows for this trigger
79
- await executor.executeTriggeredWorkflows(change.collection.slug, 'delete', change.doc, undefined, change.req);
80
- });
81
- }
82
- if (collection) {
83
- logger.info({
84
- collectionSlug,
85
- hooksRegistered: {
86
- afterChange: crud.update || crud.create,
87
- afterRead: crud.read,
88
- afterDelete: crud.delete
89
- }
90
- }, 'Collection hooks registered successfully');
91
- } else {
92
- logger.error({
93
- collectionSlug,
94
- availableCollections: Object.keys(payload.collections)
95
- }, 'Collection not found for trigger configuration - check collection slug spelling');
96
- }
97
- }
98
- }
99
-
100
- //# sourceMappingURL=init-collection-hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/plugin/init-collection-hooks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type { WorkflowExecutor } from \"../core/workflow-executor.js\"\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initCollectionHooks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n \n if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {\n logger.warn('No collection triggers configured in plugin options')\n return\n }\n\n logger.info({\n configuredCollections: Object.keys(pluginOptions.collectionTriggers),\n availableCollections: Object.keys(payload.collections)\n }, 'Starting collection hook registration')\n\n // Add hooks to configured collections\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n logger.debug({collectionSlug}, 'Skipping collection with falsy trigger config')\n continue\n }\n\n const collection = payload.collections[collectionSlug as T]\n const crud: CollectionTriggerConfigCrud = triggerConfig === true ? {\n create: true,\n delete: true,\n read: true,\n update: true,\n } : triggerConfig\n\n if (!collection.config.hooks) {\n collection.config.hooks = {} as typeof collection.config.hooks\n }\n\n if (crud.update || crud.create) {\n collection.config.hooks.afterChange = collection.config.hooks.afterChange || []\n collection.config.hooks.afterChange.push(async (change) => {\n const operation = change.operation as 'create' | 'update'\n \n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n previousDocId: change.previousDoc?.id,\n hasExecutor: !!executor,\n executorType: typeof executor\n }, 'Collection automation hook triggered')\n\n try {\n \n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n operation,\n change.doc,\n change.previousDoc,\n change.req\n )\n \n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id\n }, 'Workflow execution completed successfully')\n } catch (error) {\n \n logger.error({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined\n }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed')\n // Don't re-throw to avoid breaking other hooks\n }\n })\n }\n\n if (crud.read) {\n collection.config.hooks.afterRead = collection.config.hooks.afterRead || []\n collection.config.hooks.afterRead.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'read',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'read',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (crud.delete) {\n collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || []\n collection.config.hooks.afterDelete.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'delete',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'delete',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (collection) {\n logger.info({\n collectionSlug,\n hooksRegistered: {\n afterChange: crud.update || crud.create,\n afterRead: crud.read,\n afterDelete: crud.delete\n }\n }, 'Collection hooks registered successfully')\n } else {\n logger.error({\n collectionSlug,\n availableCollections: Object.keys(payload.collections)\n }, 'Collection not found for trigger configuration - check collection slug spelling')\n }\n }\n}\n"],"names":["initCollectionHooks","pluginOptions","payload","logger","executor","collectionTriggers","Object","keys","length","warn","info","configuredCollections","availableCollections","collections","collectionSlug","triggerConfig","entries","debug","collection","crud","create","delete","read","update","config","hooks","afterChange","push","change","operation","slug","docId","doc","id","previousDocId","previousDoc","hasExecutor","executorType","executeTriggeredWorkflows","req","error","Error","message","stack","undefined","afterRead","afterDelete","hooksRegistered"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { Payload } from "payload";
2
- import type { WorkflowExecutor } from "../core/workflow-executor.js";
3
- export declare function initGlobalHooks(payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor): void;
@@ -1,83 +0,0 @@
1
- export function initGlobalHooks(payload, logger, executor) {
2
- // Get all globals from the config
3
- const globals = payload.config.globals || [];
4
- for (const globalConfig of globals){
5
- const globalSlug = globalConfig.slug;
6
- // Add afterChange hook to global
7
- if (!globalConfig.hooks) {
8
- globalConfig.hooks = {
9
- afterChange: [],
10
- afterRead: [],
11
- beforeChange: [],
12
- beforeRead: [],
13
- beforeValidate: []
14
- };
15
- }
16
- if (!globalConfig.hooks.afterChange) {
17
- globalConfig.hooks.afterChange = [];
18
- }
19
- globalConfig.hooks.afterChange.push(async (change)=>{
20
- logger.debug({
21
- global: globalSlug,
22
- operation: 'update'
23
- }, 'Global hook triggered');
24
- // Execute workflows for this global trigger
25
- await executeTriggeredGlobalWorkflows(globalSlug, 'update', change.doc, change.previousDoc, change.req, payload, logger, executor);
26
- });
27
- logger.info({
28
- globalSlug
29
- }, 'Global hooks registered');
30
- }
31
- }
32
- async function executeTriggeredGlobalWorkflows(globalSlug, operation, doc, previousDoc, req, payload, logger, executor) {
33
- try {
34
- // Find workflows with matching global triggers
35
- const workflows = await payload.find({
36
- collection: 'workflows',
37
- depth: 2,
38
- limit: 100,
39
- req,
40
- where: {
41
- 'triggers.global': {
42
- equals: globalSlug
43
- },
44
- 'triggers.globalOperation': {
45
- equals: operation
46
- },
47
- 'triggers.type': {
48
- equals: 'global-trigger'
49
- }
50
- }
51
- });
52
- for (const workflow of workflows.docs){
53
- logger.info({
54
- globalSlug,
55
- operation,
56
- workflowId: workflow.id,
57
- workflowName: workflow.name
58
- }, 'Triggering global workflow');
59
- // Create execution context
60
- const context = {
61
- steps: {},
62
- trigger: {
63
- type: 'global',
64
- doc,
65
- global: globalSlug,
66
- operation,
67
- previousDoc,
68
- req
69
- }
70
- };
71
- // Execute the workflow
72
- await executor.execute(workflow, context, req);
73
- }
74
- } catch (error) {
75
- logger.error({
76
- error: error instanceof Error ? error.message : 'Unknown error',
77
- globalSlug,
78
- operation
79
- }, 'Failed to execute triggered global workflows');
80
- }
81
- }
82
-
83
- //# sourceMappingURL=init-global-hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/plugin/init-global-hooks.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from \"payload\"\nimport type { Logger } from \"pino\"\n\nimport type { WorkflowExecutor, PayloadWorkflow } from \"../core/workflow-executor.js\"\n\nexport function initGlobalHooks(payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n // Get all globals from the config\n const globals = payload.config.globals || []\n\n for (const globalConfig of globals) {\n const globalSlug = globalConfig.slug\n\n // Add afterChange hook to global\n if (!globalConfig.hooks) {\n globalConfig.hooks = {\n afterChange: [],\n afterRead: [],\n beforeChange: [],\n beforeRead: [],\n beforeValidate: []\n }\n }\n\n if (!globalConfig.hooks.afterChange) {\n globalConfig.hooks.afterChange = []\n }\n\n globalConfig.hooks.afterChange.push(async (change) => {\n logger.debug({\n global: globalSlug,\n operation: 'update'\n }, 'Global hook triggered')\n\n // Execute workflows for this global trigger\n await executeTriggeredGlobalWorkflows(\n globalSlug,\n 'update',\n change.doc,\n change.previousDoc,\n change.req,\n payload,\n logger,\n executor\n )\n })\n\n logger.info({ globalSlug }, 'Global hooks registered')\n }\n}\n\nasync function executeTriggeredGlobalWorkflows(\n globalSlug: string,\n operation: 'update',\n doc: Record<string, any>,\n previousDoc: Record<string, any>,\n req: PayloadRequest,\n payload: Payload,\n logger: Payload['logger'],\n executor: WorkflowExecutor\n): Promise<void> {\n try {\n // Find workflows with matching global triggers\n const workflows = await payload.find({\n collection: 'workflows',\n depth: 2,\n limit: 100,\n req,\n where: {\n 'triggers.global': {\n equals: globalSlug\n },\n 'triggers.globalOperation': {\n equals: operation\n },\n 'triggers.type': {\n equals: 'global-trigger'\n }\n }\n })\n\n for (const workflow of workflows.docs) {\n logger.info({\n globalSlug,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Triggering global workflow')\n\n // Create execution context\n const context = {\n steps: {},\n trigger: {\n type: 'global',\n doc,\n global: globalSlug,\n operation,\n previousDoc,\n req\n }\n }\n\n // Execute the workflow\n await executor.execute(workflow as PayloadWorkflow, context, req)\n }\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n globalSlug,\n operation\n }, 'Failed to execute triggered global workflows')\n }\n}\n"],"names":["initGlobalHooks","payload","logger","executor","globals","config","globalConfig","globalSlug","slug","hooks","afterChange","afterRead","beforeChange","beforeRead","beforeValidate","push","change","debug","global","operation","executeTriggeredGlobalWorkflows","doc","previousDoc","req","info","workflows","find","collection","depth","limit","where","equals","workflow","docs","workflowId","id","workflowName","name","context","steps","trigger","type","execute","error","Error","message"],"mappings":"AAKA,OAAO,SAASA,gBAAgBC,OAAgB,EAAEC,MAAyB,EAAEC,QAA0B;IACrG,kCAAkC;IAClC,MAAMC,UAAUH,QAAQI,MAAM,CAACD,OAAO,IAAI,EAAE;IAE5C,KAAK,MAAME,gBAAgBF,QAAS;QAClC,MAAMG,aAAaD,aAAaE,IAAI;QAEpC,iCAAiC;QACjC,IAAI,CAACF,aAAaG,KAAK,EAAE;YACvBH,aAAaG,KAAK,GAAG;gBACnBC,aAAa,EAAE;gBACfC,WAAW,EAAE;gBACbC,cAAc,EAAE;gBAChBC,YAAY,EAAE;gBACdC,gBAAgB,EAAE;YACpB;QACF;QAEA,IAAI,CAACR,aAAaG,KAAK,CAACC,WAAW,EAAE;YACnCJ,aAAaG,KAAK,CAACC,WAAW,GAAG,EAAE;QACrC;QAEAJ,aAAaG,KAAK,CAACC,WAAW,CAACK,IAAI,CAAC,OAAOC;YACzCd,OAAOe,KAAK,CAAC;gBACXC,QAAQX;gBACRY,WAAW;YACb,GAAG;YAEH,4CAA4C;YAC5C,MAAMC,gCACJb,YACA,UACAS,OAAOK,GAAG,EACVL,OAAOM,WAAW,EAClBN,OAAOO,GAAG,EACVtB,SACAC,QACAC;QAEJ;QAEAD,OAAOsB,IAAI,CAAC;YAAEjB;QAAW,GAAG;IAC9B;AACF;AAEA,eAAea,gCACbb,UAAkB,EAClBY,SAAmB,EACnBE,GAAwB,EACxBC,WAAgC,EAChCC,GAAmB,EACnBtB,OAAgB,EAChBC,MAAyB,EACzBC,QAA0B;IAE1B,IAAI;QACF,+CAA+C;QAC/C,MAAMsB,YAAY,MAAMxB,QAAQyB,IAAI,CAAC;YACnCC,YAAY;YACZC,OAAO;YACPC,OAAO;YACPN;YACAO,OAAO;gBACL,mBAAmB;oBACjBC,QAAQxB;gBACV;gBACA,4BAA4B;oBAC1BwB,QAAQZ;gBACV;gBACA,iBAAiB;oBACfY,QAAQ;gBACV;YACF;QACF;QAEA,KAAK,MAAMC,YAAYP,UAAUQ,IAAI,CAAE;YACrC/B,OAAOsB,IAAI,CAAC;gBACVjB;gBACAY;gBACAe,YAAYF,SAASG,EAAE;gBACvBC,cAAcJ,SAASK,IAAI;YAC7B,GAAG;YAEH,2BAA2B;YAC3B,MAAMC,UAAU;gBACdC,OAAO,CAAC;gBACRC,SAAS;oBACPC,MAAM;oBACNpB;oBACAH,QAAQX;oBACRY;oBACAG;oBACAC;gBACF;YACF;YAEA,uBAAuB;YACvB,MAAMpB,SAASuC,OAAO,CAACV,UAA6BM,SAASf;QAC/D;IACF,EAAE,OAAOoB,OAAO;QACdzC,OAAOyC,KAAK,CAAC;YACXA,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAG;YAChDtC;YACAY;QACF,GAAG;IACL;AACF"}
@@ -1,3 +0,0 @@
1
- import type { Payload } from "payload";
2
- import type { WorkflowsPluginConfig } from "./config-types.js";
3
- export declare function initStepTasks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger']): void;
@@ -1,22 +0,0 @@
1
- export function initStepTasks(pluginOptions, payload, logger) {
2
- logger.info({
3
- stepCount: pluginOptions.steps.length,
4
- steps: pluginOptions.steps.map((s)=>s.slug)
5
- }, 'Step tasks were registered during config phase');
6
- // Verify that the tasks are available in the job system
7
- const availableTasks = payload.config.jobs?.tasks?.map((t)=>t.slug) || [];
8
- const pluginTasks = pluginOptions.steps.map((s)=>s.slug);
9
- pluginTasks.forEach((taskSlug)=>{
10
- if (availableTasks.includes(taskSlug)) {
11
- logger.info({
12
- taskSlug
13
- }, 'Step task confirmed available in job system');
14
- } else {
15
- logger.error({
16
- taskSlug
17
- }, 'Step task not found in job system - this will cause execution failures');
18
- }
19
- });
20
- }
21
-
22
- //# sourceMappingURL=init-step-tasks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/plugin/init-step-tasks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type {WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initStepTasks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger']) {\n logger.info({ stepCount: pluginOptions.steps.length, steps: pluginOptions.steps.map(s => s.slug) }, 'Step tasks were registered during config phase')\n\n // Verify that the tasks are available in the job system\n const availableTasks = payload.config.jobs?.tasks?.map(t => t.slug) || []\n const pluginTasks = pluginOptions.steps.map(s => s.slug)\n \n pluginTasks.forEach(taskSlug => {\n if (availableTasks.includes(taskSlug)) {\n logger.info({ taskSlug }, 'Step task confirmed available in job system')\n } else {\n logger.error({ taskSlug }, 'Step task not found in job system - this will cause execution failures')\n }\n })\n}\n"],"names":["initStepTasks","pluginOptions","payload","logger","info","stepCount","steps","length","map","s","slug","availableTasks","config","jobs","tasks","t","pluginTasks","forEach","taskSlug","includes","error"],"mappings":"AAKA,OAAO,SAASA,cAAgCC,aAAuC,EAAEC,OAAgB,EAAEC,MAAyB;IAClIA,OAAOC,IAAI,CAAC;QAAEC,WAAWJ,cAAcK,KAAK,CAACC,MAAM;QAAED,OAAOL,cAAcK,KAAK,CAACE,GAAG,CAACC,CAAAA,IAAKA,EAAEC,IAAI;IAAE,GAAG;IAEpG,wDAAwD;IACxD,MAAMC,iBAAiBT,QAAQU,MAAM,CAACC,IAAI,EAAEC,OAAON,IAAIO,CAAAA,IAAKA,EAAEL,IAAI,KAAK,EAAE;IACzE,MAAMM,cAAcf,cAAcK,KAAK,CAACE,GAAG,CAACC,CAAAA,IAAKA,EAAEC,IAAI;IAEvDM,YAAYC,OAAO,CAACC,CAAAA;QAClB,IAAIP,eAAeQ,QAAQ,CAACD,WAAW;YACrCf,OAAOC,IAAI,CAAC;gBAAEc;YAAS,GAAG;QAC5B,OAAO;YACLf,OAAOiB,KAAK,CAAC;gBAAEF;YAAS,GAAG;QAC7B;IACF;AACF"}
@@ -1,2 +0,0 @@
1
- import type { Config } from 'payload';
2
- export declare function initWebhookEndpoint(config: Config, webhookPrefix?: string): void;
@@ -1,163 +0,0 @@
1
- import { WorkflowExecutor } from '../core/workflow-executor.js';
2
- import { getConfigLogger, initializeLogger } from './logger.js';
3
- export function initWebhookEndpoint(config, webhookPrefix = 'webhook') {
4
- const logger = getConfigLogger();
5
- // Ensure the prefix starts with a slash
6
- const normalizedPrefix = webhookPrefix.startsWith('/') ? webhookPrefix : `/${webhookPrefix}`;
7
- logger.debug(`Adding webhook endpoint: ${normalizedPrefix}`);
8
- // Define webhook endpoint
9
- const webhookEndpoint = {
10
- handler: async (req)=>{
11
- const { path } = req.routeParams;
12
- const webhookData = req.body || {};
13
- logger.debug('Webhook endpoint handler called, path: ' + path);
14
- try {
15
- // Find workflows with matching webhook triggers
16
- const workflows = await req.payload.find({
17
- collection: 'workflows',
18
- depth: 2,
19
- limit: 100,
20
- req,
21
- where: {
22
- 'triggers.type': {
23
- equals: 'webhook-trigger'
24
- },
25
- 'triggers.webhookPath': {
26
- equals: path
27
- }
28
- }
29
- });
30
- if (workflows.docs.length === 0) {
31
- return new Response(JSON.stringify({
32
- error: 'No workflows found for this webhook path'
33
- }), {
34
- headers: {
35
- 'Content-Type': 'application/json'
36
- },
37
- status: 404
38
- });
39
- }
40
- // Create a workflow executor for this request
41
- const logger = initializeLogger(req.payload);
42
- const executor = new WorkflowExecutor(req.payload, logger);
43
- const executionPromises = workflows.docs.map(async (workflow)=>{
44
- try {
45
- // Create execution context for the webhook trigger
46
- const context = {
47
- steps: {},
48
- trigger: {
49
- type: 'webhook',
50
- data: webhookData,
51
- headers: Object.fromEntries(req.headers?.entries() || []),
52
- path,
53
- req
54
- }
55
- };
56
- // Find the matching trigger and check its condition if present
57
- const triggers = workflow.triggers;
58
- const matchingTrigger = triggers?.find((trigger)=>trigger.type === 'webhook-trigger' && trigger.parameters?.webhookPath === path);
59
- // Check trigger condition if present
60
- if (matchingTrigger?.condition) {
61
- logger.debug({
62
- condition: matchingTrigger.condition,
63
- path,
64
- webhookData: JSON.stringify(webhookData).substring(0, 200),
65
- headers: Object.keys(context.trigger.headers || {}),
66
- workflowId: workflow.id,
67
- workflowName: workflow.name
68
- }, 'Evaluating webhook trigger condition');
69
- const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context);
70
- if (!conditionMet) {
71
- logger.info({
72
- condition: matchingTrigger.condition,
73
- path,
74
- webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),
75
- workflowId: workflow.id,
76
- workflowName: workflow.name
77
- }, 'Webhook trigger condition not met, skipping workflow');
78
- return {
79
- reason: 'Condition not met',
80
- status: 'skipped',
81
- workflowId: workflow.id
82
- };
83
- }
84
- logger.info({
85
- condition: matchingTrigger.condition,
86
- path,
87
- webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),
88
- workflowId: workflow.id,
89
- workflowName: workflow.name
90
- }, 'Webhook trigger condition met');
91
- }
92
- // Execute the workflow
93
- await executor.execute(workflow, context, req);
94
- return {
95
- status: 'triggered',
96
- workflowId: workflow.id
97
- };
98
- } catch (error) {
99
- return {
100
- error: error instanceof Error ? error.message : 'Unknown error',
101
- status: 'failed',
102
- workflowId: workflow.id
103
- };
104
- }
105
- });
106
- const results = await Promise.allSettled(executionPromises);
107
- const resultsData = results.map((result, index)=>{
108
- const baseResult = {
109
- workflowId: workflows.docs[index].id
110
- };
111
- if (result.status === 'fulfilled') {
112
- return {
113
- ...baseResult,
114
- ...result.value
115
- };
116
- } else {
117
- return {
118
- ...baseResult,
119
- error: result.reason,
120
- status: 'failed'
121
- };
122
- }
123
- });
124
- return new Response(JSON.stringify({
125
- message: `Triggered ${workflows.docs.length} workflow(s)`,
126
- results: resultsData
127
- }), {
128
- headers: {
129
- 'Content-Type': 'application/json'
130
- },
131
- status: 200
132
- });
133
- } catch (error) {
134
- return new Response(JSON.stringify({
135
- details: error instanceof Error ? error.message : 'Unknown error',
136
- error: 'Failed to process webhook'
137
- }), {
138
- headers: {
139
- 'Content-Type': 'application/json'
140
- },
141
- status: 500
142
- });
143
- }
144
- },
145
- method: 'post',
146
- path: `${normalizedPrefix}/:path`
147
- };
148
- // Check if the webhook endpoint already exists to avoid duplicates
149
- const existingEndpoint = config.endpoints?.find((endpoint)=>endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method);
150
- if (!existingEndpoint) {
151
- // Combine existing endpoints with the webhook endpoint
152
- config.endpoints = [
153
- ...config.endpoints || [],
154
- webhookEndpoint
155
- ];
156
- logger.debug(`Webhook endpoint added at path: ${webhookEndpoint.path}`);
157
- logger.debug('Webhook endpoint added');
158
- } else {
159
- logger.debug(`Webhook endpoint already exists at path: ${webhookEndpoint.path}`);
160
- }
161
- }
162
-
163
- //# sourceMappingURL=init-webhook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/plugin/init-webhook.ts"],"sourcesContent":["import type {Config, PayloadRequest} from 'payload'\n\nimport {type PayloadWorkflow, WorkflowExecutor} from '../core/workflow-executor.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport function initWebhookEndpoint(config: Config, webhookPrefix = 'webhook'): void {\n const logger = getConfigLogger()\n // Ensure the prefix starts with a slash\n const normalizedPrefix = webhookPrefix.startsWith('/') ? webhookPrefix : `/${webhookPrefix}`\n logger.debug(`Adding webhook endpoint: ${normalizedPrefix}`)\n\n // Define webhook endpoint\n const webhookEndpoint = {\n handler: async (req: PayloadRequest) => {\n const {path} = req.routeParams as { path: string }\n const webhookData = req.body || {}\n\n logger.debug('Webhook endpoint handler called, path: ' + path)\n\n try {\n // Find workflows with matching webhook triggers\n const workflows = await req.payload.find({\n collection: 'workflows',\n depth: 2,\n limit: 100,\n req,\n where: {\n 'triggers.type': {\n equals: 'webhook-trigger'\n },\n 'triggers.webhookPath': {\n equals: path\n }\n }\n })\n\n if (workflows.docs.length === 0) {\n return new Response(\n JSON.stringify({error: 'No workflows found for this webhook path'}),\n {\n headers: {'Content-Type': 'application/json'},\n status: 404\n }\n )\n }\n\n // Create a workflow executor for this request\n const logger = initializeLogger(req.payload)\n const executor = new WorkflowExecutor(req.payload, logger)\n\n const executionPromises = workflows.docs.map(async (workflow) => {\n try {\n // Create execution context for the webhook trigger\n const context = {\n steps: {},\n trigger: {\n type: 'webhook',\n data: webhookData,\n headers: Object.fromEntries(req.headers?.entries() || []),\n path,\n req\n }\n }\n\n // Find the matching trigger and check its condition if present\n const triggers = workflow.triggers as Array<{\n condition?: string\n type: string\n parameters?: {\n webhookPath?: string\n [key: string]: any\n }\n }>\n\n const matchingTrigger = triggers?.find(trigger =>\n trigger.type === 'webhook-trigger' &&\n trigger.parameters?.webhookPath === path\n )\n\n // Check trigger condition if present\n if (matchingTrigger?.condition) {\n logger.debug({\n condition: matchingTrigger.condition,\n path,\n webhookData: JSON.stringify(webhookData).substring(0, 200),\n headers: Object.keys(context.trigger.headers || {}),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Evaluating webhook trigger condition')\n\n const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context)\n\n if (!conditionMet) {\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition not met, skipping workflow')\n\n return { reason: 'Condition not met', status: 'skipped', workflowId: workflow.id }\n }\n\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition met')\n }\n\n // Execute the workflow\n await executor.execute(workflow as PayloadWorkflow, context, req)\n\n return { status: 'triggered', workflowId: workflow.id }\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Unknown error',\n status: 'failed',\n workflowId: workflow.id\n }\n }\n })\n\n const results = await Promise.allSettled(executionPromises)\n const resultsData = results.map((result, index) => {\n const baseResult = { workflowId: workflows.docs[index].id }\n if (result.status === 'fulfilled') {\n return { ...baseResult, ...result.value }\n } else {\n return { ...baseResult, error: result.reason, status: 'failed' }\n }\n })\n\n return new Response(\n JSON.stringify({\n message: `Triggered ${workflows.docs.length} workflow(s)`,\n results: resultsData\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 200\n }\n )\n\n } catch (error) {\n return new Response(\n JSON.stringify({\n details: error instanceof Error ? error.message : 'Unknown error',\n error: 'Failed to process webhook'\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 500\n }\n )\n }\n },\n method: 'post' as const,\n path: `${normalizedPrefix}/:path`\n }\n\n // Check if the webhook endpoint already exists to avoid duplicates\n const existingEndpoint = config.endpoints?.find(endpoint =>\n endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method\n )\n\n if (!existingEndpoint) {\n // Combine existing endpoints with the webhook endpoint\n config.endpoints = [...(config.endpoints || []), webhookEndpoint]\n logger.debug(`Webhook endpoint added at path: ${webhookEndpoint.path}`)\n logger.debug('Webhook endpoint added')\n } else {\n logger.debug(`Webhook endpoint already exists at path: ${webhookEndpoint.path}`)\n }\n}\n"],"names":["WorkflowExecutor","getConfigLogger","initializeLogger","initWebhookEndpoint","config","webhookPrefix","logger","normalizedPrefix","startsWith","debug","webhookEndpoint","handler","req","path","routeParams","webhookData","body","workflows","payload","find","collection","depth","limit","where","equals","docs","length","Response","JSON","stringify","error","headers","status","executor","executionPromises","map","workflow","context","steps","trigger","type","data","Object","fromEntries","entries","triggers","matchingTrigger","parameters","webhookPath","condition","substring","keys","workflowId","id","workflowName","name","conditionMet","evaluateCondition","info","webhookDataSnapshot","reason","execute","Error","message","results","Promise","allSettled","resultsData","result","index","baseResult","value","details","method","existingEndpoint","endpoints","endpoint"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import type { Payload } from 'payload';
2
- /**
3
- * Initialize hooks for the workflows collection itself
4
- * to manage cron jobs when workflows are created/updated
5
- */
6
- export declare function initWorkflowHooks(payload: Payload, logger: Payload['logger']): void;
@@ -1,46 +0,0 @@
1
- import { updateWorkflowCronJobs, removeWorkflowCronJobs } from './cron-scheduler.js';
2
- /**
3
- * Initialize hooks for the workflows collection itself
4
- * to manage cron jobs when workflows are created/updated
5
- */ export function initWorkflowHooks(payload, logger) {
6
- // Add afterChange hook to workflows collection to update cron jobs
7
- const workflowsCollection = payload.collections.workflows;
8
- if (!workflowsCollection) {
9
- logger.warn('Workflows collection not found, cannot initialize workflow hooks');
10
- return;
11
- }
12
- // Add afterChange hook to register/update cron jobs
13
- if (!workflowsCollection.config.hooks?.afterChange) {
14
- if (!workflowsCollection.config.hooks) {
15
- // @ts-expect-error - hooks object will be populated by Payload
16
- workflowsCollection.config.hooks = {};
17
- }
18
- workflowsCollection.config.hooks.afterChange = [];
19
- }
20
- workflowsCollection.config.hooks.afterChange.push(async ({ doc, operation })=>{
21
- if (operation === 'create' || operation === 'update') {
22
- logger.debug({
23
- operation,
24
- workflowId: doc.id,
25
- workflowName: doc.name
26
- }, 'Workflow changed, updating cron jobs selectively');
27
- // Update cron jobs for this specific workflow only
28
- await updateWorkflowCronJobs(doc.id, payload, logger);
29
- }
30
- });
31
- // Add afterDelete hook to clean up cron jobs
32
- if (!workflowsCollection.config.hooks?.afterDelete) {
33
- workflowsCollection.config.hooks.afterDelete = [];
34
- }
35
- workflowsCollection.config.hooks.afterDelete.push(async ({ doc })=>{
36
- logger.debug({
37
- workflowId: doc.id,
38
- workflowName: doc.name
39
- }, 'Workflow deleted, removing cron jobs');
40
- // Remove cron jobs for the deleted workflow
41
- removeWorkflowCronJobs(doc.id, payload, logger);
42
- });
43
- logger.info('Workflow hooks initialized for cron job management');
44
- }
45
-
46
- //# sourceMappingURL=init-workflow-hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/plugin/init-workflow-hooks.ts"],"sourcesContent":["import type {Payload} from 'payload'\n\nimport {updateWorkflowCronJobs, removeWorkflowCronJobs} from './cron-scheduler.js'\n\n/**\n * Initialize hooks for the workflows collection itself\n * to manage cron jobs when workflows are created/updated\n */\nexport function initWorkflowHooks(payload: Payload, logger: Payload['logger']): void {\n // Add afterChange hook to workflows collection to update cron jobs\n const workflowsCollection = payload.collections.workflows\n \n if (!workflowsCollection) {\n logger.warn('Workflows collection not found, cannot initialize workflow hooks')\n return\n }\n \n // Add afterChange hook to register/update cron jobs\n if (!workflowsCollection.config.hooks?.afterChange) {\n if (!workflowsCollection.config.hooks) {\n // @ts-expect-error - hooks object will be populated by Payload\n workflowsCollection.config.hooks = {}\n }\n workflowsCollection.config.hooks.afterChange = []\n }\n \n workflowsCollection.config.hooks.afterChange.push(async ({ doc, operation }) => {\n if (operation === 'create' || operation === 'update') {\n logger.debug({\n operation,\n workflowId: doc.id,\n workflowName: doc.name\n }, 'Workflow changed, updating cron jobs selectively')\n \n // Update cron jobs for this specific workflow only\n await updateWorkflowCronJobs(doc.id, payload, logger)\n }\n })\n \n // Add afterDelete hook to clean up cron jobs\n if (!workflowsCollection.config.hooks?.afterDelete) {\n workflowsCollection.config.hooks.afterDelete = []\n }\n \n workflowsCollection.config.hooks.afterDelete.push(async ({ doc }) => {\n logger.debug({\n workflowId: doc.id,\n workflowName: doc.name\n }, 'Workflow deleted, removing cron jobs')\n \n // Remove cron jobs for the deleted workflow\n removeWorkflowCronJobs(doc.id, payload, logger)\n })\n \n logger.info('Workflow hooks initialized for cron job management')\n}"],"names":["updateWorkflowCronJobs","removeWorkflowCronJobs","initWorkflowHooks","payload","logger","workflowsCollection","collections","workflows","warn","config","hooks","afterChange","push","doc","operation","debug","workflowId","id","workflowName","name","afterDelete","info"],"mappings":"AAEA,SAAQA,sBAAsB,EAAEC,sBAAsB,QAAO,sBAAqB;AAElF;;;CAGC,GACD,OAAO,SAASC,kBAAkBC,OAAgB,EAAEC,MAAyB;IAC3E,mEAAmE;IACnE,MAAMC,sBAAsBF,QAAQG,WAAW,CAACC,SAAS;IAEzD,IAAI,CAACF,qBAAqB;QACxBD,OAAOI,IAAI,CAAC;QACZ;IACF;IAEA,oDAAoD;IACpD,IAAI,CAACH,oBAAoBI,MAAM,CAACC,KAAK,EAAEC,aAAa;QAClD,IAAI,CAACN,oBAAoBI,MAAM,CAACC,KAAK,EAAE;YACrC,+DAA+D;YAC/DL,oBAAoBI,MAAM,CAACC,KAAK,GAAG,CAAC;QACtC;QACAL,oBAAoBI,MAAM,CAACC,KAAK,CAACC,WAAW,GAAG,EAAE;IACnD;IAEAN,oBAAoBI,MAAM,CAACC,KAAK,CAACC,WAAW,CAACC,IAAI,CAAC,OAAO,EAAEC,GAAG,EAAEC,SAAS,EAAE;QACzE,IAAIA,cAAc,YAAYA,cAAc,UAAU;YACpDV,OAAOW,KAAK,CAAC;gBACXD;gBACAE,YAAYH,IAAII,EAAE;gBAClBC,cAAcL,IAAIM,IAAI;YACxB,GAAG;YAEH,mDAAmD;YACnD,MAAMnB,uBAAuBa,IAAII,EAAE,EAAEd,SAASC;QAChD;IACF;IAEA,6CAA6C;IAC7C,IAAI,CAACC,oBAAoBI,MAAM,CAACC,KAAK,EAAEU,aAAa;QAClDf,oBAAoBI,MAAM,CAACC,KAAK,CAACU,WAAW,GAAG,EAAE;IACnD;IAEAf,oBAAoBI,MAAM,CAACC,KAAK,CAACU,WAAW,CAACR,IAAI,CAAC,OAAO,EAAEC,GAAG,EAAE;QAC9DT,OAAOW,KAAK,CAAC;YACXC,YAAYH,IAAII,EAAE;YAClBC,cAAcL,IAAIM,IAAI;QACxB,GAAG;QAEH,4CAA4C;QAC5ClB,uBAAuBY,IAAII,EAAE,EAAEd,SAASC;IAC1C;IAEAA,OAAOiB,IAAI,CAAC;AACd"}