@xtr-dev/payload-automation 0.0.36 → 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 (72) hide show
  1. package/README.md +33 -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 -197
  24. package/dist/plugin/index.js.map +1 -1
  25. package/dist/test/workflow-executor.test.js +2 -2
  26. package/dist/test/workflow-executor.test.js.map +1 -1
  27. package/dist/triggers/collection-trigger.d.ts +2 -0
  28. package/dist/triggers/collection-trigger.js +36 -0
  29. package/dist/triggers/collection-trigger.js.map +1 -0
  30. package/dist/triggers/global-trigger.d.ts +2 -0
  31. package/dist/triggers/global-trigger.js +29 -0
  32. package/dist/triggers/global-trigger.js.map +1 -0
  33. package/dist/triggers/index.d.ts +2 -0
  34. package/dist/triggers/index.js +4 -0
  35. package/dist/triggers/index.js.map +1 -0
  36. package/dist/triggers/types.d.ts +5 -0
  37. package/dist/triggers/types.js +3 -0
  38. package/dist/triggers/types.js.map +1 -0
  39. package/package.json +1 -1
  40. package/dist/components/TriggerWorkflowButton.d.ts +0 -7
  41. package/dist/components/TriggerWorkflowButton.js +0 -46
  42. package/dist/components/TriggerWorkflowButton.js.map +0 -1
  43. package/dist/components/WorkflowExecutionStatus.d.ts +0 -6
  44. package/dist/components/WorkflowExecutionStatus.js +0 -287
  45. package/dist/components/WorkflowExecutionStatus.js.map +0 -1
  46. package/dist/exports/helpers.d.ts +0 -25
  47. package/dist/exports/helpers.js +0 -28
  48. package/dist/exports/helpers.js.map +0 -1
  49. package/dist/plugin/cron-scheduler.d.ts +0 -32
  50. package/dist/plugin/cron-scheduler.js +0 -537
  51. package/dist/plugin/cron-scheduler.js.map +0 -1
  52. package/dist/plugin/init-collection-hooks.d.ts +0 -4
  53. package/dist/plugin/init-collection-hooks.js +0 -100
  54. package/dist/plugin/init-collection-hooks.js.map +0 -1
  55. package/dist/plugin/init-global-hooks.d.ts +0 -3
  56. package/dist/plugin/init-global-hooks.js +0 -83
  57. package/dist/plugin/init-global-hooks.js.map +0 -1
  58. package/dist/plugin/init-step-tasks.d.ts +0 -3
  59. package/dist/plugin/init-step-tasks.js +0 -22
  60. package/dist/plugin/init-step-tasks.js.map +0 -1
  61. package/dist/plugin/init-webhook.d.ts +0 -2
  62. package/dist/plugin/init-webhook.js +0 -158
  63. package/dist/plugin/init-webhook.js.map +0 -1
  64. package/dist/plugin/init-workflow-hooks.d.ts +0 -6
  65. package/dist/plugin/init-workflow-hooks.js +0 -46
  66. package/dist/plugin/init-workflow-hooks.js.map +0 -1
  67. package/dist/utils/trigger-helpers.d.ts +0 -60
  68. package/dist/utils/trigger-helpers.js +0 -130
  69. package/dist/utils/trigger-helpers.js.map +0 -1
  70. package/dist/utils/trigger-presets.d.ts +0 -24
  71. package/dist/utils/trigger-presets.js +0 -177
  72. package/dist/utils/trigger-presets.js.map +0 -1
@@ -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,158 +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
- // Define webhook endpoint
8
- const webhookEndpoint = {
9
- handler: async (req)=>{
10
- const { path } = req.routeParams;
11
- const webhookData = req.body || {};
12
- logger.debug('Webhook endpoint handler called, path: ' + path);
13
- try {
14
- // Find workflows with matching webhook triggers
15
- const workflows = await req.payload.find({
16
- collection: 'workflows',
17
- depth: 2,
18
- limit: 100,
19
- req,
20
- where: {
21
- 'triggers.type': {
22
- equals: 'webhook-trigger'
23
- },
24
- 'triggers.webhookPath': {
25
- equals: path
26
- }
27
- }
28
- });
29
- if (workflows.docs.length === 0) {
30
- return new Response(JSON.stringify({
31
- error: 'No workflows found for this webhook path'
32
- }), {
33
- headers: {
34
- 'Content-Type': 'application/json'
35
- },
36
- status: 404
37
- });
38
- }
39
- // Create a workflow executor for this request
40
- const logger = initializeLogger(req.payload);
41
- const executor = new WorkflowExecutor(req.payload, logger);
42
- const executionPromises = workflows.docs.map(async (workflow)=>{
43
- try {
44
- // Create execution context for the webhook trigger
45
- const context = {
46
- steps: {},
47
- trigger: {
48
- type: 'webhook',
49
- data: webhookData,
50
- headers: Object.fromEntries(req.headers?.entries() || []),
51
- path,
52
- req
53
- }
54
- };
55
- // Find the matching trigger and check its condition if present
56
- const triggers = workflow.triggers;
57
- const matchingTrigger = triggers?.find((trigger)=>trigger.type === 'webhook-trigger' && trigger.parameters?.webhookPath === path);
58
- // Check trigger condition if present
59
- if (matchingTrigger?.condition) {
60
- logger.debug({
61
- condition: matchingTrigger.condition,
62
- path,
63
- webhookData: JSON.stringify(webhookData).substring(0, 200),
64
- headers: Object.keys(context.trigger.headers || {}),
65
- workflowId: workflow.id,
66
- workflowName: workflow.name
67
- }, 'Evaluating webhook trigger condition');
68
- const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context);
69
- if (!conditionMet) {
70
- logger.info({
71
- condition: matchingTrigger.condition,
72
- path,
73
- webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),
74
- workflowId: workflow.id,
75
- workflowName: workflow.name
76
- }, 'Webhook trigger condition not met, skipping workflow');
77
- return {
78
- reason: 'Condition not met',
79
- status: 'skipped',
80
- workflowId: workflow.id
81
- };
82
- }
83
- logger.info({
84
- condition: matchingTrigger.condition,
85
- path,
86
- webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),
87
- workflowId: workflow.id,
88
- workflowName: workflow.name
89
- }, 'Webhook trigger condition met');
90
- }
91
- // Execute the workflow
92
- await executor.execute(workflow, context, req);
93
- return {
94
- status: 'triggered',
95
- workflowId: workflow.id
96
- };
97
- } catch (error) {
98
- return {
99
- error: error instanceof Error ? error.message : 'Unknown error',
100
- status: 'failed',
101
- workflowId: workflow.id
102
- };
103
- }
104
- });
105
- const results = await Promise.allSettled(executionPromises);
106
- const resultsData = results.map((result, index)=>{
107
- const baseResult = {
108
- workflowId: workflows.docs[index].id
109
- };
110
- if (result.status === 'fulfilled') {
111
- return {
112
- ...baseResult,
113
- ...result.value
114
- };
115
- } else {
116
- return {
117
- ...baseResult,
118
- error: result.reason,
119
- status: 'failed'
120
- };
121
- }
122
- });
123
- return new Response(JSON.stringify({
124
- message: `Triggered ${workflows.docs.length} workflow(s)`,
125
- results: resultsData
126
- }), {
127
- headers: {
128
- 'Content-Type': 'application/json'
129
- },
130
- status: 200
131
- });
132
- } catch (error) {
133
- return new Response(JSON.stringify({
134
- details: error instanceof Error ? error.message : 'Unknown error',
135
- error: 'Failed to process webhook'
136
- }), {
137
- headers: {
138
- 'Content-Type': 'application/json'
139
- },
140
- status: 500
141
- });
142
- }
143
- },
144
- method: 'post',
145
- path: `${normalizedPrefix}/:path`
146
- };
147
- // Check if the webhook endpoint already exists to avoid duplicates
148
- const existingEndpoint = config.endpoints?.find((endpoint)=>endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method);
149
- if (!existingEndpoint) {
150
- // Combine existing endpoints with the webhook endpoint
151
- config.endpoints = [
152
- ...config.endpoints || [],
153
- webhookEndpoint
154
- ];
155
- }
156
- }
157
-
158
- //# 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\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 }\n}\n"],"names":["WorkflowExecutor","getConfigLogger","initializeLogger","initWebhookEndpoint","config","webhookPrefix","logger","normalizedPrefix","startsWith","webhookEndpoint","handler","req","path","routeParams","webhookData","body","debug","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"}
@@ -1,60 +0,0 @@
1
- import type { Field } from 'payload';
2
- import type { CustomTriggerConfig } from '../plugin/config-types.js';
3
- interface FieldWithName {
4
- name: string;
5
- [key: string]: unknown;
6
- }
7
- /**
8
- * Creates a virtual field for a trigger parameter that stores its value in the parameters JSON field
9
- *
10
- * @param field - Standard PayloadCMS field configuration (must be a data field with a name)
11
- * @param triggerSlug - The slug of the trigger this field belongs to
12
- * @returns Modified field with virtual storage hooks and proper naming
13
- *
14
- * @example
15
- * ```typescript
16
- * const myTrigger: CustomTriggerConfig = {
17
- * slug: 'my-trigger',
18
- * inputs: [
19
- * createTriggerField({
20
- * name: 'webhookUrl',
21
- * type: 'text',
22
- * required: true,
23
- * admin: {
24
- * description: 'URL to call when triggered'
25
- * }
26
- * }, 'my-trigger')
27
- * ]
28
- * }
29
- * ```
30
- */
31
- export declare function createTriggerField(field: FieldWithName, triggerSlug: string): Field;
32
- /**
33
- * Creates a custom trigger configuration with the provided fields
34
- *
35
- * @param slug - Unique identifier for the trigger
36
- * @param fields - Array of PayloadCMS fields that will be shown as trigger parameters
37
- * @returns Complete trigger configuration
38
- *
39
- * @example
40
- * ```typescript
41
- * const webhookTrigger = createTrigger('webhook', [
42
- * {
43
- * name: 'url',
44
- * type: 'text',
45
- * required: true,
46
- * admin: {
47
- * description: 'Webhook URL'
48
- * }
49
- * },
50
- * {
51
- * name: 'method',
52
- * type: 'select',
53
- * options: ['GET', 'POST', 'PUT', 'DELETE'],
54
- * defaultValue: 'POST'
55
- * }
56
- * ])
57
- * ```
58
- */
59
- export declare function createTrigger(slug: string, fields: FieldWithName[]): CustomTriggerConfig;
60
- export {};