@xtr-dev/payload-automation 0.0.24 → 0.0.26
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.
|
@@ -66,7 +66,7 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
66
66
|
},
|
|
67
67
|
// Virtual fields for collection trigger
|
|
68
68
|
{
|
|
69
|
-
name: '
|
|
69
|
+
name: '__builtin_collectionSlug',
|
|
70
70
|
type: 'select',
|
|
71
71
|
admin: {
|
|
72
72
|
condition: (_, siblingData)=>siblingData?.type === 'collection-trigger',
|
|
@@ -93,7 +93,7 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
93
93
|
virtual: true
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
|
-
name: '
|
|
96
|
+
name: '__builtin_operation',
|
|
97
97
|
type: 'select',
|
|
98
98
|
admin: {
|
|
99
99
|
condition: (_, siblingData)=>siblingData?.type === 'collection-trigger',
|
|
@@ -126,7 +126,7 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
126
126
|
},
|
|
127
127
|
// Virtual fields for webhook trigger
|
|
128
128
|
{
|
|
129
|
-
name: '
|
|
129
|
+
name: '__builtin_webhookPath',
|
|
130
130
|
type: 'text',
|
|
131
131
|
admin: {
|
|
132
132
|
condition: (_, siblingData)=>siblingData?.type === 'webhook-trigger',
|
|
@@ -159,7 +159,7 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
159
159
|
},
|
|
160
160
|
// Virtual fields for global trigger
|
|
161
161
|
{
|
|
162
|
-
name: '
|
|
162
|
+
name: '__builtin_global',
|
|
163
163
|
type: 'select',
|
|
164
164
|
admin: {
|
|
165
165
|
condition: (_, siblingData)=>siblingData?.type === 'global-trigger',
|
|
@@ -186,7 +186,7 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
186
186
|
virtual: true
|
|
187
187
|
},
|
|
188
188
|
{
|
|
189
|
-
name: '
|
|
189
|
+
name: '__builtin_globalOperation',
|
|
190
190
|
type: 'select',
|
|
191
191
|
admin: {
|
|
192
192
|
condition: (_, siblingData)=>siblingData?.type === 'global-trigger',
|
|
@@ -216,7 +216,7 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
216
216
|
},
|
|
217
217
|
// Virtual fields for cron trigger
|
|
218
218
|
{
|
|
219
|
-
name: '
|
|
219
|
+
name: '__builtin_cronExpression',
|
|
220
220
|
type: 'text',
|
|
221
221
|
admin: {
|
|
222
222
|
condition: (_, siblingData)=>siblingData?.type === 'cron-trigger',
|
|
@@ -260,7 +260,7 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
260
260
|
virtual: true
|
|
261
261
|
},
|
|
262
262
|
{
|
|
263
|
-
name: '
|
|
263
|
+
name: '__builtin_timezone',
|
|
264
264
|
type: 'text',
|
|
265
265
|
admin: {
|
|
266
266
|
condition: (_, siblingData)=>siblingData?.type === 'cron-trigger',
|
|
@@ -313,6 +313,8 @@ export const createWorkflowCollection = ({ collectionTriggers, steps, triggers }
|
|
|
313
313
|
// Virtual fields for custom triggers
|
|
314
314
|
...(triggers || []).flatMap((t)=>(t.inputs || []).filter((f)=>'name' in f && f.name).map((f)=>({
|
|
315
315
|
...f,
|
|
316
|
+
// Prefix field name with trigger slug to avoid conflicts
|
|
317
|
+
name: `__${t.slug}_${f.name}`,
|
|
316
318
|
admin: {
|
|
317
319
|
...f.admin || {},
|
|
318
320
|
condition: (...args)=>args[1]?.type === t.slug && (f.admin?.condition ? f.admin.condition.call(this, ...args) : true)
|
|
@@ -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: '@/components/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: '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: '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: '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: '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: '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: '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: '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 ...(triggers || []).flatMap(t => (t.inputs || []).filter(f => 'name' in f && f.name).map(f => ({\n ...f,\n admin: {\n ...(f.admin || {}),\n condition: (...args) => args[1]?.type === t.slug && (\n f.admin?.condition ?\n f.admin.condition.call(this, ...args) :\n true\n ),\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.[(f as any).name] || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters[(f as any).name] = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n virtual: true,\n } as Field)))\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","filter","f","args","call","step","inputSchema","field","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: '@/components/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 ...(triggers || []).flatMap(t => (t.inputs || []).filter(f => 'name' in f && f.name).map(f => ({\n ...f,\n // Prefix field name with trigger slug to avoid conflicts\n name: `__${t.slug}_${(f as any).name}`,\n admin: {\n ...(f.admin || {}),\n condition: (...args) => args[1]?.type === t.slug && (\n f.admin?.condition ?\n f.admin.condition.call(this, ...args) :\n true\n ),\n },\n hooks: {\n afterRead: [\n ({ siblingData }) => {\n return siblingData?.parameters?.[(f as any).name] || undefined\n }\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (!siblingData.parameters) {siblingData.parameters = {}}\n siblingData.parameters[(f as any).name] = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n virtual: true,\n } as Field)))\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","filter","f","args","call","step","inputSchema","field","hasMany","versions","drafts","autosave","maxPerDoc"],"mappings":"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"}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Helper function to create a virtual trigger parameter field
|
|
3
3
|
* Handles the boilerplate for storing/reading from the parameters JSON field
|
|
4
4
|
*/ export function createTriggerParameter(name, fieldConfig, triggerSlug) {
|
|
5
|
+
// Create a unique field name by prefixing with trigger slug
|
|
6
|
+
const uniqueFieldName = `__trigger_${triggerSlug}_${name}`;
|
|
5
7
|
return {
|
|
6
8
|
...fieldConfig,
|
|
7
|
-
name,
|
|
9
|
+
name: uniqueFieldName,
|
|
8
10
|
virtual: true,
|
|
9
11
|
admin: {
|
|
10
12
|
...fieldConfig.admin,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/trigger-helpers.ts"],"sourcesContent":["import type { Field } from 'payload'\nimport type { CustomTriggerConfig } from '../plugin/config-types.js'\n\n/**\n * Helper function to create a virtual trigger parameter field\n * Handles the boilerplate for storing/reading from the parameters JSON field\n */\nexport function createTriggerParameter(\n name: string,\n fieldConfig: any, // Use any to allow flexible field configurations\n triggerSlug: string\n): Field {\n return {\n ...fieldConfig,\n name,\n virtual: true,\n admin: {\n ...fieldConfig.admin,\n condition: (_, siblingData) => siblingData?.type === triggerSlug && (\n fieldConfig.admin?.condition ? \n fieldConfig.admin.condition(_, siblingData) : \n true\n )\n },\n hooks: {\n ...fieldConfig.hooks,\n afterRead: [\n ...(fieldConfig.hooks?.afterRead || []),\n ({ siblingData }) => siblingData?.parameters?.[name] || fieldConfig.defaultValue\n ],\n beforeChange: [\n ...(fieldConfig.hooks?.beforeChange || []),\n ({ value, siblingData }) => {\n if (!siblingData.parameters) siblingData.parameters = {}\n siblingData.parameters[name] = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: fieldConfig.validate || fieldConfig.required ? \n (value: any, args: any) => {\n const paramValue = value ?? args.siblingData?.parameters?.[name]\n \n // Check required\n if (fieldConfig.required && args.siblingData?.type === triggerSlug && !paramValue) {\n return `${fieldConfig.admin?.description || name} is required for ${triggerSlug}`\n }\n \n // Run original validation if present\n return fieldConfig.validate?.(paramValue, args) ?? true\n } : \n undefined\n } as Field\n}\n\n/**\n * Helper to create multiple trigger parameter fields at once\n */\nexport function createTriggerParameters(\n triggerSlug: string,\n parameters: Record<string, any>\n): Field[] {\n return Object.entries(parameters).map(([name, fieldConfig]) => \n createTriggerParameter(name, fieldConfig, triggerSlug)\n )\n}\n\n/**\n * Main trigger builder function that creates a fluent API for defining triggers\n */\nexport function createTrigger<TSlug extends string>(slug: TSlug) {\n return {\n /**\n * Define parameters for this trigger using a clean object syntax\n * @param paramConfig - Object where keys are parameter names and values are Field configs\n * @returns Complete CustomTriggerConfig ready for use\n */\n parameters(paramConfig: Record<string, any>): CustomTriggerConfig {\n return {\n slug,\n inputs: Object.entries(paramConfig).map(([name, fieldConfig]) => \n createTriggerParameter(name, fieldConfig, slug)\n )\n }\n }\n }\n}\n\n/**\n * Advanced trigger builder with chainable methods for more complex scenarios\n */\nexport function createAdvancedTrigger<TSlug extends string>(slug: TSlug) {\n const builder = {\n slug,\n _parameters: {} as Record<string, any>,\n \n /**\n * Set all parameters at once\n */\n parameters(paramConfig: Record<string, any>) {\n this._parameters = paramConfig\n return this\n },\n \n /**\n * Add a single parameter\n */\n parameter(name: string, fieldConfig: any) {\n this._parameters[name] = fieldConfig\n return this\n },\n \n /**\n * Extend with existing parameter sets (useful for common patterns)\n */\n extend(baseParameters: Record<string, any>) {\n this._parameters = { ...baseParameters, ...this._parameters }\n return this\n },\n \n /**\n * Build the final trigger configuration\n */\n build(): CustomTriggerConfig {\n return {\n slug: this.slug,\n inputs: Object.entries(this._parameters).map(([name, fieldConfig]) => \n createTriggerParameter(name, fieldConfig, this.slug)\n )\n }\n }\n }\n \n return builder\n}"],"names":["createTriggerParameter","name","fieldConfig","triggerSlug","virtual","admin","condition","_","siblingData","type","hooks","afterRead","parameters","defaultValue","beforeChange","value","undefined","validate","required","args","paramValue","description","createTriggerParameters","Object","entries","map","createTrigger","slug","paramConfig","inputs","createAdvancedTrigger","builder","_parameters","parameter","extend","baseParameters","build"],"mappings":"AAGA;;;CAGC,GACD,OAAO,SAASA,uBACdC,IAAY,EACZC,WAAgB,EAChBC,WAAmB;IAEnB,OAAO;QACL,
|
|
1
|
+
{"version":3,"sources":["../../src/utils/trigger-helpers.ts"],"sourcesContent":["import type { Field } from 'payload'\nimport type { CustomTriggerConfig } from '../plugin/config-types.js'\n\n/**\n * Helper function to create a virtual trigger parameter field\n * Handles the boilerplate for storing/reading from the parameters JSON field\n */\nexport function createTriggerParameter(\n name: string,\n fieldConfig: any, // Use any to allow flexible field configurations\n triggerSlug: string\n): Field {\n // Create a unique field name by prefixing with trigger slug\n const uniqueFieldName = `__trigger_${triggerSlug}_${name}`\n \n return {\n ...fieldConfig,\n name: uniqueFieldName,\n virtual: true,\n admin: {\n ...fieldConfig.admin,\n condition: (_, siblingData) => siblingData?.type === triggerSlug && (\n fieldConfig.admin?.condition ? \n fieldConfig.admin.condition(_, siblingData) : \n true\n )\n },\n hooks: {\n ...fieldConfig.hooks,\n afterRead: [\n ...(fieldConfig.hooks?.afterRead || []),\n ({ siblingData }) => siblingData?.parameters?.[name] || fieldConfig.defaultValue\n ],\n beforeChange: [\n ...(fieldConfig.hooks?.beforeChange || []),\n ({ value, siblingData }) => {\n if (!siblingData.parameters) siblingData.parameters = {}\n siblingData.parameters[name] = value\n return undefined // Virtual field, don't store directly\n }\n ]\n },\n validate: fieldConfig.validate || fieldConfig.required ? \n (value: any, args: any) => {\n const paramValue = value ?? args.siblingData?.parameters?.[name]\n \n // Check required\n if (fieldConfig.required && args.siblingData?.type === triggerSlug && !paramValue) {\n return `${fieldConfig.admin?.description || name} is required for ${triggerSlug}`\n }\n \n // Run original validation if present\n return fieldConfig.validate?.(paramValue, args) ?? true\n } : \n undefined\n } as Field\n}\n\n/**\n * Helper to create multiple trigger parameter fields at once\n */\nexport function createTriggerParameters(\n triggerSlug: string,\n parameters: Record<string, any>\n): Field[] {\n return Object.entries(parameters).map(([name, fieldConfig]) => \n createTriggerParameter(name, fieldConfig, triggerSlug)\n )\n}\n\n/**\n * Main trigger builder function that creates a fluent API for defining triggers\n */\nexport function createTrigger<TSlug extends string>(slug: TSlug) {\n return {\n /**\n * Define parameters for this trigger using a clean object syntax\n * @param paramConfig - Object where keys are parameter names and values are Field configs\n * @returns Complete CustomTriggerConfig ready for use\n */\n parameters(paramConfig: Record<string, any>): CustomTriggerConfig {\n return {\n slug,\n inputs: Object.entries(paramConfig).map(([name, fieldConfig]) => \n createTriggerParameter(name, fieldConfig, slug)\n )\n }\n }\n }\n}\n\n/**\n * Advanced trigger builder with chainable methods for more complex scenarios\n */\nexport function createAdvancedTrigger<TSlug extends string>(slug: TSlug) {\n const builder = {\n slug,\n _parameters: {} as Record<string, any>,\n \n /**\n * Set all parameters at once\n */\n parameters(paramConfig: Record<string, any>) {\n this._parameters = paramConfig\n return this\n },\n \n /**\n * Add a single parameter\n */\n parameter(name: string, fieldConfig: any) {\n this._parameters[name] = fieldConfig\n return this\n },\n \n /**\n * Extend with existing parameter sets (useful for common patterns)\n */\n extend(baseParameters: Record<string, any>) {\n this._parameters = { ...baseParameters, ...this._parameters }\n return this\n },\n \n /**\n * Build the final trigger configuration\n */\n build(): CustomTriggerConfig {\n return {\n slug: this.slug,\n inputs: Object.entries(this._parameters).map(([name, fieldConfig]) => \n createTriggerParameter(name, fieldConfig, this.slug)\n )\n }\n }\n }\n \n return builder\n}"],"names":["createTriggerParameter","name","fieldConfig","triggerSlug","uniqueFieldName","virtual","admin","condition","_","siblingData","type","hooks","afterRead","parameters","defaultValue","beforeChange","value","undefined","validate","required","args","paramValue","description","createTriggerParameters","Object","entries","map","createTrigger","slug","paramConfig","inputs","createAdvancedTrigger","builder","_parameters","parameter","extend","baseParameters","build"],"mappings":"AAGA;;;CAGC,GACD,OAAO,SAASA,uBACdC,IAAY,EACZC,WAAgB,EAChBC,WAAmB;IAEnB,4DAA4D;IAC5D,MAAMC,kBAAkB,CAAC,UAAU,EAAED,YAAY,CAAC,EAAEF,MAAM;IAE1D,OAAO;QACL,GAAGC,WAAW;QACdD,MAAMG;QACNC,SAAS;QACTC,OAAO;YACL,GAAGJ,YAAYI,KAAK;YACpBC,WAAW,CAACC,GAAGC,cAAgBA,aAAaC,SAASP,eACnDD,CAAAA,YAAYI,KAAK,EAAEC,YACjBL,YAAYI,KAAK,CAACC,SAAS,CAACC,GAAGC,eAC/B,IAAG;QAET;QACAE,OAAO;YACL,GAAGT,YAAYS,KAAK;YACpBC,WAAW;mBACLV,YAAYS,KAAK,EAAEC,aAAa,EAAE;gBACtC,CAAC,EAAEH,WAAW,EAAE,GAAKA,aAAaI,YAAY,CAACZ,KAAK,IAAIC,YAAYY,YAAY;aACjF;YACDC,cAAc;mBACRb,YAAYS,KAAK,EAAEI,gBAAgB,EAAE;gBACzC,CAAC,EAAEC,KAAK,EAAEP,WAAW,EAAE;oBACrB,IAAI,CAACA,YAAYI,UAAU,EAAEJ,YAAYI,UAAU,GAAG,CAAC;oBACvDJ,YAAYI,UAAU,CAACZ,KAAK,GAAGe;oBAC/B,OAAOC,UAAU,sCAAsC;;gBACzD;aACD;QACH;QACAC,UAAUhB,YAAYgB,QAAQ,IAAIhB,YAAYiB,QAAQ,GACpD,CAACH,OAAYI;YACX,MAAMC,aAAaL,SAASI,KAAKX,WAAW,EAAEI,YAAY,CAACZ,KAAK;YAEhE,iBAAiB;YACjB,IAAIC,YAAYiB,QAAQ,IAAIC,KAAKX,WAAW,EAAEC,SAASP,eAAe,CAACkB,YAAY;gBACjF,OAAO,GAAGnB,YAAYI,KAAK,EAAEgB,eAAerB,KAAK,iBAAiB,EAAEE,aAAa;YACnF;YAEA,qCAAqC;YACrC,OAAOD,YAAYgB,QAAQ,GAAGG,YAAYD,SAAS;QACrD,IACAH;IACJ;AACF;AAEA;;CAEC,GACD,OAAO,SAASM,wBACdpB,WAAmB,EACnBU,UAA+B;IAE/B,OAAOW,OAAOC,OAAO,CAACZ,YAAYa,GAAG,CAAC,CAAC,CAACzB,MAAMC,YAAY,GACxDF,uBAAuBC,MAAMC,aAAaC;AAE9C;AAEA;;CAEC,GACD,OAAO,SAASwB,cAAoCC,IAAW;IAC7D,OAAO;QACL;;;;KAIC,GACDf,YAAWgB,WAAgC;YACzC,OAAO;gBACLD;gBACAE,QAAQN,OAAOC,OAAO,CAACI,aAAaH,GAAG,CAAC,CAAC,CAACzB,MAAMC,YAAY,GAC1DF,uBAAuBC,MAAMC,aAAa0B;YAE9C;QACF;IACF;AACF;AAEA;;CAEC,GACD,OAAO,SAASG,sBAA4CH,IAAW;IACrE,MAAMI,UAAU;QACdJ;QACAK,aAAa,CAAC;QAEd;;KAEC,GACDpB,YAAWgB,WAAgC;YACzC,IAAI,CAACI,WAAW,GAAGJ;YACnB,OAAO,IAAI;QACb;QAEA;;KAEC,GACDK,WAAUjC,IAAY,EAAEC,WAAgB;YACtC,IAAI,CAAC+B,WAAW,CAAChC,KAAK,GAAGC;YACzB,OAAO,IAAI;QACb;QAEA;;KAEC,GACDiC,QAAOC,cAAmC;YACxC,IAAI,CAACH,WAAW,GAAG;gBAAE,GAAGG,cAAc;gBAAE,GAAG,IAAI,CAACH,WAAW;YAAC;YAC5D,OAAO,IAAI;QACb;QAEA;;KAEC,GACDI;YACE,OAAO;gBACLT,MAAM,IAAI,CAACA,IAAI;gBACfE,QAAQN,OAAOC,OAAO,CAAC,IAAI,CAACQ,WAAW,EAAEP,GAAG,CAAC,CAAC,CAACzB,MAAMC,YAAY,GAC/DF,uBAAuBC,MAAMC,aAAa,IAAI,CAAC0B,IAAI;YAEvD;QACF;IACF;IAEA,OAAOI;AACT"}
|
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.26",
|
|
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",
|