@xtr-dev/payload-automation 0.0.1

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 (98) hide show
  1. package/README.md +73 -0
  2. package/dist/collections/Workflow.d.ts +3 -0
  3. package/dist/collections/Workflow.js +223 -0
  4. package/dist/collections/Workflow.js.map +1 -0
  5. package/dist/collections/WorkflowRuns.d.ts +2 -0
  6. package/dist/collections/WorkflowRuns.js +157 -0
  7. package/dist/collections/WorkflowRuns.js.map +1 -0
  8. package/dist/components/TriggerWorkflowButton.d.ts +7 -0
  9. package/dist/components/TriggerWorkflowButton.js +46 -0
  10. package/dist/components/TriggerWorkflowButton.js.map +1 -0
  11. package/dist/core/trigger-custom-workflow.d.ts +52 -0
  12. package/dist/core/trigger-custom-workflow.js +205 -0
  13. package/dist/core/trigger-custom-workflow.js.map +1 -0
  14. package/dist/core/workflow-executor.d.ts +86 -0
  15. package/dist/core/workflow-executor.js +456 -0
  16. package/dist/core/workflow-executor.js.map +1 -0
  17. package/dist/exports/client.d.ts +1 -0
  18. package/dist/exports/client.js +7 -0
  19. package/dist/exports/client.js.map +1 -0
  20. package/dist/exports/fields.d.ts +1 -0
  21. package/dist/exports/fields.js +6 -0
  22. package/dist/exports/fields.js.map +1 -0
  23. package/dist/exports/rsc.d.ts +1 -0
  24. package/dist/exports/rsc.js +3 -0
  25. package/dist/exports/rsc.js.map +1 -0
  26. package/dist/exports/views.d.ts +1 -0
  27. package/dist/exports/views.js +7 -0
  28. package/dist/exports/views.js.map +1 -0
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.js +8 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/plugin/config-types.d.ts +21 -0
  33. package/dist/plugin/config-types.js +3 -0
  34. package/dist/plugin/config-types.js.map +1 -0
  35. package/dist/plugin/cron-scheduler.d.ts +32 -0
  36. package/dist/plugin/cron-scheduler.js +537 -0
  37. package/dist/plugin/cron-scheduler.js.map +1 -0
  38. package/dist/plugin/index.d.ts +4 -0
  39. package/dist/plugin/index.js +66 -0
  40. package/dist/plugin/index.js.map +1 -0
  41. package/dist/plugin/init-collection-hooks.d.ts +4 -0
  42. package/dist/plugin/init-collection-hooks.js +63 -0
  43. package/dist/plugin/init-collection-hooks.js.map +1 -0
  44. package/dist/plugin/init-global-hooks.d.ts +3 -0
  45. package/dist/plugin/init-global-hooks.js +83 -0
  46. package/dist/plugin/init-global-hooks.js.map +1 -0
  47. package/dist/plugin/init-step-tasks.d.ts +3 -0
  48. package/dist/plugin/init-step-tasks.js +8 -0
  49. package/dist/plugin/init-step-tasks.js.map +1 -0
  50. package/dist/plugin/init-webhook.d.ts +2 -0
  51. package/dist/plugin/init-webhook.js +154 -0
  52. package/dist/plugin/init-webhook.js.map +1 -0
  53. package/dist/plugin/init-workflow-hooks.d.ts +6 -0
  54. package/dist/plugin/init-workflow-hooks.js +46 -0
  55. package/dist/plugin/init-workflow-hooks.js.map +1 -0
  56. package/dist/plugin/logger.d.ts +20 -0
  57. package/dist/plugin/logger.js +47 -0
  58. package/dist/plugin/logger.js.map +1 -0
  59. package/dist/steps/create-document-handler.d.ts +2 -0
  60. package/dist/steps/create-document-handler.js +36 -0
  61. package/dist/steps/create-document-handler.js.map +1 -0
  62. package/dist/steps/create-document.d.ts +46 -0
  63. package/dist/steps/create-document.js +55 -0
  64. package/dist/steps/create-document.js.map +1 -0
  65. package/dist/steps/delete-document-handler.d.ts +2 -0
  66. package/dist/steps/delete-document-handler.js +62 -0
  67. package/dist/steps/delete-document-handler.js.map +1 -0
  68. package/dist/steps/delete-document.d.ts +39 -0
  69. package/dist/steps/delete-document.js +47 -0
  70. package/dist/steps/delete-document.js.map +1 -0
  71. package/dist/steps/http-request-handler.d.ts +2 -0
  72. package/dist/steps/http-request-handler.js +14 -0
  73. package/dist/steps/http-request-handler.js.map +1 -0
  74. package/dist/steps/http-request.d.ts +12 -0
  75. package/dist/steps/http-request.js +19 -0
  76. package/dist/steps/http-request.js.map +1 -0
  77. package/dist/steps/index.d.ts +12 -0
  78. package/dist/steps/index.js +14 -0
  79. package/dist/steps/index.js.map +1 -0
  80. package/dist/steps/read-document-handler.d.ts +2 -0
  81. package/dist/steps/read-document-handler.js +53 -0
  82. package/dist/steps/read-document-handler.js.map +1 -0
  83. package/dist/steps/read-document.d.ts +46 -0
  84. package/dist/steps/read-document.js +75 -0
  85. package/dist/steps/read-document.js.map +1 -0
  86. package/dist/steps/send-email-handler.d.ts +2 -0
  87. package/dist/steps/send-email-handler.js +48 -0
  88. package/dist/steps/send-email-handler.js.map +1 -0
  89. package/dist/steps/send-email.d.ts +44 -0
  90. package/dist/steps/send-email.js +78 -0
  91. package/dist/steps/send-email.js.map +1 -0
  92. package/dist/steps/update-document-handler.d.ts +2 -0
  93. package/dist/steps/update-document-handler.js +40 -0
  94. package/dist/steps/update-document-handler.js.map +1 -0
  95. package/dist/steps/update-document.d.ts +46 -0
  96. package/dist/steps/update-document.js +63 -0
  97. package/dist/steps/update-document.js.map +1 -0
  98. package/package.json +133 -0
@@ -0,0 +1,66 @@
1
+ import { createWorkflowCollection } from '../collections/Workflow.js';
2
+ import { WorkflowRunsCollection } from '../collections/WorkflowRuns.js';
3
+ import { WorkflowExecutor } from '../core/workflow-executor.js';
4
+ import { generateCronTasks, registerCronJobs } from './cron-scheduler.js';
5
+ import { initCollectionHooks } from "./init-collection-hooks.js";
6
+ import { initGlobalHooks } from "./init-global-hooks.js";
7
+ import { initStepTasks } from "./init-step-tasks.js";
8
+ import { initWebhookEndpoint } from "./init-webhook.js";
9
+ import { initWorkflowHooks } from './init-workflow-hooks.js';
10
+ import { getConfigLogger, initializeLogger } from './logger.js';
11
+ export { getLogger } from './logger.js';
12
+ const applyCollectionsConfig = (pluginOptions, config)=>{
13
+ // Add workflow collections
14
+ if (!config.collections) {
15
+ config.collections = [];
16
+ }
17
+ config.collections.push(createWorkflowCollection(pluginOptions), WorkflowRunsCollection);
18
+ };
19
+ export const workflowsPlugin = (pluginOptions)=>(config)=>{
20
+ // If the plugin is disabled, return config unchanged
21
+ if (pluginOptions.enabled === false) {
22
+ return config;
23
+ }
24
+ applyCollectionsConfig(pluginOptions, config);
25
+ if (!config.jobs) {
26
+ config.jobs = {
27
+ tasks: []
28
+ };
29
+ }
30
+ const configLogger = getConfigLogger();
31
+ // Generate cron tasks for workflows with cron triggers
32
+ generateCronTasks(config);
33
+ for (const step of pluginOptions.steps){
34
+ if (!config.jobs?.tasks?.find((task)=>task.slug === step.slug)) {
35
+ configLogger.debug(`Registering task: ${step.slug}`);
36
+ config.jobs?.tasks?.push(step);
37
+ } else {
38
+ configLogger.debug(`Task ${step.slug} already registered, skipping`);
39
+ }
40
+ }
41
+ // Initialize webhook endpoint
42
+ initWebhookEndpoint(config, pluginOptions.webhookPrefix || 'webhook');
43
+ // Set up onInit to register collection hooks and initialize features
44
+ const incomingOnInit = config.onInit;
45
+ config.onInit = async (payload)=>{
46
+ // Execute any existing onInit functions first
47
+ if (incomingOnInit) {
48
+ await incomingOnInit(payload);
49
+ }
50
+ // Initialize the logger with the payload instance
51
+ const logger = initializeLogger(payload);
52
+ // Create workflow executor instance
53
+ const executor = new WorkflowExecutor(payload, logger);
54
+ // Initialize hooks
55
+ initCollectionHooks(pluginOptions, payload, logger, executor);
56
+ initGlobalHooks(payload, logger, executor);
57
+ initWorkflowHooks(payload, logger);
58
+ initStepTasks(pluginOptions, payload, logger);
59
+ // Register cron jobs for workflows with cron triggers
60
+ await registerCronJobs(payload, logger);
61
+ logger.info('Plugin initialized successfully');
62
+ };
63
+ return config;
64
+ };
65
+
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {Config} from 'payload'\n\nimport type {WorkflowsPluginConfig} from \"./config-types.js\"\n\nimport {createWorkflowCollection} from '../collections/Workflow.js'\nimport {WorkflowRunsCollection} from '../collections/WorkflowRuns.js'\nimport {WorkflowExecutor} from '../core/workflow-executor.js'\nimport {generateCronTasks, registerCronJobs} from './cron-scheduler.js'\nimport {initCollectionHooks} from \"./init-collection-hooks.js\"\nimport {initGlobalHooks} from \"./init-global-hooks.js\"\nimport {initStepTasks} from \"./init-step-tasks.js\"\nimport {initWebhookEndpoint} from \"./init-webhook.js\"\nimport {initWorkflowHooks} from './init-workflow-hooks.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport {getLogger} from './logger.js'\n\nconst applyCollectionsConfig = <T extends string>(pluginOptions: WorkflowsPluginConfig<T>, config: Config) => {\n // Add workflow collections\n if (!config.collections) {\n config.collections = []\n }\n\n config.collections.push(\n createWorkflowCollection(pluginOptions),\n WorkflowRunsCollection\n )\n}\n\nexport const workflowsPlugin =\n <TSlug extends string>(pluginOptions: WorkflowsPluginConfig<TSlug>) =>\n (config: Config): Config => {\n // If the plugin is disabled, return config unchanged\n if (pluginOptions.enabled === false) {\n return config\n }\n\n applyCollectionsConfig<TSlug>(pluginOptions, config)\n\n if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n const configLogger = getConfigLogger()\n\n // Generate cron tasks for workflows with cron triggers\n generateCronTasks(config)\n\n for (const step of pluginOptions.steps) {\n if (!config.jobs?.tasks?.find(task => task.slug === step.slug)) {\n configLogger.debug(`Registering task: ${step.slug}`)\n config.jobs?.tasks?.push(step)\n } else {\n configLogger.debug(`Task ${step.slug} already registered, skipping`)\n }\n }\n\n // Initialize webhook endpoint\n initWebhookEndpoint(config, pluginOptions.webhookPrefix || 'webhook')\n\n // Set up onInit to register collection hooks and initialize features\n const incomingOnInit = config.onInit\n config.onInit = async (payload) => {\n // Execute any existing onInit functions first\n if (incomingOnInit) {\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n\n // Create workflow executor instance\n const executor = new WorkflowExecutor(payload, logger)\n\n // Initialize hooks\n initCollectionHooks(pluginOptions, payload, logger, executor)\n initGlobalHooks(payload, logger, executor)\n initWorkflowHooks(payload, logger)\n initStepTasks(pluginOptions, payload, logger)\n\n // Register cron jobs for workflows with cron triggers\n await registerCronJobs(payload, logger)\n\n logger.info('Plugin initialized successfully')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","WorkflowExecutor","generateCronTasks","registerCronJobs","initCollectionHooks","initGlobalHooks","initStepTasks","initWebhookEndpoint","initWorkflowHooks","getConfigLogger","initializeLogger","getLogger","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","jobs","tasks","configLogger","step","steps","find","task","slug","debug","webhookPrefix","incomingOnInit","onInit","payload","logger","executor","info"],"mappings":"AAIA,SAAQA,wBAAwB,QAAO,6BAA4B;AACnE,SAAQC,sBAAsB,QAAO,iCAAgC;AACrE,SAAQC,gBAAgB,QAAO,+BAA8B;AAC7D,SAAQC,iBAAiB,EAAEC,gBAAgB,QAAO,sBAAqB;AACvE,SAAQC,mBAAmB,QAAO,6BAA4B;AAC9D,SAAQC,eAAe,QAAO,yBAAwB;AACtD,SAAQC,aAAa,QAAO,uBAAsB;AAClD,SAAQC,mBAAmB,QAAO,oBAAmB;AACrD,SAAQC,iBAAiB,QAAO,2BAA0B;AAC1D,SAAQC,eAAe,EAAEC,gBAAgB,QAAO,cAAa;AAE7D,SAAQC,SAAS,QAAO,cAAa;AAErC,MAAMC,yBAAyB,CAAmBC,eAAyCC;IACzF,2BAA2B;IAC3B,IAAI,CAACA,OAAOC,WAAW,EAAE;QACvBD,OAAOC,WAAW,GAAG,EAAE;IACzB;IAEAD,OAAOC,WAAW,CAACC,IAAI,CACrBjB,yBAAyBc,gBACzBb;AAEJ;AAEA,OAAO,MAAMiB,kBACX,CAAuBJ,gBACrB,CAACC;QACC,qDAAqD;QACrD,IAAID,cAAcK,OAAO,KAAK,OAAO;YACnC,OAAOJ;QACT;QAEAF,uBAA8BC,eAAeC;QAE7C,IAAI,CAACA,OAAOK,IAAI,EAAE;YAChBL,OAAOK,IAAI,GAAG;gBAACC,OAAO,EAAE;YAAA;QAC1B;QAEA,MAAMC,eAAeZ;QAErB,uDAAuD;QACvDP,kBAAkBY;QAElB,KAAK,MAAMQ,QAAQT,cAAcU,KAAK,CAAE;YACtC,IAAI,CAACT,OAAOK,IAAI,EAAEC,OAAOI,KAAKC,CAAAA,OAAQA,KAAKC,IAAI,KAAKJ,KAAKI,IAAI,GAAG;gBAC9DL,aAAaM,KAAK,CAAC,CAAC,kBAAkB,EAAEL,KAAKI,IAAI,EAAE;gBACnDZ,OAAOK,IAAI,EAAEC,OAAOJ,KAAKM;YAC3B,OAAO;gBACLD,aAAaM,KAAK,CAAC,CAAC,KAAK,EAAEL,KAAKI,IAAI,CAAC,6BAA6B,CAAC;YACrE;QACF;QAEA,8BAA8B;QAC9BnB,oBAAoBO,QAAQD,cAAce,aAAa,IAAI;QAE3D,qEAAqE;QACrE,MAAMC,iBAAiBf,OAAOgB,MAAM;QACpChB,OAAOgB,MAAM,GAAG,OAAOC;YACrB,8CAA8C;YAC9C,IAAIF,gBAAgB;gBAClB,MAAMA,eAAeE;YACvB;YAEA,kDAAkD;YAClD,MAAMC,SAAStB,iBAAiBqB;YAEhC,oCAAoC;YACpC,MAAME,WAAW,IAAIhC,iBAAiB8B,SAASC;YAE/C,mBAAmB;YACnB5B,oBAAoBS,eAAekB,SAASC,QAAQC;YACpD5B,gBAAgB0B,SAASC,QAAQC;YACjCzB,kBAAkBuB,SAASC;YAC3B1B,cAAcO,eAAekB,SAASC;YAEtC,sDAAsD;YACtD,MAAM7B,iBAAiB4B,SAASC;YAEhCA,OAAOE,IAAI,CAAC;QACd;QAEA,OAAOpB;IACT,EAAC"}
@@ -0,0 +1,4 @@
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;
@@ -0,0 +1,63 @@
1
+ export function initCollectionHooks(pluginOptions, payload, logger, executor) {
2
+ // Add hooks to configured collections
3
+ for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)){
4
+ if (!triggerConfig) {
5
+ continue;
6
+ }
7
+ const collection = payload.collections[collectionSlug];
8
+ const crud = triggerConfig === true ? {
9
+ create: true,
10
+ delete: true,
11
+ read: true,
12
+ update: true
13
+ } : triggerConfig;
14
+ if (!collection.config.hooks) {
15
+ collection.config.hooks = {};
16
+ }
17
+ if (crud.update || crud.create) {
18
+ collection.config.hooks.afterChange = collection.config.hooks.afterChange || [];
19
+ collection.config.hooks.afterChange.push(async (change)=>{
20
+ const operation = change.operation;
21
+ logger.debug({
22
+ collection: change.collection.slug,
23
+ operation
24
+ }, 'Collection hook triggered');
25
+ // Execute workflows for this trigger
26
+ await executor.executeTriggeredWorkflows(change.collection.slug, operation, change.doc, change.previousDoc, change.req);
27
+ });
28
+ }
29
+ if (crud.read) {
30
+ collection.config.hooks.afterRead = collection.config.hooks.afterRead || [];
31
+ collection.config.hooks.afterRead.push(async (change)=>{
32
+ logger.debug({
33
+ collection: change.collection.slug,
34
+ operation: 'read'
35
+ }, 'Collection hook triggered');
36
+ // Execute workflows for this trigger
37
+ await executor.executeTriggeredWorkflows(change.collection.slug, 'read', change.doc, undefined, change.req);
38
+ });
39
+ }
40
+ if (crud.delete) {
41
+ collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || [];
42
+ collection.config.hooks.afterDelete.push(async (change)=>{
43
+ logger.debug({
44
+ collection: change.collection.slug,
45
+ operation: 'delete'
46
+ }, 'Collection hook triggered');
47
+ // Execute workflows for this trigger
48
+ await executor.executeTriggeredWorkflows(change.collection.slug, 'delete', change.doc, undefined, change.req);
49
+ });
50
+ }
51
+ if (collection) {
52
+ logger.info({
53
+ collectionSlug
54
+ }, 'Collection hooks registered');
55
+ } else {
56
+ logger.warn({
57
+ collectionSlug
58
+ }, 'Collection not found for trigger configuration');
59
+ }
60
+ }
61
+ }
62
+
63
+ //# sourceMappingURL=init-collection-hooks.js.map
@@ -0,0 +1 @@
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 // Add hooks to configured collections\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\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 logger.debug({\n collection: change.collection.slug,\n operation,\n }, 'Collection hook triggered')\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\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 collection: 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 collection: 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({collectionSlug}, 'Collection hooks registered')\n } else {\n logger.warn({collectionSlug}, 'Collection not found for trigger configuration')\n }\n }\n}\n"],"names":["initCollectionHooks","pluginOptions","payload","logger","executor","collectionSlug","triggerConfig","Object","entries","collectionTriggers","collection","collections","crud","create","delete","read","update","config","hooks","afterChange","push","change","operation","debug","slug","executeTriggeredWorkflows","doc","previousDoc","req","afterRead","undefined","afterDelete","info","warn"],"mappings":"AAMA,OAAO,SAASA,oBAAsCC,aAAuC,EAAEC,OAAgB,EAAEC,MAAyB,EAAEC,QAA0B;IAEpK,sCAAsC;IACtC,KAAK,MAAM,CAACC,gBAAgBC,cAAc,IAAIC,OAAOC,OAAO,CAACP,cAAcQ,kBAAkB,EAAG;QAC9F,IAAI,CAACH,eAAe;YAClB;QACF;QAEA,MAAMI,aAAaR,QAAQS,WAAW,CAACN,eAAoB;QAC3D,MAAMO,OAAoCN,kBAAkB,OAAO;YACjEO,QAAQ;YACRC,QAAQ;YACRC,MAAM;YACNC,QAAQ;QACV,IAAIV;QAEJ,IAAI,CAACI,WAAWO,MAAM,CAACC,KAAK,EAAE;YAC5BR,WAAWO,MAAM,CAACC,KAAK,GAAG,CAAC;QAC7B;QAEA,IAAIN,KAAKI,MAAM,IAAIJ,KAAKC,MAAM,EAAE;YAC9BH,WAAWO,MAAM,CAACC,KAAK,CAACC,WAAW,GAAGT,WAAWO,MAAM,CAACC,KAAK,CAACC,WAAW,IAAI,EAAE;YAC/ET,WAAWO,MAAM,CAACC,KAAK,CAACC,WAAW,CAACC,IAAI,CAAC,OAAOC;gBAC9C,MAAMC,YAAYD,OAAOC,SAAS;gBAClCnB,OAAOoB,KAAK,CAAC;oBACXb,YAAYW,OAAOX,UAAU,CAACc,IAAI;oBAClCF;gBACF,GAAG;gBAEH,qCAAqC;gBACrC,MAAMlB,SAASqB,yBAAyB,CACtCJ,OAAOX,UAAU,CAACc,IAAI,EACtBF,WACAD,OAAOK,GAAG,EACVL,OAAOM,WAAW,EAClBN,OAAOO,GAAG;YAEd;QACF;QAEA,IAAIhB,KAAKG,IAAI,EAAE;YACbL,WAAWO,MAAM,CAACC,KAAK,CAACW,SAAS,GAAGnB,WAAWO,MAAM,CAACC,KAAK,CAACW,SAAS,IAAI,EAAE;YAC3EnB,WAAWO,MAAM,CAACC,KAAK,CAACW,SAAS,CAACT,IAAI,CAAC,OAAOC;gBAC5ClB,OAAOoB,KAAK,CAAC;oBACXb,YAAYW,OAAOX,UAAU,CAACc,IAAI;oBAClCF,WAAW;gBACb,GAAG;gBAEH,qCAAqC;gBACrC,MAAMlB,SAASqB,yBAAyB,CACtCJ,OAAOX,UAAU,CAACc,IAAI,EACtB,QACAH,OAAOK,GAAG,EACVI,WACAT,OAAOO,GAAG;YAEd;QACF;QAEA,IAAIhB,KAAKE,MAAM,EAAE;YACfJ,WAAWO,MAAM,CAACC,KAAK,CAACa,WAAW,GAAGrB,WAAWO,MAAM,CAACC,KAAK,CAACa,WAAW,IAAI,EAAE;YAC/ErB,WAAWO,MAAM,CAACC,KAAK,CAACa,WAAW,CAACX,IAAI,CAAC,OAAOC;gBAC9ClB,OAAOoB,KAAK,CAAC;oBACXb,YAAYW,OAAOX,UAAU,CAACc,IAAI;oBAClCF,WAAW;gBACb,GAAG;gBAEH,qCAAqC;gBACrC,MAAMlB,SAASqB,yBAAyB,CACtCJ,OAAOX,UAAU,CAACc,IAAI,EACtB,UACAH,OAAOK,GAAG,EACVI,WACAT,OAAOO,GAAG;YAEd;QACF;QAEA,IAAIlB,YAAY;YACdP,OAAO6B,IAAI,CAAC;gBAAC3B;YAAc,GAAG;QAChC,OAAO;YACLF,OAAO8B,IAAI,CAAC;gBAAC5B;YAAc,GAAG;QAChC;IACF;AACF"}
@@ -0,0 +1,3 @@
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;
@@ -0,0 +1,83 @@
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
@@ -0,0 +1 @@
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, Workflow } 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 Workflow, 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,UAAsBM,SAASf;QACxD;IACF,EAAE,OAAOoB,OAAO;QACdzC,OAAOyC,KAAK,CAAC;YACXA,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAG;YAChDtC;YACAY;QACF,GAAG;IACL;AACF"}
@@ -0,0 +1,3 @@
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;
@@ -0,0 +1,8 @@
1
+ export function initStepTasks(pluginOptions, payload, logger) {
2
+ logger.info({
3
+ stepCount: pluginOptions.steps.length,
4
+ steps: pluginOptions.steps.map((s)=>s.slug)
5
+ }, 'Initializing step tasks');
6
+ }
7
+
8
+ //# sourceMappingURL=init-step-tasks.js.map
@@ -0,0 +1 @@
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) }, 'Initializing step tasks')\n\n}\n"],"names":["initStepTasks","pluginOptions","payload","logger","info","stepCount","steps","length","map","s","slug"],"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;AAEtG"}
@@ -0,0 +1,2 @@
1
+ import type { Config } from 'payload';
2
+ export declare function initWebhookEndpoint(config: Config, webhookPrefix?: string): void;
@@ -0,0 +1,154 @@
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 to config with prefix: ${normalizedPrefix}`);
8
+ logger.debug('Current config.endpoints length:', config.endpoints?.length || 0);
9
+ // Define webhook endpoint
10
+ const webhookEndpoint = {
11
+ handler: async (req)=>{
12
+ const { path } = req.routeParams;
13
+ const webhookData = req.body || {};
14
+ logger.debug('Webhook endpoint handler called, path: ' + path);
15
+ try {
16
+ // Find workflows with matching webhook triggers
17
+ const workflows = await req.payload.find({
18
+ collection: 'workflows',
19
+ depth: 2,
20
+ limit: 100,
21
+ req,
22
+ where: {
23
+ 'triggers.type': {
24
+ equals: 'webhook-trigger'
25
+ },
26
+ 'triggers.webhookPath': {
27
+ equals: path
28
+ }
29
+ }
30
+ });
31
+ if (workflows.docs.length === 0) {
32
+ return new Response(JSON.stringify({
33
+ error: 'No workflows found for this webhook path'
34
+ }), {
35
+ headers: {
36
+ 'Content-Type': 'application/json'
37
+ },
38
+ status: 404
39
+ });
40
+ }
41
+ // Create workflow executor for this request
42
+ const logger = initializeLogger(req.payload);
43
+ const executor = new WorkflowExecutor(req.payload, logger);
44
+ const executionPromises = workflows.docs.map(async (workflow)=>{
45
+ try {
46
+ // Create execution context for the webhook trigger
47
+ const context = {
48
+ steps: {},
49
+ trigger: {
50
+ type: 'webhook',
51
+ data: webhookData,
52
+ headers: Object.fromEntries(req.headers?.entries() || []),
53
+ path,
54
+ req
55
+ }
56
+ };
57
+ // Find the matching trigger and check its condition if present
58
+ const triggers = workflow.triggers;
59
+ const matchingTrigger = triggers?.find((trigger)=>trigger.type === 'webhook-trigger' && trigger.webhookPath === path);
60
+ // Check trigger condition if present
61
+ if (matchingTrigger?.condition) {
62
+ const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context);
63
+ if (!conditionMet) {
64
+ logger.info({
65
+ condition: matchingTrigger.condition,
66
+ path,
67
+ workflowId: workflow.id,
68
+ workflowName: workflow.name
69
+ }, 'Webhook trigger condition not met, skipping workflow');
70
+ return {
71
+ status: 'skipped',
72
+ workflowId: workflow.id,
73
+ reason: 'Condition not met'
74
+ };
75
+ }
76
+ logger.info({
77
+ condition: matchingTrigger.condition,
78
+ path,
79
+ workflowId: workflow.id,
80
+ workflowName: workflow.name
81
+ }, 'Webhook trigger condition met');
82
+ }
83
+ // Execute the workflow
84
+ await executor.execute(workflow, context, req);
85
+ return {
86
+ status: 'triggered',
87
+ workflowId: workflow.id
88
+ };
89
+ } catch (error) {
90
+ return {
91
+ error: error instanceof Error ? error.message : 'Unknown error',
92
+ status: 'failed',
93
+ workflowId: workflow.id
94
+ };
95
+ }
96
+ });
97
+ const results = await Promise.allSettled(executionPromises);
98
+ const resultsData = results.map((result, index)=>{
99
+ const baseResult = {
100
+ workflowId: workflows.docs[index].id
101
+ };
102
+ if (result.status === 'fulfilled') {
103
+ return {
104
+ ...baseResult,
105
+ ...result.value
106
+ };
107
+ } else {
108
+ return {
109
+ ...baseResult,
110
+ error: result.reason,
111
+ status: 'failed'
112
+ };
113
+ }
114
+ });
115
+ return new Response(JSON.stringify({
116
+ message: `Triggered ${workflows.docs.length} workflow(s)`,
117
+ results: resultsData
118
+ }), {
119
+ headers: {
120
+ 'Content-Type': 'application/json'
121
+ },
122
+ status: 200
123
+ });
124
+ } catch (error) {
125
+ return new Response(JSON.stringify({
126
+ details: error instanceof Error ? error.message : 'Unknown error',
127
+ error: 'Failed to process webhook'
128
+ }), {
129
+ headers: {
130
+ 'Content-Type': 'application/json'
131
+ },
132
+ status: 500
133
+ });
134
+ }
135
+ },
136
+ method: 'post',
137
+ path: `${normalizedPrefix}/:path`
138
+ };
139
+ // Check if webhook endpoint already exists to avoid duplicates
140
+ const existingEndpoint = config.endpoints?.find((endpoint)=>endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method);
141
+ if (!existingEndpoint) {
142
+ // Combine existing endpoints with the webhook endpoint
143
+ config.endpoints = [
144
+ ...config.endpoints || [],
145
+ webhookEndpoint
146
+ ];
147
+ logger.debug(`Webhook endpoint added at path: ${webhookEndpoint.path}`);
148
+ logger.debug('New config.endpoints length:', config.endpoints.length);
149
+ } else {
150
+ logger.debug(`Webhook endpoint already exists at path: ${webhookEndpoint.path}`);
151
+ }
152
+ }
153
+
154
+ //# sourceMappingURL=init-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugin/init-webhook.ts"],"sourcesContent":["import type {Config, PayloadRequest} from 'payload'\n\nimport {type Workflow, 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 to config with prefix: ${normalizedPrefix}`)\n logger.debug('Current config.endpoints length:', config.endpoints?.length || 0)\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 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 webhookPath?: string\n }>\n\n const matchingTrigger = triggers?.find(trigger =>\n trigger.type === 'webhook-trigger' &&\n trigger.webhookPath === path\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 path,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition not met, skipping workflow')\n \n return { status: 'skipped', workflowId: workflow.id, reason: 'Condition not met' }\n }\n \n logger.info({\n condition: matchingTrigger.condition,\n path,\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 Workflow, 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 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('New config.endpoints length:', config.endpoints.length)\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","endpoints","length","webhookEndpoint","handler","req","path","routeParams","webhookData","body","workflows","payload","find","collection","depth","limit","where","equals","docs","Response","JSON","stringify","error","headers","status","executor","executionPromises","map","workflow","context","steps","trigger","type","data","Object","fromEntries","entries","triggers","matchingTrigger","webhookPath","condition","conditionMet","evaluateCondition","info","workflowId","id","workflowName","name","reason","execute","Error","message","results","Promise","allSettled","resultsData","result","index","baseResult","value","details","method","existingEndpoint","endpoint"],"mappings":"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"}
@@ -0,0 +1,6 @@
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;
@@ -0,0 +1,46 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,20 @@
1
+ import type { Payload } from 'payload';
2
+ /**
3
+ * Get a logger for config-time use (before Payload initialization)
4
+ */
5
+ export declare function getConfigLogger(): {
6
+ debug: (message: string, ...args: any[]) => void;
7
+ error: (message: string, ...args: any[]) => void;
8
+ info: (message: string, ...args: any[]) => void;
9
+ warn: (message: string, ...args: any[]) => void;
10
+ };
11
+ /**
12
+ * Initialize the plugin logger using Payload's Pino instance
13
+ * This creates a child logger with plugin identification
14
+ */
15
+ export declare function initializeLogger(payload: Payload): Payload['logger'];
16
+ /**
17
+ * Get the plugin logger instance
18
+ * Throws error if not initialized
19
+ */
20
+ export declare function getLogger(): Payload['logger'];
@@ -0,0 +1,47 @@
1
+ // Global logger instance - use Payload's logger type
2
+ let pluginLogger = null;
3
+ /**
4
+ * Simple config-time logger for use during plugin configuration
5
+ * Uses console with plugin prefix since Payload logger isn't available yet
6
+ */ const configLogger = {
7
+ debug: (message, ...args)=>{
8
+ if (process.env.NODE_ENV === 'development') {
9
+ console.log(`[payload-automation] ${message}`, ...args);
10
+ }
11
+ },
12
+ error: (message, ...args)=>{
13
+ console.error(`[payload-automation] ${message}`, ...args);
14
+ },
15
+ info: (message, ...args)=>{
16
+ console.log(`[payload-automation] ${message}`, ...args);
17
+ },
18
+ warn: (message, ...args)=>{
19
+ console.warn(`[payload-automation] ${message}`, ...args);
20
+ }
21
+ };
22
+ /**
23
+ * Get a logger for config-time use (before Payload initialization)
24
+ */ export function getConfigLogger() {
25
+ return configLogger;
26
+ }
27
+ /**
28
+ * Initialize the plugin logger using Payload's Pino instance
29
+ * This creates a child logger with plugin identification
30
+ */ export function initializeLogger(payload) {
31
+ // Create a child logger with plugin identification
32
+ pluginLogger = payload.logger.child({
33
+ plugin: '@xtr-dev/payload-automation'
34
+ });
35
+ return pluginLogger;
36
+ }
37
+ /**
38
+ * Get the plugin logger instance
39
+ * Throws error if not initialized
40
+ */ export function getLogger() {
41
+ if (!pluginLogger) {
42
+ throw new Error('@xtr-dev/payload-automation: Logger not initialized. Make sure the plugin is properly configured.');
43
+ }
44
+ return pluginLogger;
45
+ }
46
+
47
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugin/logger.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\n// Global logger instance - use Payload's logger type\nlet pluginLogger: Payload['logger'] | null = null\n\n/**\n * Simple config-time logger for use during plugin configuration\n * Uses console with plugin prefix since Payload logger isn't available yet\n */\nconst configLogger = {\n debug: (message: string, ...args: any[]) => {\n if (process.env.NODE_ENV === 'development') {\n console.log(`[payload-automation] ${message}`, ...args)\n }\n },\n error: (message: string, ...args: any[]) => {\n console.error(`[payload-automation] ${message}`, ...args)\n },\n info: (message: string, ...args: any[]) => {\n console.log(`[payload-automation] ${message}`, ...args)\n },\n warn: (message: string, ...args: any[]) => {\n console.warn(`[payload-automation] ${message}`, ...args)\n }\n}\n\n/**\n * Get a logger for config-time use (before Payload initialization)\n */\nexport function getConfigLogger() {\n return configLogger\n}\n\n/**\n * Initialize the plugin logger using Payload's Pino instance\n * This creates a child logger with plugin identification\n */\nexport function initializeLogger(payload: Payload): Payload['logger'] {\n // Create a child logger with plugin identification\n pluginLogger = payload.logger.child({\n plugin: '@xtr-dev/payload-automation'\n })\n return pluginLogger\n}\n\n/**\n * Get the plugin logger instance\n * Throws error if not initialized\n */\nexport function getLogger(): Payload['logger'] {\n if (!pluginLogger) {\n throw new Error('@xtr-dev/payload-automation: Logger not initialized. Make sure the plugin is properly configured.')\n }\n\n return pluginLogger\n}\n"],"names":["pluginLogger","configLogger","debug","message","args","process","env","NODE_ENV","console","log","error","info","warn","getConfigLogger","initializeLogger","payload","logger","child","plugin","getLogger","Error"],"mappings":"AAEA,qDAAqD;AACrD,IAAIA,eAAyC;AAE7C;;;CAGC,GACD,MAAMC,eAAe;IACnBC,OAAO,CAACC,SAAiB,GAAGC;QAC1B,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;YAC1CC,QAAQC,GAAG,CAAC,CAAC,qBAAqB,EAAEN,SAAS,KAAKC;QACpD;IACF;IACAM,OAAO,CAACP,SAAiB,GAAGC;QAC1BI,QAAQE,KAAK,CAAC,CAAC,qBAAqB,EAAEP,SAAS,KAAKC;IACtD;IACAO,MAAM,CAACR,SAAiB,GAAGC;QACzBI,QAAQC,GAAG,CAAC,CAAC,qBAAqB,EAAEN,SAAS,KAAKC;IACpD;IACAQ,MAAM,CAACT,SAAiB,GAAGC;QACzBI,QAAQI,IAAI,CAAC,CAAC,qBAAqB,EAAET,SAAS,KAAKC;IACrD;AACF;AAEA;;CAEC,GACD,OAAO,SAASS;IACd,OAAOZ;AACT;AAEA;;;CAGC,GACD,OAAO,SAASa,iBAAiBC,OAAgB;IAC/C,mDAAmD;IACnDf,eAAee,QAAQC,MAAM,CAACC,KAAK,CAAC;QAClCC,QAAQ;IACV;IACA,OAAOlB;AACT;AAEA;;;CAGC,GACD,OAAO,SAASmB;IACd,IAAI,CAACnB,cAAc;QACjB,MAAM,IAAIoB,MAAM;IAClB;IAEA,OAAOpB;AACT"}
@@ -0,0 +1,2 @@
1
+ import type { TaskHandler } from "payload";
2
+ export declare const createDocumentHandler: TaskHandler<'create-document'>;