@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,205 @@
1
+ import { initializeLogger } from '../plugin/logger.js';
2
+ import { WorkflowExecutor } from './workflow-executor.js';
3
+ /**
4
+ * Programmatically trigger workflows that have a matching custom trigger
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * // In your onInit or elsewhere in your code
9
+ * await triggerCustomWorkflow(payload, {
10
+ * slug: 'data-import',
11
+ * data: {
12
+ * source: 'external-api',
13
+ * recordCount: 100,
14
+ * importedAt: new Date().toISOString()
15
+ * }
16
+ * })
17
+ * ```
18
+ */ export async function triggerCustomWorkflow(payload, options) {
19
+ const { slug, data = {}, req, user } = options;
20
+ const logger = initializeLogger(payload);
21
+ logger.info({
22
+ hasData: Object.keys(data).length > 0,
23
+ hasUser: !!user,
24
+ triggerSlug: slug
25
+ }, 'Triggering custom workflow');
26
+ try {
27
+ // Find workflows with matching custom trigger
28
+ const workflows = await payload.find({
29
+ collection: 'workflows',
30
+ depth: 2,
31
+ limit: 100,
32
+ where: {
33
+ 'triggers.type': {
34
+ equals: slug
35
+ }
36
+ }
37
+ });
38
+ if (workflows.docs.length === 0) {
39
+ logger.warn({
40
+ triggerSlug: slug
41
+ }, 'No workflows found for custom trigger');
42
+ return [];
43
+ }
44
+ logger.info({
45
+ triggerSlug: slug,
46
+ workflowCount: workflows.docs.length
47
+ }, 'Found workflows for custom trigger');
48
+ // Create a minimal request if not provided
49
+ const workflowReq = req || {
50
+ context: {},
51
+ headers: new Headers(),
52
+ payload,
53
+ user: user ? {
54
+ id: user.id,
55
+ collection: 'users',
56
+ email: user.email
57
+ } : undefined
58
+ };
59
+ // Create workflow executor
60
+ const executor = new WorkflowExecutor(payload, logger);
61
+ // Execute all matching workflows
62
+ const results = [];
63
+ for (const workflow of workflows.docs){
64
+ try {
65
+ // Check if this workflow actually has the custom trigger
66
+ const triggers = workflow.triggers;
67
+ const hasMatchingTrigger = triggers?.some((trigger)=>trigger.type === slug);
68
+ if (!hasMatchingTrigger) {
69
+ continue;
70
+ }
71
+ logger.info({
72
+ triggerSlug: slug,
73
+ workflowId: workflow.id.toString(),
74
+ workflowName: workflow.name
75
+ }, 'Executing workflow with custom trigger');
76
+ // Create execution context
77
+ const context = {
78
+ steps: {},
79
+ trigger: {
80
+ type: slug,
81
+ data,
82
+ req: workflowReq,
83
+ triggeredAt: new Date().toISOString(),
84
+ user: user || workflowReq.user ? {
85
+ id: (user || workflowReq.user)?.id?.toString(),
86
+ email: (user || workflowReq.user)?.email
87
+ } : undefined
88
+ }
89
+ };
90
+ // Execute the workflow
91
+ await executor.execute(workflow, context, workflowReq);
92
+ // Get the latest run for this workflow to get the run ID
93
+ const runs = await payload.find({
94
+ collection: 'workflow-runs',
95
+ limit: 1,
96
+ sort: '-createdAt',
97
+ where: {
98
+ workflow: {
99
+ equals: workflow.id
100
+ }
101
+ }
102
+ });
103
+ results.push({
104
+ runId: runs.docs[0]?.id?.toString() || 'unknown',
105
+ status: 'triggered',
106
+ workflowId: workflow.id.toString(),
107
+ workflowName: workflow.name
108
+ });
109
+ logger.info({
110
+ triggerSlug: slug,
111
+ workflowId: workflow.id.toString(),
112
+ workflowName: workflow.name
113
+ }, 'Workflow executed successfully');
114
+ } catch (error) {
115
+ logger.error({
116
+ error: error instanceof Error ? error.message : 'Unknown error',
117
+ triggerSlug: slug,
118
+ workflowId: workflow.id.toString(),
119
+ workflowName: workflow.name
120
+ }, 'Failed to execute workflow');
121
+ results.push({
122
+ error: error instanceof Error ? error.message : 'Unknown error',
123
+ runId: 'failed',
124
+ status: 'failed',
125
+ workflowId: workflow.id.toString(),
126
+ workflowName: workflow.name
127
+ });
128
+ }
129
+ }
130
+ return results;
131
+ } catch (error) {
132
+ logger.error({
133
+ error: error instanceof Error ? error.message : 'Unknown error',
134
+ triggerSlug: slug
135
+ }, 'Failed to trigger custom workflows');
136
+ throw new Error(`Failed to trigger custom workflows: ${error instanceof Error ? error.message : 'Unknown error'}`);
137
+ }
138
+ }
139
+ /**
140
+ * Helper function to trigger a single workflow by ID with custom trigger data
141
+ * This is useful when you know exactly which workflow you want to trigger
142
+ */ export async function triggerWorkflowById(payload, workflowId, triggerSlug, data, req) {
143
+ const logger = initializeLogger(payload);
144
+ try {
145
+ const workflow = await payload.findByID({
146
+ id: workflowId,
147
+ collection: 'workflows',
148
+ depth: 2
149
+ });
150
+ if (!workflow) {
151
+ throw new Error(`Workflow ${workflowId} not found`);
152
+ }
153
+ // Verify the workflow has the specified custom trigger
154
+ const triggers = workflow.triggers;
155
+ const hasMatchingTrigger = triggers?.some((trigger)=>trigger.type === triggerSlug);
156
+ if (!hasMatchingTrigger) {
157
+ throw new Error(`Workflow ${workflowId} does not have trigger ${triggerSlug}`);
158
+ }
159
+ // Create a minimal request if not provided
160
+ const workflowReq = req || {
161
+ context: {},
162
+ headers: new Headers(),
163
+ payload
164
+ };
165
+ // Create execution context
166
+ const context = {
167
+ steps: {},
168
+ trigger: {
169
+ type: triggerSlug,
170
+ data: data || {},
171
+ req: workflowReq,
172
+ triggeredAt: new Date().toISOString()
173
+ }
174
+ };
175
+ // Create executor and execute
176
+ const executor = new WorkflowExecutor(payload, logger);
177
+ await executor.execute(workflow, context, workflowReq);
178
+ // Get the latest run to get the run ID
179
+ const runs = await payload.find({
180
+ collection: 'workflow-runs',
181
+ limit: 1,
182
+ sort: '-createdAt',
183
+ where: {
184
+ workflow: {
185
+ equals: workflow.id
186
+ }
187
+ }
188
+ });
189
+ return {
190
+ runId: runs.docs[0]?.id?.toString() || 'unknown',
191
+ status: 'triggered',
192
+ workflowId: workflow.id.toString(),
193
+ workflowName: workflow.name
194
+ };
195
+ } catch (error) {
196
+ logger.error({
197
+ error: error instanceof Error ? error.message : 'Unknown error',
198
+ triggerSlug,
199
+ workflowId
200
+ }, 'Failed to trigger workflow by ID');
201
+ throw error;
202
+ }
203
+ }
204
+
205
+ //# sourceMappingURL=trigger-custom-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/trigger-custom-workflow.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from 'payload'\n\nimport { initializeLogger } from '../plugin/logger.js'\nimport { type Workflow, WorkflowExecutor } from './workflow-executor.js'\n\nexport interface CustomTriggerOptions {\n /**\n * Data to pass to the workflow execution context\n */\n data?: Record<string, unknown>\n\n /**\n * Optional PayloadRequest to use for the workflow execution\n * If not provided, a minimal request will be created\n */\n req?: PayloadRequest\n\n /**\n * The slug of the custom trigger to execute\n */\n slug: string\n\n /**\n * Optional user information for tracking who triggered the workflow\n */\n user?: {\n email?: string\n id?: string\n }\n}\n\nexport interface TriggerResult {\n error?: string\n runId: number | string\n status: 'failed' | 'triggered'\n workflowId: string\n workflowName: string\n}\n\n/**\n * Programmatically trigger workflows that have a matching custom trigger\n *\n * @example\n * ```typescript\n * // In your onInit or elsewhere in your code\n * await triggerCustomWorkflow(payload, {\n * slug: 'data-import',\n * data: {\n * source: 'external-api',\n * recordCount: 100,\n * importedAt: new Date().toISOString()\n * }\n * })\n * ```\n */\nexport async function triggerCustomWorkflow(\n payload: Payload,\n options: CustomTriggerOptions\n): Promise<TriggerResult[]> {\n const { slug, data = {}, req, user } = options\n\n const logger = initializeLogger(payload)\n\n logger.info({\n hasData: Object.keys(data).length > 0,\n hasUser: !!user,\n triggerSlug: slug\n }, 'Triggering custom workflow')\n\n try {\n // Find workflows with matching custom trigger\n const workflows = await payload.find({\n collection: 'workflows',\n depth: 2,\n limit: 100,\n where: {\n 'triggers.type': {\n equals: slug\n }\n }\n })\n\n if (workflows.docs.length === 0) {\n logger.warn({\n triggerSlug: slug\n }, 'No workflows found for custom trigger')\n return []\n }\n\n logger.info({\n triggerSlug: slug,\n workflowCount: workflows.docs.length\n }, 'Found workflows for custom trigger')\n\n // Create a minimal request if not provided\n const workflowReq = req || {\n context: {},\n headers: new Headers(),\n payload,\n user: user ? {\n id: user.id,\n collection: 'users',\n email: user.email\n } : undefined\n } as PayloadRequest\n\n // Create workflow executor\n const executor = new WorkflowExecutor(payload, logger)\n\n // Execute all matching workflows\n const results: TriggerResult[] = []\n\n for (const workflow of workflows.docs) {\n try {\n // Check if this workflow actually has the custom trigger\n const triggers = workflow.triggers as Array<{type: string}>\n const hasMatchingTrigger = triggers?.some(trigger => trigger.type === slug)\n\n if (!hasMatchingTrigger) {\n continue\n }\n\n logger.info({\n triggerSlug: slug,\n workflowId: workflow.id.toString(),\n workflowName: workflow.name\n }, 'Executing workflow with custom trigger')\n\n // Create execution context\n const context = {\n steps: {},\n trigger: {\n type: slug,\n data,\n req: workflowReq,\n triggeredAt: new Date().toISOString(),\n user: (user || workflowReq.user) ? {\n id: (user || workflowReq.user)?.id?.toString(),\n email: (user || workflowReq.user)?.email\n } : undefined\n }\n }\n\n // Execute the workflow\n await executor.execute(workflow as Workflow, context, workflowReq)\n\n // Get the latest run for this workflow to get the run ID\n const runs = await payload.find({\n collection: 'workflow-runs',\n limit: 1,\n sort: '-createdAt',\n where: {\n workflow: {\n equals: workflow.id\n }\n }\n })\n\n results.push({\n runId: runs.docs[0]?.id?.toString() || 'unknown',\n status: 'triggered',\n workflowId: workflow.id.toString(),\n workflowName: workflow.name as string\n })\n\n logger.info({\n triggerSlug: slug,\n workflowId: workflow.id.toString(),\n workflowName: workflow.name\n }, 'Workflow executed successfully')\n\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n triggerSlug: slug,\n workflowId: workflow.id.toString(),\n workflowName: workflow.name\n }, 'Failed to execute workflow')\n\n results.push({\n error: error instanceof Error ? error.message : 'Unknown error',\n runId: 'failed',\n status: 'failed',\n workflowId: workflow.id.toString(),\n workflowName: workflow.name as string\n })\n }\n }\n\n return results\n\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n triggerSlug: slug\n }, 'Failed to trigger custom workflows')\n\n throw new Error(\n `Failed to trigger custom workflows: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n}\n\n/**\n * Helper function to trigger a single workflow by ID with custom trigger data\n * This is useful when you know exactly which workflow you want to trigger\n */\nexport async function triggerWorkflowById(\n payload: Payload,\n workflowId: string,\n triggerSlug: string,\n data?: Record<string, unknown>,\n req?: PayloadRequest\n): Promise<TriggerResult> {\n const logger = initializeLogger(payload)\n\n try {\n const workflow = await payload.findByID({\n id: workflowId,\n collection: 'workflows',\n depth: 2\n })\n\n if (!workflow) {\n throw new Error(`Workflow ${workflowId} not found`)\n }\n\n // Verify the workflow has the specified custom trigger\n const triggers = workflow.triggers as Array<{type: string}>\n const hasMatchingTrigger = triggers?.some(trigger => trigger.type === triggerSlug)\n\n if (!hasMatchingTrigger) {\n throw new Error(`Workflow ${workflowId} does not have trigger ${triggerSlug}`)\n }\n\n // Create a minimal request if not provided\n const workflowReq = req || {\n context: {},\n headers: new Headers(),\n payload\n } as PayloadRequest\n\n // Create execution context\n const context = {\n steps: {},\n trigger: {\n type: triggerSlug,\n data: data || {},\n req: workflowReq,\n triggeredAt: new Date().toISOString()\n }\n }\n\n // Create executor and execute\n const executor = new WorkflowExecutor(payload, logger)\n await executor.execute(workflow as Workflow, context, workflowReq)\n\n // Get the latest run to get the run ID\n const runs = await payload.find({\n collection: 'workflow-runs',\n limit: 1,\n sort: '-createdAt',\n where: {\n workflow: {\n equals: workflow.id\n }\n }\n })\n\n return {\n runId: runs.docs[0]?.id?.toString() || 'unknown',\n status: 'triggered',\n workflowId: workflow.id.toString(),\n workflowName: workflow.name as string\n }\n\n } catch (error) {\n logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n triggerSlug,\n workflowId\n }, 'Failed to trigger workflow by ID')\n\n throw error\n }\n}\n"],"names":["initializeLogger","WorkflowExecutor","triggerCustomWorkflow","payload","options","slug","data","req","user","logger","info","hasData","Object","keys","length","hasUser","triggerSlug","workflows","find","collection","depth","limit","where","equals","docs","warn","workflowCount","workflowReq","context","headers","Headers","id","email","undefined","executor","results","workflow","triggers","hasMatchingTrigger","some","trigger","type","workflowId","toString","workflowName","name","steps","triggeredAt","Date","toISOString","execute","runs","sort","push","runId","status","error","Error","message","triggerWorkflowById","findByID"],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { Payload, PayloadRequest } from 'payload';
2
+ export type Workflow = {
3
+ _version?: number;
4
+ id: string;
5
+ name: string;
6
+ steps: WorkflowStep[];
7
+ triggers: WorkflowTrigger[];
8
+ };
9
+ export type WorkflowStep = {
10
+ condition?: string;
11
+ dependencies?: string[];
12
+ input?: null | Record<string, unknown>;
13
+ name: string;
14
+ step: string;
15
+ };
16
+ export interface WorkflowTrigger {
17
+ collection?: string;
18
+ condition?: string;
19
+ global?: string;
20
+ globalOperation?: string;
21
+ operation?: string;
22
+ type: string;
23
+ webhookPath?: string;
24
+ }
25
+ export interface ExecutionContext {
26
+ steps: Record<string, {
27
+ error?: string;
28
+ input: unknown;
29
+ output: unknown;
30
+ state: 'failed' | 'pending' | 'running' | 'succeeded';
31
+ }>;
32
+ trigger: {
33
+ collection?: string;
34
+ data?: unknown;
35
+ doc?: unknown;
36
+ headers?: Record<string, string>;
37
+ operation?: string;
38
+ path?: string;
39
+ previousDoc?: unknown;
40
+ req?: PayloadRequest;
41
+ triggeredAt?: string;
42
+ type: string;
43
+ user?: {
44
+ collection?: string;
45
+ email?: string;
46
+ id?: string;
47
+ };
48
+ };
49
+ }
50
+ export declare class WorkflowExecutor {
51
+ private payload;
52
+ private logger;
53
+ constructor(payload: Payload, logger: Payload['logger']);
54
+ /**
55
+ * Evaluate a step condition using JSONPath
56
+ */
57
+ private evaluateStepCondition;
58
+ /**
59
+ * Execute a single workflow step
60
+ */
61
+ private executeStep;
62
+ /**
63
+ * Resolve step execution order based on dependencies
64
+ */
65
+ private resolveExecutionOrder;
66
+ /**
67
+ * Resolve step input using JSONPath expressions
68
+ */
69
+ private resolveStepInput;
70
+ /**
71
+ * Update workflow run with current context
72
+ */
73
+ private updateWorkflowRunContext;
74
+ /**
75
+ * Evaluate a condition using JSONPath
76
+ */
77
+ evaluateCondition(condition: string, context: ExecutionContext): boolean;
78
+ /**
79
+ * Execute a workflow with the given context
80
+ */
81
+ execute(workflow: Workflow, context: ExecutionContext, req: PayloadRequest): Promise<void>;
82
+ /**
83
+ * Find and execute workflows triggered by a collection operation
84
+ */
85
+ executeTriggeredWorkflows(collection: string, operation: 'create' | 'delete' | 'read' | 'update', doc: unknown, previousDoc: unknown, req: PayloadRequest): Promise<void>;
86
+ }