@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.
- package/README.md +73 -0
- package/dist/collections/Workflow.d.ts +3 -0
- package/dist/collections/Workflow.js +223 -0
- package/dist/collections/Workflow.js.map +1 -0
- package/dist/collections/WorkflowRuns.d.ts +2 -0
- package/dist/collections/WorkflowRuns.js +157 -0
- package/dist/collections/WorkflowRuns.js.map +1 -0
- package/dist/components/TriggerWorkflowButton.d.ts +7 -0
- package/dist/components/TriggerWorkflowButton.js +46 -0
- package/dist/components/TriggerWorkflowButton.js.map +1 -0
- package/dist/core/trigger-custom-workflow.d.ts +52 -0
- package/dist/core/trigger-custom-workflow.js +205 -0
- package/dist/core/trigger-custom-workflow.js.map +1 -0
- package/dist/core/workflow-executor.d.ts +86 -0
- package/dist/core/workflow-executor.js +456 -0
- package/dist/core/workflow-executor.js.map +1 -0
- package/dist/exports/client.d.ts +1 -0
- package/dist/exports/client.js +7 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/fields.d.ts +1 -0
- package/dist/exports/fields.js +6 -0
- package/dist/exports/fields.js.map +1 -0
- package/dist/exports/rsc.d.ts +1 -0
- package/dist/exports/rsc.js +3 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/exports/views.d.ts +1 -0
- package/dist/exports/views.js +7 -0
- package/dist/exports/views.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/config-types.d.ts +21 -0
- package/dist/plugin/config-types.js +3 -0
- package/dist/plugin/config-types.js.map +1 -0
- package/dist/plugin/cron-scheduler.d.ts +32 -0
- package/dist/plugin/cron-scheduler.js +537 -0
- package/dist/plugin/cron-scheduler.js.map +1 -0
- package/dist/plugin/index.d.ts +4 -0
- package/dist/plugin/index.js +66 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/init-collection-hooks.d.ts +4 -0
- package/dist/plugin/init-collection-hooks.js +63 -0
- package/dist/plugin/init-collection-hooks.js.map +1 -0
- package/dist/plugin/init-global-hooks.d.ts +3 -0
- package/dist/plugin/init-global-hooks.js +83 -0
- package/dist/plugin/init-global-hooks.js.map +1 -0
- package/dist/plugin/init-step-tasks.d.ts +3 -0
- package/dist/plugin/init-step-tasks.js +8 -0
- package/dist/plugin/init-step-tasks.js.map +1 -0
- package/dist/plugin/init-webhook.d.ts +2 -0
- package/dist/plugin/init-webhook.js +154 -0
- package/dist/plugin/init-webhook.js.map +1 -0
- package/dist/plugin/init-workflow-hooks.d.ts +6 -0
- package/dist/plugin/init-workflow-hooks.js +46 -0
- package/dist/plugin/init-workflow-hooks.js.map +1 -0
- package/dist/plugin/logger.d.ts +20 -0
- package/dist/plugin/logger.js +47 -0
- package/dist/plugin/logger.js.map +1 -0
- package/dist/steps/create-document-handler.d.ts +2 -0
- package/dist/steps/create-document-handler.js +36 -0
- package/dist/steps/create-document-handler.js.map +1 -0
- package/dist/steps/create-document.d.ts +46 -0
- package/dist/steps/create-document.js +55 -0
- package/dist/steps/create-document.js.map +1 -0
- package/dist/steps/delete-document-handler.d.ts +2 -0
- package/dist/steps/delete-document-handler.js +62 -0
- package/dist/steps/delete-document-handler.js.map +1 -0
- package/dist/steps/delete-document.d.ts +39 -0
- package/dist/steps/delete-document.js +47 -0
- package/dist/steps/delete-document.js.map +1 -0
- package/dist/steps/http-request-handler.d.ts +2 -0
- package/dist/steps/http-request-handler.js +14 -0
- package/dist/steps/http-request-handler.js.map +1 -0
- package/dist/steps/http-request.d.ts +12 -0
- package/dist/steps/http-request.js +19 -0
- package/dist/steps/http-request.js.map +1 -0
- package/dist/steps/index.d.ts +12 -0
- package/dist/steps/index.js +14 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/read-document-handler.d.ts +2 -0
- package/dist/steps/read-document-handler.js +53 -0
- package/dist/steps/read-document-handler.js.map +1 -0
- package/dist/steps/read-document.d.ts +46 -0
- package/dist/steps/read-document.js +75 -0
- package/dist/steps/read-document.js.map +1 -0
- package/dist/steps/send-email-handler.d.ts +2 -0
- package/dist/steps/send-email-handler.js +48 -0
- package/dist/steps/send-email-handler.js.map +1 -0
- package/dist/steps/send-email.d.ts +44 -0
- package/dist/steps/send-email.js +78 -0
- package/dist/steps/send-email.js.map +1 -0
- package/dist/steps/update-document-handler.d.ts +2 -0
- package/dist/steps/update-document-handler.js +40 -0
- package/dist/steps/update-document-handler.js.map +1 -0
- package/dist/steps/update-document.d.ts +46 -0
- package/dist/steps/update-document.js +63 -0
- package/dist/steps/update-document.js.map +1 -0
- 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
|
+
}
|