@xtr-dev/payload-automation 0.0.30 → 0.0.32
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.
|
@@ -334,13 +334,39 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
334
334
|
}
|
|
335
335
|
]
|
|
336
336
|
},
|
|
337
|
-
...(steps || []).flatMap((step)=>(step.inputSchema || []).map((field)=>
|
|
337
|
+
...(steps || []).flatMap((step)=>(step.inputSchema || []).map((field)=>{
|
|
338
|
+
const originalName = field.name;
|
|
339
|
+
const resultField = {
|
|
338
340
|
...field,
|
|
341
|
+
// Prefix field name with step slug to avoid conflicts
|
|
342
|
+
name: `__step_${step.slug}_${originalName}`,
|
|
339
343
|
admin: {
|
|
340
344
|
...field.admin || {},
|
|
341
345
|
condition: (...args)=>args[1]?.step === step.slug && (field.admin?.condition ? field.admin.condition.call(this, ...args) : true)
|
|
342
|
-
}
|
|
343
|
-
|
|
346
|
+
},
|
|
347
|
+
virtual: true
|
|
348
|
+
};
|
|
349
|
+
// Add hooks to store/retrieve from the step's input data
|
|
350
|
+
resultField.hooks = {
|
|
351
|
+
...field.hooks || {},
|
|
352
|
+
afterRead: [
|
|
353
|
+
...field.hooks?.afterRead || [],
|
|
354
|
+
({ siblingData })=>{
|
|
355
|
+
// Read from step input data using original field name
|
|
356
|
+
return siblingData?.[originalName] || field.defaultValue;
|
|
357
|
+
}
|
|
358
|
+
],
|
|
359
|
+
beforeChange: [
|
|
360
|
+
...field.hooks?.beforeChange || [],
|
|
361
|
+
({ siblingData, value })=>{
|
|
362
|
+
// Store in step data using original field name
|
|
363
|
+
siblingData[originalName] = value;
|
|
364
|
+
return undefined; // Don't store the prefixed field
|
|
365
|
+
}
|
|
366
|
+
]
|
|
367
|
+
};
|
|
368
|
+
return resultField;
|
|
369
|
+
})),
|
|
344
370
|
{
|
|
345
371
|
name: 'dependencies',
|
|
346
372
|
type: 'text',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/Workflow.ts"],"sourcesContent":["import type {CollectionConfig, Field} from 'payload'\n\nimport type {WorkflowsPluginConfig} from \"../plugin/config-types.js\"\n\nexport const createWorkflowCollection: <T extends string>(options: WorkflowsPluginConfig<T>) => CollectionConfig = ({\n collectionTriggers,\n steps,\n triggers\n }) => ({\n slug: 'workflows',\n access: {\n create: () => true,\n delete: () => true,\n read: () => true,\n update: () => true,\n },\n admin: {\n defaultColumns: ['name', 'updatedAt'],\n description: 'Create and manage automated workflows.',\n group: 'Automation',\n useAsTitle: 'name',\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n admin: {\n description: 'Human-readable name for the workflow',\n },\n required: true,\n },\n {\n name: 'description',\n type: 'textarea',\n admin: {\n description: 'Optional description of what this workflow does',\n },\n },\n {\n name: 'executionStatus',\n type: 'ui',\n admin: {\n components: {\n Field: '@xtr-dev/payload-automation/client#WorkflowExecutionStatus'\n },\n condition: (data) => !!data?.id // Only show for existing workflows\n }\n },\n {\n name: 'triggers',\n type: 'array',\n fields: [\n {\n name: 'type',\n type: 'select',\n options: [\n 'collection-trigger',\n 'webhook-trigger',\n 'global-trigger',\n 'cron-trigger',\n ...(triggers || []).map(t => t.slug)\n ]\n },\n {\n name: 'parameters',\n type: 'json',\n admin: {\n hidden: true,\n },\n defaultValue: {}\n },\n // Virtual fields for collection trigger\n {\n name: '__builtin_collectionSlug',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'collection-trigger',\n description: 'Collection that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.collectionSlug || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.collectionSlug = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: Object.keys(collectionTriggers || {}),\n virtual: true,\n },\n {\n name: '__builtin_operation',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'collection-trigger',\n description: 'Collection operation that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.operation || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.operation = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: [\n 'create',\n 'delete',\n 'read',\n 'update',\n ],\n virtual: true,\n },\n // Virtual fields for webhook trigger\n {\n name: '__builtin_webhookPath',\n type: 'text',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'webhook-trigger',\n description: 'URL path for the webhook (e.g., \"my-webhook\"). Full URL will be /api/workflows-webhook/my-webhook',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.webhookPath || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.webhookPath = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: (value: any, {siblingData}: any) => {\n if (siblingData?.type === 'webhook-trigger' && !value && !siblingData?.parameters?.webhookPath) {\n return 'Webhook path is required for webhook triggers'\n }\n return true\n },\n virtual: true,\n },\n // Virtual fields for global trigger\n {\n name: '__builtin_global',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'global-trigger',\n description: 'Global that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.global || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.global = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: [], // Will be populated dynamically based on available globals\n virtual: true,\n },\n {\n name: '__builtin_globalOperation',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'global-trigger',\n description: 'Global operation that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.globalOperation || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.globalOperation = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: [\n 'update'\n ],\n virtual: true,\n },\n // Virtual fields for cron trigger\n {\n name: '__builtin_cronExpression',\n type: 'text',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'cron-trigger',\n description: 'Cron expression for scheduled execution (e.g., \"0 0 * * *\" for daily at midnight)',\n placeholder: '0 0 * * *'\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.cronExpression || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.cronExpression = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: (value: any, {siblingData}: any) => {\n const cronValue = value || siblingData?.parameters?.cronExpression\n if (siblingData?.type === 'cron-trigger' && !cronValue) {\n return 'Cron expression is required for cron triggers'\n }\n\n // Validate cron expression format if provided\n if (siblingData?.type === 'cron-trigger' && cronValue) {\n // Basic format validation - should be 5 parts separated by spaces\n const cronParts = cronValue.trim().split(/\\s+/)\n if (cronParts.length !== 5) {\n return 'Invalid cron expression format. Expected 5 parts: \"minute hour day month weekday\" (e.g., \"0 9 * * 1\")'\n }\n\n // Additional validation could use node-cron but we avoid dynamic imports here\n // The main validation happens at runtime in the cron scheduler\n }\n\n return true\n },\n virtual: true,\n },\n {\n name: '__builtin_timezone',\n type: 'text',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'cron-trigger',\n description: 'Timezone for cron execution (e.g., \"America/New_York\", \"Europe/London\"). Defaults to UTC.',\n placeholder: 'UTC'\n },\n defaultValue: 'UTC',\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.timezone || 'UTC'\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.timezone = value || 'UTC'\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: (value: any, {siblingData}: any) => {\n const tzValue = value || siblingData?.parameters?.timezone\n if (siblingData?.type === 'cron-trigger' && tzValue) {\n try {\n // Test if timezone is valid by trying to create a date with it\n new Intl.DateTimeFormat('en', {timeZone: tzValue})\n return true\n } catch {\n return `Invalid timezone: ${tzValue}. Please use a valid IANA timezone identifier (e.g., \"America/New_York\", \"Europe/London\")`\n }\n }\n return true\n },\n virtual: true,\n },\n {\n name: 'condition',\n type: 'text',\n admin: {\n description: 'JSONPath expression that must evaluate to true for this trigger to execute the workflow (e.g., \"$.trigger.doc.status == \\'published\\'\")'\n },\n required: false\n },\n // Virtual fields for custom triggers\n // Note: Custom trigger fields from trigger-helpers already have unique names\n // We just need to pass them through without modification\n ...(triggers || []).flatMap(t => (t.inputs || []))\n ]\n },\n {\n name: 'steps',\n type: 'array',\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'step',\n type: 'select',\n options: steps.map(t => t.slug)\n },\n {\n name: 'name',\n type: 'text',\n }\n ]\n },\n ...(steps || []).flatMap(step => (step.inputSchema || []).map(field => ({\n ...field,\n admin: {\n ...(field.admin || {}),\n condition: (...args) => args[1]?.step === step.slug && (\n field.admin?.condition ?\n field.admin.condition.call(this, ...args) :\n true\n ),\n },\n } as Field))),\n {\n name: 'dependencies',\n type: 'text',\n admin: {\n description: 'Step names that must complete before this step can run'\n },\n hasMany: true,\n required: false\n },\n {\n name: 'condition',\n type: 'text',\n admin: {\n description: 'JSONPath expression that must evaluate to true for this step to execute (e.g., \"$.trigger.doc.status == \\'published\\'\")'\n },\n required: false\n },\n ],\n }\n ],\n versions: {\n drafts: {\n autosave: false,\n },\n maxPerDoc: 10,\n },\n})\n"],"names":["createWorkflowCollection","collectionTriggers","steps","triggers","slug","access","create","delete","read","update","admin","defaultColumns","description","group","useAsTitle","fields","name","type","required","components","Field","condition","data","id","options","map","t","hidden","defaultValue","_","siblingData","hooks","afterRead","parameters","collectionSlug","undefined","beforeChange","value","Object","keys","virtual","operation","webhookPath","validate","global","globalOperation","placeholder","cronExpression","cronValue","cronParts","trim","split","length","timezone","tzValue","Intl","DateTimeFormat","timeZone","flatMap","inputs","step","inputSchema","field","args","call","hasMany","versions","drafts","autosave","maxPerDoc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/collections/Workflow.ts"],"sourcesContent":["import type {CollectionConfig, Field} from 'payload'\n\nimport type {WorkflowsPluginConfig} from \"../plugin/config-types.js\"\n\nexport const createWorkflowCollection: <T extends string>(options: WorkflowsPluginConfig<T>) => CollectionConfig = ({\n collectionTriggers,\n steps,\n triggers\n }) => ({\n slug: 'workflows',\n access: {\n create: () => true,\n delete: () => true,\n read: () => true,\n update: () => true,\n },\n admin: {\n defaultColumns: ['name', 'updatedAt'],\n description: 'Create and manage automated workflows.',\n group: 'Automation',\n useAsTitle: 'name',\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n admin: {\n description: 'Human-readable name for the workflow',\n },\n required: true,\n },\n {\n name: 'description',\n type: 'textarea',\n admin: {\n description: 'Optional description of what this workflow does',\n },\n },\n {\n name: 'executionStatus',\n type: 'ui',\n admin: {\n components: {\n Field: '@xtr-dev/payload-automation/client#WorkflowExecutionStatus'\n },\n condition: (data) => !!data?.id // Only show for existing workflows\n }\n },\n {\n name: 'triggers',\n type: 'array',\n fields: [\n {\n name: 'type',\n type: 'select',\n options: [\n 'collection-trigger',\n 'webhook-trigger',\n 'global-trigger',\n 'cron-trigger',\n ...(triggers || []).map(t => t.slug)\n ]\n },\n {\n name: 'parameters',\n type: 'json',\n admin: {\n hidden: true,\n },\n defaultValue: {}\n },\n // Virtual fields for collection trigger\n {\n name: '__builtin_collectionSlug',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'collection-trigger',\n description: 'Collection that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.collectionSlug || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.collectionSlug = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: Object.keys(collectionTriggers || {}),\n virtual: true,\n },\n {\n name: '__builtin_operation',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'collection-trigger',\n description: 'Collection operation that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.operation || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.operation = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: [\n 'create',\n 'delete',\n 'read',\n 'update',\n ],\n virtual: true,\n },\n // Virtual fields for webhook trigger\n {\n name: '__builtin_webhookPath',\n type: 'text',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'webhook-trigger',\n description: 'URL path for the webhook (e.g., \"my-webhook\"). Full URL will be /api/workflows-webhook/my-webhook',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.webhookPath || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.webhookPath = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: (value: any, {siblingData}: any) => {\n if (siblingData?.type === 'webhook-trigger' && !value && !siblingData?.parameters?.webhookPath) {\n return 'Webhook path is required for webhook triggers'\n }\n return true\n },\n virtual: true,\n },\n // Virtual fields for global trigger\n {\n name: '__builtin_global',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'global-trigger',\n description: 'Global that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.global || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.global = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: [], // Will be populated dynamically based on available globals\n virtual: true,\n },\n {\n name: '__builtin_globalOperation',\n type: 'select',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'global-trigger',\n description: 'Global operation that triggers the workflow',\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.globalOperation || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.globalOperation = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n options: [\n 'update'\n ],\n virtual: true,\n },\n // Virtual fields for cron trigger\n {\n name: '__builtin_cronExpression',\n type: 'text',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'cron-trigger',\n description: 'Cron expression for scheduled execution (e.g., \"0 0 * * *\" for daily at midnight)',\n placeholder: '0 0 * * *'\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.cronExpression || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.cronExpression = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: (value: any, {siblingData}: any) => {\n const cronValue = value || siblingData?.parameters?.cronExpression\n if (siblingData?.type === 'cron-trigger' && !cronValue) {\n return 'Cron expression is required for cron triggers'\n }\n\n // Validate cron expression format if provided\n if (siblingData?.type === 'cron-trigger' && cronValue) {\n // Basic format validation - should be 5 parts separated by spaces\n const cronParts = cronValue.trim().split(/\\s+/)\n if (cronParts.length !== 5) {\n return 'Invalid cron expression format. Expected 5 parts: \"minute hour day month weekday\" (e.g., \"0 9 * * 1\")'\n }\n\n // Additional validation could use node-cron but we avoid dynamic imports here\n // The main validation happens at runtime in the cron scheduler\n }\n\n return true\n },\n virtual: true,\n },\n {\n name: '__builtin_timezone',\n type: 'text',\n admin: {\n condition: (_, siblingData) => siblingData?.type === 'cron-trigger',\n description: 'Timezone for cron execution (e.g., \"America/New_York\", \"Europe/London\"). Defaults to UTC.',\n placeholder: 'UTC'\n },\n defaultValue: 'UTC',\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.timezone || 'UTC'\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters.timezone = value || 'UTC'\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: (value: any, {siblingData}: any) => {\n const tzValue = value || siblingData?.parameters?.timezone\n if (siblingData?.type === 'cron-trigger' && tzValue) {\n try {\n // Test if timezone is valid by trying to create a date with it\n new Intl.DateTimeFormat('en', {timeZone: tzValue})\n return true\n } catch {\n return `Invalid timezone: ${tzValue}. Please use a valid IANA timezone identifier (e.g., \"America/New_York\", \"Europe/London\")`\n }\n }\n return true\n },\n virtual: true,\n },\n {\n name: 'condition',\n type: 'text',\n admin: {\n description: 'JSONPath expression that must evaluate to true for this trigger to execute the workflow (e.g., \"$.trigger.doc.status == \\'published\\'\")'\n },\n required: false\n },\n // Virtual fields for custom triggers\n // Note: Custom trigger fields from trigger-helpers already have unique names\n // We just need to pass them through without modification\n ...(triggers || []).flatMap(t => (t.inputs || []))\n ]\n },\n {\n name: 'steps',\n type: 'array',\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'step',\n type: 'select',\n options: steps.map(t => t.slug)\n },\n {\n name: 'name',\n type: 'text',\n }\n ]\n },\n ...(steps || []).flatMap(step => (step.inputSchema || []).map(field => {\n const originalName = (field as any).name;\n const resultField: any = {\n ...field,\n // Prefix field name with step slug to avoid conflicts\n name: `__step_${step.slug}_${originalName}`,\n admin: {\n ...(field.admin || {}),\n condition: (...args: any[]) => args[1]?.step === step.slug && (\n (field.admin as any)?.condition ?\n (field.admin as any).condition.call(this, ...args) :\n true\n ),\n },\n virtual: true,\n };\n\n // Add hooks to store/retrieve from the step's input data\n resultField.hooks = {\n ...((field as any).hooks || {}),\n afterRead: [\n ...(((field as any).hooks)?.afterRead || []),\n ({ siblingData }: any) => {\n // Read from step input data using original field name\n return siblingData?.[originalName] || (field as any).defaultValue;\n }\n ],\n beforeChange: [\n ...(((field as any).hooks)?.beforeChange || []),\n ({ siblingData, value }: any) => {\n // Store in step data using original field name\n siblingData[originalName] = value;\n return undefined; // Don't store the prefixed field\n }\n ]\n };\n\n return resultField as Field;\n })),\n {\n name: 'dependencies',\n type: 'text',\n admin: {\n description: 'Step names that must complete before this step can run'\n },\n hasMany: true,\n required: false\n },\n {\n name: 'condition',\n type: 'text',\n admin: {\n description: 'JSONPath expression that must evaluate to true for this step to execute (e.g., \"$.trigger.doc.status == \\'published\\'\")'\n },\n required: false\n },\n ],\n }\n ],\n versions: {\n drafts: {\n autosave: false,\n },\n maxPerDoc: 10,\n },\n})\n"],"names":["createWorkflowCollection","collectionTriggers","steps","triggers","slug","access","create","delete","read","update","admin","defaultColumns","description","group","useAsTitle","fields","name","type","required","components","Field","condition","data","id","options","map","t","hidden","defaultValue","_","siblingData","hooks","afterRead","parameters","collectionSlug","undefined","beforeChange","value","Object","keys","virtual","operation","webhookPath","validate","global","globalOperation","placeholder","cronExpression","cronValue","cronParts","trim","split","length","timezone","tzValue","Intl","DateTimeFormat","timeZone","flatMap","inputs","step","inputSchema","field","originalName","resultField","args","call","hasMany","versions","drafts","autosave","maxPerDoc"],"mappings":"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"}
|
package/dist/plugin/index.js
CHANGED
|
@@ -147,17 +147,37 @@ export const workflowsPlugin = (pluginOptions)=>(config)=>{
|
|
|
147
147
|
operation: args?.operation
|
|
148
148
|
}, 'Collection automation hook triggered');
|
|
149
149
|
if (!registry.isInitialized) {
|
|
150
|
-
logger.warn('Workflow executor not yet initialized,
|
|
151
|
-
|
|
150
|
+
logger.warn('Workflow executor not yet initialized, attempting lazy initialization');
|
|
151
|
+
try {
|
|
152
|
+
// Try to create executor if we have a payload instance
|
|
153
|
+
if (args.req?.payload) {
|
|
154
|
+
logger.info('Creating workflow executor via lazy initialization');
|
|
155
|
+
const { WorkflowExecutor } = await import('../core/workflow-executor.js');
|
|
156
|
+
const executor = new WorkflowExecutor(args.req.payload, logger);
|
|
157
|
+
setWorkflowExecutor(executor, logger);
|
|
158
|
+
logger.info('Lazy initialization successful');
|
|
159
|
+
} else {
|
|
160
|
+
logger.error('Cannot lazy initialize - no payload instance available');
|
|
161
|
+
await createFailedWorkflowRun(args, 'Workflow executor not initialized and lazy initialization failed - no payload instance', logger);
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
} catch (error) {
|
|
165
|
+
logger.error('Lazy initialization failed:', error);
|
|
166
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
167
|
+
await createFailedWorkflowRun(args, `Workflow executor lazy initialization failed: ${errorMessage}`, logger);
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
152
170
|
}
|
|
153
|
-
|
|
171
|
+
// Re-check registry after potential lazy initialization
|
|
172
|
+
const updatedRegistry = getExecutorRegistry();
|
|
173
|
+
if (!updatedRegistry.executor) {
|
|
154
174
|
logger.error('Workflow executor is null despite being marked as initialized');
|
|
155
175
|
// Create a failed workflow run to track this issue
|
|
156
|
-
await createFailedWorkflowRun(args, 'Executor not available', logger);
|
|
176
|
+
await createFailedWorkflowRun(args, 'Executor not available after initialization', logger);
|
|
157
177
|
return undefined;
|
|
158
178
|
}
|
|
159
179
|
logger.debug('Executing triggered workflows...');
|
|
160
|
-
await
|
|
180
|
+
await updatedRegistry.executor.executeTriggeredWorkflows(args.collection.slug, args.operation, args.doc, args.previousDoc, args.req);
|
|
161
181
|
logger.info({
|
|
162
182
|
collection: args?.collection?.slug,
|
|
163
183
|
docId: args?.doc?.id,
|
package/dist/plugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {Config} from 'payload'\n\nimport type {CollectionTriggerConfigCrud, 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\n// Improved executor registry with proper error handling and logging\ninterface ExecutorRegistry {\n executor: null | WorkflowExecutor\n isInitialized: boolean\n logger: any | null\n}\n\nconst executorRegistry: ExecutorRegistry = {\n executor: null,\n isInitialized: false,\n logger: null\n}\n\nconst setWorkflowExecutor = (executor: WorkflowExecutor, logger: any) => {\n executorRegistry.executor = executor\n executorRegistry.logger = logger\n executorRegistry.isInitialized = true\n\n logger.info('Workflow executor initialized and registered successfully')\n}\n\nconst getExecutorRegistry = (): ExecutorRegistry => {\n return executorRegistry\n}\n\n// Helper function to create failed workflow runs for tracking errors\nconst createFailedWorkflowRun = async (args: any, errorMessage: string, logger: any) => {\n try {\n // Only create failed workflow runs if we have enough context\n if (!args?.req?.payload || !args?.collection?.slug) {\n return\n }\n\n // Find workflows that should have been triggered\n const workflows = await args.req.payload.find({\n collection: 'workflows',\n limit: 10,\n req: args.req,\n where: {\n 'triggers.collectionSlug': {\n equals: args.collection.slug\n },\n 'triggers.operation': {\n equals: args.operation\n },\n 'triggers.type': {\n equals: 'collection-trigger'\n }\n }\n })\n\n // Create failed workflow runs for each matching workflow\n for (const workflow of workflows.docs) {\n await args.req.payload.create({\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: {\n steps: {},\n trigger: {\n type: 'collection',\n collection: args.collection.slug,\n doc: args.doc,\n operation: args.operation,\n previousDoc: args.previousDoc,\n triggeredAt: new Date().toISOString()\n }\n },\n error: `Hook execution failed: ${errorMessage}`,\n inputs: {},\n logs: [{\n level: 'error',\n message: `Hook execution failed: ${errorMessage}`,\n timestamp: new Date().toISOString()\n }],\n outputs: {},\n startedAt: new Date().toISOString(),\n status: 'failed',\n steps: [],\n triggeredBy: args?.req?.user?.email || 'system',\n workflow: workflow.id,\n workflowVersion: 1\n },\n req: args.req\n })\n }\n\n if (workflows.docs.length > 0) {\n logger.info({\n errorMessage,\n workflowCount: workflows.docs.length\n }, 'Created failed workflow runs for hook execution error')\n }\n\n } catch (error) {\n // Don't let workflow run creation failures break the original operation\n logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 'Failed to create failed workflow run record')\n }\n}\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\n// Removed config-phase hook registration - user collections don't exist during config phase\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 // CRITICAL: Modify existing collection configs BEFORE PayloadCMS processes them\n // This is the ONLY time we can add hooks that will actually work\n const logger = getConfigLogger()\n logger.info('Attempting to modify collection configs before PayloadCMS initialization...')\n\n if (config.collections && pluginOptions.collectionTriggers) {\n for (const [triggerSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {continue}\n\n // Find the collection config that matches\n const collectionIndex = config.collections.findIndex(c => c.slug === triggerSlug)\n if (collectionIndex === -1) {\n logger.warn(`Collection '${triggerSlug}' not found in config.collections`)\n continue\n }\n\n const collection = config.collections[collectionIndex]\n logger.info(`Found collection '${triggerSlug}' - modifying its hooks...`)\n\n // Initialize hooks if needed\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.afterChange) {\n collection.hooks.afterChange = []\n }\n\n // Create a reliable hook function with proper dependency injection\n const automationHook = Object.assign(\n async function payloadAutomationHook(args: any) {\n const registry = getExecutorRegistry()\n\n // Use proper logger if available, fallback to args.req.payload.logger\n const logger = registry.logger || args?.req?.payload?.logger || console\n\n try {\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n hookType: 'automation',\n operation: args?.operation\n }, 'Collection automation hook triggered')\n\n if (!registry.isInitialized) {\n logger.warn('Workflow executor not yet initialized, skipping execution')\n return undefined\n }\n\n if (!registry.executor) {\n logger.error('Workflow executor is null despite being marked as initialized')\n // Create a failed workflow run to track this issue\n await createFailedWorkflowRun(args, 'Executor not available', logger)\n return undefined\n }\n\n logger.debug('Executing triggered workflows...')\n await registry.executor.executeTriggeredWorkflows(\n args.collection.slug,\n args.operation,\n args.doc,\n args.previousDoc,\n args.req\n )\n\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n operation: args?.operation\n }, 'Workflow execution completed successfully')\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n\n logger.error({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n error: errorMessage,\n errorStack: error instanceof Error ? error.stack : undefined,\n operation: args?.operation\n }, 'Hook execution failed')\n\n // Create a failed workflow run to track this error\n try {\n await createFailedWorkflowRun(args, errorMessage, logger)\n } catch (createError) {\n logger.error({\n error: createError instanceof Error ? createError.message : 'Unknown error'\n }, 'Failed to create workflow run for hook error')\n }\n\n // Don't throw to prevent breaking the original operation\n }\n\n return undefined\n },\n {\n __isAutomationHook: true,\n __version: '0.0.22'\n }\n )\n\n // Add the hook to the collection config\n collection.hooks.afterChange.push(automationHook)\n logger.info(`Added automation hook to '${triggerSlug}' - hook count: ${collection.hooks.afterChange.length}`)\n }\n }\n\n if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n const configLogger = getConfigLogger()\n configLogger.info(`Configuring workflow plugin with ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers`)\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 configLogger.info(`onInit called - collections: ${Object.keys(payload.collections).length}`)\n\n // Execute any existing onInit functions first\n if (incomingOnInit) {\n configLogger.debug('Executing existing onInit function')\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log collection trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n // Create workflow executor instance\n console.log('🚨 CREATING WORKFLOW EXECUTOR INSTANCE')\n const executor = new WorkflowExecutor(payload, logger)\n console.log('🚨 EXECUTOR CREATED:', typeof executor)\n console.log('🚨 EXECUTOR METHODS:', Object.getOwnPropertyNames(Object.getPrototypeOf(executor)))\n\n // Register executor with proper dependency injection\n setWorkflowExecutor(executor, logger)\n\n // Hooks are now registered during config phase - just log status\n logger.info('Hooks were registered during config phase - executor now available')\n\n logger.info('Initializing global hooks...')\n initGlobalHooks(payload, logger, executor)\n\n logger.info('Initializing workflow hooks...')\n initWorkflowHooks(payload, logger)\n\n logger.info('Initializing step tasks...')\n initStepTasks(pluginOptions, payload, logger)\n\n // Register cron jobs for workflows with cron triggers\n logger.info('Registering cron jobs...')\n await registerCronJobs(payload, logger)\n\n logger.info('Plugin initialized successfully - all hooks registered')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","WorkflowExecutor","generateCronTasks","registerCronJobs","initGlobalHooks","initStepTasks","initWebhookEndpoint","initWorkflowHooks","getConfigLogger","initializeLogger","getLogger","executorRegistry","executor","isInitialized","logger","setWorkflowExecutor","info","getExecutorRegistry","createFailedWorkflowRun","args","errorMessage","req","payload","collection","slug","workflows","find","limit","where","equals","operation","workflow","docs","create","data","completedAt","Date","toISOString","context","steps","trigger","type","doc","previousDoc","triggeredAt","error","inputs","logs","level","message","timestamp","outputs","startedAt","status","triggeredBy","user","email","id","workflowVersion","length","workflowCount","warn","Error","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","collectionTriggers","triggerSlug","triggerConfig","Object","entries","collectionIndex","findIndex","c","hooks","afterChange","automationHook","assign","payloadAutomationHook","registry","console","docId","hookType","undefined","debug","executeTriggeredWorkflows","errorStack","stack","createError","__isAutomationHook","__version","jobs","tasks","configLogger","keys","step","task","webhookPrefix","incomingOnInit","onInit","log","getOwnPropertyNames","getPrototypeOf"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {Config} from 'payload'\n\nimport type {CollectionTriggerConfigCrud, 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\n// Improved executor registry with proper error handling and logging\ninterface ExecutorRegistry {\n executor: null | WorkflowExecutor\n isInitialized: boolean\n logger: any | null\n}\n\nconst executorRegistry: ExecutorRegistry = {\n executor: null,\n isInitialized: false,\n logger: null\n}\n\nconst setWorkflowExecutor = (executor: WorkflowExecutor, logger: any) => {\n executorRegistry.executor = executor\n executorRegistry.logger = logger\n executorRegistry.isInitialized = true\n\n logger.info('Workflow executor initialized and registered successfully')\n}\n\nconst getExecutorRegistry = (): ExecutorRegistry => {\n return executorRegistry\n}\n\n// Helper function to create failed workflow runs for tracking errors\nconst createFailedWorkflowRun = async (args: any, errorMessage: string, logger: any) => {\n try {\n // Only create failed workflow runs if we have enough context\n if (!args?.req?.payload || !args?.collection?.slug) {\n return\n }\n\n // Find workflows that should have been triggered\n const workflows = await args.req.payload.find({\n collection: 'workflows',\n limit: 10,\n req: args.req,\n where: {\n 'triggers.collectionSlug': {\n equals: args.collection.slug\n },\n 'triggers.operation': {\n equals: args.operation\n },\n 'triggers.type': {\n equals: 'collection-trigger'\n }\n }\n })\n\n // Create failed workflow runs for each matching workflow\n for (const workflow of workflows.docs) {\n await args.req.payload.create({\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: {\n steps: {},\n trigger: {\n type: 'collection',\n collection: args.collection.slug,\n doc: args.doc,\n operation: args.operation,\n previousDoc: args.previousDoc,\n triggeredAt: new Date().toISOString()\n }\n },\n error: `Hook execution failed: ${errorMessage}`,\n inputs: {},\n logs: [{\n level: 'error',\n message: `Hook execution failed: ${errorMessage}`,\n timestamp: new Date().toISOString()\n }],\n outputs: {},\n startedAt: new Date().toISOString(),\n status: 'failed',\n steps: [],\n triggeredBy: args?.req?.user?.email || 'system',\n workflow: workflow.id,\n workflowVersion: 1\n },\n req: args.req\n })\n }\n\n if (workflows.docs.length > 0) {\n logger.info({\n errorMessage,\n workflowCount: workflows.docs.length\n }, 'Created failed workflow runs for hook execution error')\n }\n\n } catch (error) {\n // Don't let workflow run creation failures break the original operation\n logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 'Failed to create failed workflow run record')\n }\n}\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\n// Removed config-phase hook registration - user collections don't exist during config phase\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 // CRITICAL: Modify existing collection configs BEFORE PayloadCMS processes them\n // This is the ONLY time we can add hooks that will actually work\n const logger = getConfigLogger()\n logger.info('Attempting to modify collection configs before PayloadCMS initialization...')\n\n if (config.collections && pluginOptions.collectionTriggers) {\n for (const [triggerSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {continue}\n\n // Find the collection config that matches\n const collectionIndex = config.collections.findIndex(c => c.slug === triggerSlug)\n if (collectionIndex === -1) {\n logger.warn(`Collection '${triggerSlug}' not found in config.collections`)\n continue\n }\n\n const collection = config.collections[collectionIndex]\n logger.info(`Found collection '${triggerSlug}' - modifying its hooks...`)\n\n // Initialize hooks if needed\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.afterChange) {\n collection.hooks.afterChange = []\n }\n\n // Create a reliable hook function with proper dependency injection\n const automationHook = Object.assign(\n async function payloadAutomationHook(args: any) {\n const registry = getExecutorRegistry()\n\n // Use proper logger if available, fallback to args.req.payload.logger\n const logger = registry.logger || args?.req?.payload?.logger || console\n\n try {\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n hookType: 'automation',\n operation: args?.operation\n }, 'Collection automation hook triggered')\n\n if (!registry.isInitialized) {\n logger.warn('Workflow executor not yet initialized, attempting lazy initialization')\n \n try {\n // Try to create executor if we have a payload instance\n if (args.req?.payload) {\n logger.info('Creating workflow executor via lazy initialization')\n const { WorkflowExecutor } = await import('../core/workflow-executor.js')\n const executor = new WorkflowExecutor(args.req.payload, logger)\n setWorkflowExecutor(executor, logger)\n logger.info('Lazy initialization successful')\n } else {\n logger.error('Cannot lazy initialize - no payload instance available')\n await createFailedWorkflowRun(args, 'Workflow executor not initialized and lazy initialization failed - no payload instance', logger)\n return undefined\n }\n } catch (error) {\n logger.error('Lazy initialization failed:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n await createFailedWorkflowRun(args, `Workflow executor lazy initialization failed: ${errorMessage}`, logger)\n return undefined\n }\n }\n\n // Re-check registry after potential lazy initialization\n const updatedRegistry = getExecutorRegistry()\n if (!updatedRegistry.executor) {\n logger.error('Workflow executor is null despite being marked as initialized')\n // Create a failed workflow run to track this issue\n await createFailedWorkflowRun(args, 'Executor not available after initialization', logger)\n return undefined\n }\n\n logger.debug('Executing triggered workflows...')\n await updatedRegistry.executor.executeTriggeredWorkflows(\n args.collection.slug,\n args.operation,\n args.doc,\n args.previousDoc,\n args.req\n )\n\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n operation: args?.operation\n }, 'Workflow execution completed successfully')\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n\n logger.error({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n error: errorMessage,\n errorStack: error instanceof Error ? error.stack : undefined,\n operation: args?.operation\n }, 'Hook execution failed')\n\n // Create a failed workflow run to track this error\n try {\n await createFailedWorkflowRun(args, errorMessage, logger)\n } catch (createError) {\n logger.error({\n error: createError instanceof Error ? createError.message : 'Unknown error'\n }, 'Failed to create workflow run for hook error')\n }\n\n // Don't throw to prevent breaking the original operation\n }\n\n return undefined\n },\n {\n __isAutomationHook: true,\n __version: '0.0.22'\n }\n )\n\n // Add the hook to the collection config\n collection.hooks.afterChange.push(automationHook)\n logger.info(`Added automation hook to '${triggerSlug}' - hook count: ${collection.hooks.afterChange.length}`)\n }\n }\n\n if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n const configLogger = getConfigLogger()\n configLogger.info(`Configuring workflow plugin with ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers`)\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 configLogger.info(`onInit called - collections: ${Object.keys(payload.collections).length}`)\n\n // Execute any existing onInit functions first\n if (incomingOnInit) {\n configLogger.debug('Executing existing onInit function')\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log collection trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n // Create workflow executor instance\n console.log('🚨 CREATING WORKFLOW EXECUTOR INSTANCE')\n const executor = new WorkflowExecutor(payload, logger)\n console.log('🚨 EXECUTOR CREATED:', typeof executor)\n console.log('🚨 EXECUTOR METHODS:', Object.getOwnPropertyNames(Object.getPrototypeOf(executor)))\n\n // Register executor with proper dependency injection\n setWorkflowExecutor(executor, logger)\n\n // Hooks are now registered during config phase - just log status\n logger.info('Hooks were registered during config phase - executor now available')\n\n logger.info('Initializing global hooks...')\n initGlobalHooks(payload, logger, executor)\n\n logger.info('Initializing workflow hooks...')\n initWorkflowHooks(payload, logger)\n\n logger.info('Initializing step tasks...')\n initStepTasks(pluginOptions, payload, logger)\n\n // Register cron jobs for workflows with cron triggers\n logger.info('Registering cron jobs...')\n await registerCronJobs(payload, logger)\n\n logger.info('Plugin initialized successfully - all hooks registered')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","WorkflowExecutor","generateCronTasks","registerCronJobs","initGlobalHooks","initStepTasks","initWebhookEndpoint","initWorkflowHooks","getConfigLogger","initializeLogger","getLogger","executorRegistry","executor","isInitialized","logger","setWorkflowExecutor","info","getExecutorRegistry","createFailedWorkflowRun","args","errorMessage","req","payload","collection","slug","workflows","find","limit","where","equals","operation","workflow","docs","create","data","completedAt","Date","toISOString","context","steps","trigger","type","doc","previousDoc","triggeredAt","error","inputs","logs","level","message","timestamp","outputs","startedAt","status","triggeredBy","user","email","id","workflowVersion","length","workflowCount","warn","Error","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","collectionTriggers","triggerSlug","triggerConfig","Object","entries","collectionIndex","findIndex","c","hooks","afterChange","automationHook","assign","payloadAutomationHook","registry","console","docId","hookType","undefined","String","updatedRegistry","debug","executeTriggeredWorkflows","errorStack","stack","createError","__isAutomationHook","__version","jobs","tasks","configLogger","keys","step","task","webhookPrefix","incomingOnInit","onInit","log","getOwnPropertyNames","getPrototypeOf"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xtr-dev/payload-automation",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.32",
|
|
4
4
|
"description": "PayloadCMS Automation Plugin - Comprehensive workflow automation system with visual workflow building, execution tracking, and step types",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|