@xtr-dev/payload-automation 0.0.40 → 0.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +76 -160
  2. package/dist/collections/Workflow.d.ts +3 -0
  3. package/dist/collections/Workflow.js +46 -2
  4. package/dist/collections/Workflow.js.map +1 -1
  5. package/dist/collections/WorkflowRuns.d.ts +2 -0
  6. package/dist/components/ErrorDisplay.d.ts +9 -0
  7. package/dist/components/ReadOnlyBanner.d.ts +2 -0
  8. package/dist/components/ReadOnlyBanner.js +67 -0
  9. package/dist/components/ReadOnlyBanner.js.map +1 -0
  10. package/dist/components/StatusCell.d.ts +6 -0
  11. package/dist/components/WorkflowBuilder/StepConfigurationForm.d.ts +34 -0
  12. package/dist/components/WorkflowBuilder/WorkflowBuilder.d.ts +40 -0
  13. package/dist/components/WorkflowBuilder/WorkflowToolbar.d.ts +14 -0
  14. package/dist/components/WorkflowBuilder/index.d.ts +4 -0
  15. package/dist/components/WorkflowBuilder/nodes/StepNode.d.ts +3 -0
  16. package/dist/core/trigger-custom-workflow.d.ts +52 -0
  17. package/dist/core/workflow-executor.d.ts +90 -0
  18. package/dist/exports/client.d.ts +3 -0
  19. package/dist/exports/client.js +2 -1
  20. package/dist/exports/client.js.map +1 -1
  21. package/dist/exports/fields.d.ts +1 -0
  22. package/dist/exports/rsc.d.ts +1 -0
  23. package/dist/exports/server.d.ts +5 -0
  24. package/dist/exports/views.d.ts +1 -0
  25. package/dist/fields/WorkflowBuilderField.d.ts +7 -0
  26. package/dist/fields/parameter.d.ts +4 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/plugin/collection-hook.d.ts +1 -0
  30. package/dist/plugin/config-types.d.ts +36 -0
  31. package/dist/plugin/config-types.js.map +1 -1
  32. package/dist/plugin/global-hook.d.ts +1 -0
  33. package/dist/plugin/index.d.ts +4 -0
  34. package/dist/plugin/index.js +53 -0
  35. package/dist/plugin/index.js.map +1 -1
  36. package/dist/plugin/logger.d.ts +20 -0
  37. package/dist/steps/create-document-handler.d.ts +2 -0
  38. package/dist/steps/create-document.d.ts +46 -0
  39. package/dist/steps/delete-document-handler.d.ts +2 -0
  40. package/dist/steps/delete-document.d.ts +39 -0
  41. package/dist/steps/http-request-handler.d.ts +2 -0
  42. package/dist/steps/http-request.d.ts +155 -0
  43. package/dist/steps/index.d.ts +12 -0
  44. package/dist/steps/read-document-handler.d.ts +2 -0
  45. package/dist/steps/read-document.d.ts +46 -0
  46. package/dist/steps/send-email-handler.d.ts +2 -0
  47. package/dist/steps/send-email.d.ts +44 -0
  48. package/dist/steps/update-document-handler.d.ts +2 -0
  49. package/dist/steps/update-document.d.ts +46 -0
  50. package/dist/triggers/collection-trigger.d.ts +2 -0
  51. package/dist/triggers/global-trigger.d.ts +2 -0
  52. package/dist/triggers/index.d.ts +2 -0
  53. package/dist/triggers/types.d.ts +5 -0
  54. package/dist/types/index.d.ts +24 -0
  55. package/dist/types/index.js +1 -0
  56. package/dist/types/index.js.map +1 -1
  57. package/package.json +4 -3
@@ -0,0 +1,52 @@
1
+ import type { Payload, PayloadRequest } from 'payload';
2
+ export interface CustomTriggerOptions {
3
+ /**
4
+ * Data to pass to the workflow execution context
5
+ */
6
+ data?: Record<string, unknown>;
7
+ /**
8
+ * Optional PayloadRequest to use for the workflow execution
9
+ * If not provided, a minimal request will be created
10
+ */
11
+ req?: PayloadRequest;
12
+ /**
13
+ * The slug of the custom trigger to execute
14
+ */
15
+ slug: string;
16
+ /**
17
+ * Optional user information for tracking who triggered the workflow
18
+ */
19
+ user?: {
20
+ email?: string;
21
+ id?: string;
22
+ };
23
+ }
24
+ export interface TriggerResult {
25
+ error?: string;
26
+ runId: number | string;
27
+ status: 'failed' | 'triggered';
28
+ workflowId: string;
29
+ workflowName: string;
30
+ }
31
+ /**
32
+ * Programmatically trigger workflows that have a matching custom trigger
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * // In your onInit or elsewhere in your code
37
+ * await triggerCustomWorkflow(payload, {
38
+ * slug: 'data-import',
39
+ * data: {
40
+ * source: 'external-api',
41
+ * recordCount: 100,
42
+ * importedAt: new Date().toISOString()
43
+ * }
44
+ * })
45
+ * ```
46
+ */
47
+ export declare function triggerCustomWorkflow(payload: Payload, options: CustomTriggerOptions): Promise<TriggerResult[]>;
48
+ /**
49
+ * Helper function to trigger a single workflow by ID with custom trigger data
50
+ * This is useful when you know exactly which workflow you want to trigger
51
+ */
52
+ export declare function triggerWorkflowById(payload: Payload, workflowId: string, triggerSlug: string, data?: Record<string, unknown>, req?: PayloadRequest): Promise<TriggerResult>;
@@ -0,0 +1,90 @@
1
+ import type { Payload, PayloadRequest } from 'payload';
2
+ export type PayloadWorkflow = {
3
+ id: number;
4
+ name: string;
5
+ description?: null | string;
6
+ triggers?: Array<{
7
+ type?: null | string;
8
+ condition?: null | string;
9
+ parameters?: {
10
+ collectionSlug?: null | string;
11
+ operation?: null | string;
12
+ global?: null | string;
13
+ globalOperation?: null | string;
14
+ [key: string]: unknown;
15
+ } | null;
16
+ [key: string]: unknown;
17
+ }> | null;
18
+ steps?: Array<{
19
+ type?: null | string;
20
+ name?: null | string;
21
+ input?: unknown;
22
+ dependencies?: null | string[];
23
+ condition?: null | string;
24
+ [key: string]: unknown;
25
+ }> | null;
26
+ [key: string]: unknown;
27
+ };
28
+ export type WorkflowStep = {
29
+ name: string;
30
+ } & NonNullable<PayloadWorkflow['steps']>[0];
31
+ export type WorkflowTrigger = {
32
+ type: string;
33
+ } & NonNullable<PayloadWorkflow['triggers']>[0];
34
+ export interface ExecutionContext {
35
+ steps: Record<string, any>;
36
+ trigger: Record<string, any>;
37
+ }
38
+ export declare class WorkflowExecutor {
39
+ private payload;
40
+ private logger;
41
+ constructor(payload: Payload, logger: Payload['logger']);
42
+ /**
43
+ * Convert string values to appropriate types based on common patterns
44
+ */
45
+ private convertValueType;
46
+ /**
47
+ * Classifies error types based on error messages
48
+ */
49
+ private classifyErrorType;
50
+ /**
51
+ * Evaluate a step condition using JSONPath
52
+ */
53
+ private evaluateStepCondition;
54
+ /**
55
+ * Execute a single workflow step
56
+ */
57
+ private executeStep;
58
+ /**
59
+ * Extracts detailed error information from job logs and input
60
+ */
61
+ private extractErrorDetailsFromJob;
62
+ /**
63
+ * Resolve step execution order based on dependencies
64
+ */
65
+ private resolveExecutionOrder;
66
+ /**
67
+ * Resolve step input using Handlebars templates with automatic type conversion
68
+ */
69
+ private resolveStepInput;
70
+ /**
71
+ * Safely serialize an object, handling circular references and non-serializable values
72
+ */
73
+ private safeSerialize;
74
+ /**
75
+ * Update workflow run with current context
76
+ */
77
+ private updateWorkflowRunContext;
78
+ /**
79
+ * Evaluate a condition using Handlebars templates and comparison operators
80
+ */
81
+ evaluateCondition(condition: string, context: ExecutionContext): boolean;
82
+ /**
83
+ * Resolve a condition value using Handlebars templates or JSONPath
84
+ */
85
+ private resolveConditionValue;
86
+ /**
87
+ * Execute a workflow with the given context
88
+ */
89
+ execute(workflow: PayloadWorkflow, context: ExecutionContext, req: PayloadRequest): Promise<void>;
90
+ }
@@ -0,0 +1,3 @@
1
+ export { StatusCell } from '../components/StatusCell.js';
2
+ export { ErrorDisplay } from '../components/ErrorDisplay.js';
3
+ export { ReadOnlyBanner } from '../components/ReadOnlyBanner.js';
@@ -1,7 +1,8 @@
1
1
  // Client-side components that may have CSS imports or PayloadCMS UI dependencies
2
2
  // These are separated to avoid CSS import errors during Node.js type generation
3
3
  export { StatusCell } from '../components/StatusCell.js';
4
- export { ErrorDisplay } from '../components/ErrorDisplay.js'; // Future client components can be added here:
4
+ export { ErrorDisplay } from '../components/ErrorDisplay.js';
5
+ export { ReadOnlyBanner } from '../components/ReadOnlyBanner.js'; // Future client components can be added here:
5
6
  // export { default as WorkflowDashboard } from '../components/WorkflowDashboard/index.js'
6
7
  // export { default as WorkflowBuilder } from '../components/WorkflowBuilder/index.js'
7
8
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["// Client-side components that may have CSS imports or PayloadCMS UI dependencies\n// These are separated to avoid CSS import errors during Node.js type generation\n\nexport { StatusCell } from '../components/StatusCell.js'\nexport { ErrorDisplay } from '../components/ErrorDisplay.js'\n\n// Future client components can be added here:\n// export { default as WorkflowDashboard } from '../components/WorkflowDashboard/index.js'\n// export { default as WorkflowBuilder } from '../components/WorkflowBuilder/index.js'\n"],"names":["StatusCell","ErrorDisplay"],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAEhF,SAASA,UAAU,QAAQ,8BAA6B;AACxD,SAASC,YAAY,QAAQ,gCAA+B,CAE5D,8CAA8C;CAC9C,0FAA0F;CAC1F,sFAAsF"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["// Client-side components that may have CSS imports or PayloadCMS UI dependencies\n// These are separated to avoid CSS import errors during Node.js type generation\n\nexport { StatusCell } from '../components/StatusCell.js'\nexport { ErrorDisplay } from '../components/ErrorDisplay.js'\nexport { ReadOnlyBanner } from '../components/ReadOnlyBanner.js'\n\n// Future client components can be added here:\n// export { default as WorkflowDashboard } from '../components/WorkflowDashboard/index.js'\n// export { default as WorkflowBuilder } from '../components/WorkflowBuilder/index.js'\n"],"names":["StatusCell","ErrorDisplay","ReadOnlyBanner"],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAEhF,SAASA,UAAU,QAAQ,8BAA6B;AACxD,SAASC,YAAY,QAAQ,gCAA+B;AAC5D,SAASC,cAAc,QAAQ,kCAAiC,CAEhE,8CAA8C;CAC9C,0FAA0F;CAC1F,sFAAsF"}
@@ -0,0 +1 @@
1
+ export declare const WorkflowFields: {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ export { triggerCustomWorkflow, triggerWorkflowById } from '../core/trigger-custom-workflow.js';
2
+ export { WorkflowExecutor } from '../core/workflow-executor.js';
3
+ export { workflowsPlugin } from '../plugin/index.js';
4
+ export { createDocumentHandler, deleteDocumentHandler, httpStepHandler, readDocumentHandler, sendEmailHandler, updateDocumentHandler } from '../steps/index.js';
5
+ export { CreateDocumentStepTask, DeleteDocumentStepTask, HttpRequestStepTask, ReadDocumentStepTask, SendEmailStepTask, UpdateDocumentStepTask } from '../steps/index.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface WorkflowBuilderFieldProps {
3
+ name?: string;
4
+ path?: string;
5
+ }
6
+ export declare const WorkflowBuilderField: React.FC<WorkflowBuilderFieldProps>;
7
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { Field } from "payload";
2
+ export declare const parameter: (slug: string, field: {
3
+ name: string;
4
+ } & Field) => Field;
@@ -0,0 +1,2 @@
1
+ export type { PayloadWorkflow as Workflow, WorkflowStep, WorkflowTrigger } from './core/workflow-executor.js';
2
+ export type { CustomTriggerOptions, ExecutionContext, TriggerResult, WorkflowsPluginConfig, SeedWorkflow } from './types/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Main export contains only types and client-safe utilities\n// Server-side functions are exported via '@xtr-dev/payload-automation/server'\n\nexport type {\n PayloadWorkflow as Workflow,\n WorkflowStep,\n WorkflowTrigger\n} from './core/workflow-executor.js'\n\n// Pure types only - completely safe for client bundling\nexport type {\n CustomTriggerOptions,\n ExecutionContext,\n TriggerResult,\n WorkflowsPluginConfig\n} from './types/index.js'\n\n// Server-side functions are NOT re-exported here to avoid bundling issues\n// Import server-side functions from the /server export instead\n\n// Server functions and plugin should be imported from '/server':\n// import { workflowsPlugin } from '@xtr-dev/payload-automation/server'\n// UI components should be imported from '/client':\n// import { TriggerWorkflowButton } from '@xtr-dev/payload-automation/client'\n"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,8EAA8E;AAQ9E,wDAAwD;AACxD,WAKyB,CAEzB,0EAA0E;CAC1E,+DAA+D;CAE/D,iEAAiE;CACjE,uEAAuE;CACvE,mDAAmD;CACnD,6EAA6E"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Main export contains only types and client-safe utilities\n// Server-side functions are exported via '@xtr-dev/payload-automation/server'\n\nexport type {\n PayloadWorkflow as Workflow,\n WorkflowStep,\n WorkflowTrigger\n} from './core/workflow-executor.js'\n\n// Pure types only - completely safe for client bundling\nexport type {\n CustomTriggerOptions,\n ExecutionContext,\n TriggerResult,\n WorkflowsPluginConfig,\n SeedWorkflow\n} from './types/index.js'\n\n// Server-side functions are NOT re-exported here to avoid bundling issues\n// Import server-side functions from the /server export instead\n\n// Server functions and plugin should be imported from '/server':\n// import { workflowsPlugin } from '@xtr-dev/payload-automation/server'\n// UI components should be imported from '/client':\n// import { TriggerWorkflowButton } from '@xtr-dev/payload-automation/client'\n"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,8EAA8E;AAQ9E,wDAAwD;AACxD,WAMyB,CAEzB,0EAA0E;CAC1E,+DAA+D;CAE/D,iEAAiE;CACjE,uEAAuE;CACvE,mDAAmD;CACnD,6EAA6E"}
@@ -0,0 +1 @@
1
+ export declare const createCollectionTriggerHook: (collectionSlug: string, hookType: string) => (args: any) => Promise<void>;
@@ -0,0 +1,36 @@
1
+ import type { CollectionConfig, GlobalConfig, TaskConfig } from "payload";
2
+ import type { Trigger } from "../triggers/types.js";
3
+ export type TriggerConfig = (config: WorkflowsPluginConfig) => Trigger;
4
+ export type SeedWorkflow = {
5
+ slug: string;
6
+ name: string;
7
+ description?: string;
8
+ triggers: Array<{
9
+ type: string;
10
+ parameters?: Record<string, any>;
11
+ condition?: string;
12
+ }>;
13
+ steps: Array<{
14
+ name: string;
15
+ type: string;
16
+ input?: Record<string, any>;
17
+ dependencies?: string[];
18
+ condition?: string;
19
+ }>;
20
+ };
21
+ export type WorkflowsPluginConfig<TSlug extends string = string, TGlobal extends string = string> = {
22
+ collectionTriggers?: {
23
+ [key in TSlug]?: {
24
+ [key in keyof CollectionConfig['hooks']]?: true;
25
+ } | true;
26
+ };
27
+ globalTriggers?: {
28
+ [key in TGlobal]?: {
29
+ [key in keyof GlobalConfig['hooks']]?: true;
30
+ } | true;
31
+ };
32
+ enabled?: boolean;
33
+ seedWorkflows?: SeedWorkflow[];
34
+ steps: TaskConfig<string>[];
35
+ triggers?: TriggerConfig[];
36
+ };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugin/config-types.ts"],"sourcesContent":["import type {CollectionConfig, GlobalConfig, TaskConfig} from \"payload\"\n\nimport type {Trigger} from \"../triggers/types.js\"\n\nexport type TriggerConfig = (config: WorkflowsPluginConfig) => Trigger\n\nexport type WorkflowsPluginConfig<TSlug extends string = string, TGlobal extends string = string> = {\n collectionTriggers?: {\n [key in TSlug]?: {\n [key in keyof CollectionConfig['hooks']]?: true\n } | true\n }\n globalTriggers?: {\n [key in TGlobal]?: {\n [key in keyof GlobalConfig['hooks']]?: true\n } | true\n }\n enabled?: boolean\n steps: TaskConfig<string>[]\n triggers?: TriggerConfig[]\n}\n"],"names":[],"mappings":"AAMA,WAcC"}
1
+ {"version":3,"sources":["../../src/plugin/config-types.ts"],"sourcesContent":["import type {CollectionConfig, GlobalConfig, TaskConfig} from \"payload\"\n\nimport type {Trigger} from \"../triggers/types.js\"\n\nexport type TriggerConfig = (config: WorkflowsPluginConfig) => Trigger\n\nexport type SeedWorkflow = {\n slug: string\n name: string\n description?: string\n triggers: Array<{\n type: string\n parameters?: Record<string, any>\n condition?: string\n }>\n steps: Array<{\n name: string\n type: string\n input?: Record<string, any>\n dependencies?: string[]\n condition?: string\n }>\n}\n\nexport type WorkflowsPluginConfig<TSlug extends string = string, TGlobal extends string = string> = {\n collectionTriggers?: {\n [key in TSlug]?: {\n [key in keyof CollectionConfig['hooks']]?: true\n } | true\n }\n globalTriggers?: {\n [key in TGlobal]?: {\n [key in keyof GlobalConfig['hooks']]?: true\n } | true\n }\n enabled?: boolean\n seedWorkflows?: SeedWorkflow[]\n steps: TaskConfig<string>[]\n triggers?: TriggerConfig[]\n}\n"],"names":[],"mappings":"AAwBA,WAeC"}
@@ -0,0 +1 @@
1
+ export declare const createGlobalTriggerHook: (globalSlug: string, hookType: string) => (args: any) => Promise<void>;
@@ -0,0 +1,4 @@
1
+ import type { Config } from 'payload';
2
+ import type { WorkflowsPluginConfig } from "./config-types.js";
3
+ export { getLogger } from './logger.js';
4
+ export declare const workflowsPlugin: <TSlug extends string>(pluginOptions: WorkflowsPluginConfig<TSlug>) => (config: Config) => Config;
@@ -138,6 +138,59 @@ export const workflowsPlugin = (pluginOptions)=>(config)=>{
138
138
  logger.info('Logger initialized with payload instance');
139
139
  // Log trigger configuration
140
140
  logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${Object.keys(pluginOptions.globalTriggers || {}).length} global triggers, ${pluginOptions.steps?.length || 0} steps`);
141
+ // Seed workflows if configured
142
+ if (pluginOptions.seedWorkflows && pluginOptions.seedWorkflows.length > 0) {
143
+ logger.info(`Seeding ${pluginOptions.seedWorkflows.length} workflows...`);
144
+ for (const seedWorkflow of pluginOptions.seedWorkflows){
145
+ try {
146
+ // Check if workflow already exists by slug
147
+ const existingWorkflow = await payload.find({
148
+ collection: 'workflows',
149
+ where: {
150
+ slug: {
151
+ equals: seedWorkflow.slug
152
+ }
153
+ },
154
+ limit: 1
155
+ });
156
+ if (existingWorkflow.docs.length > 0) {
157
+ const existing = existingWorkflow.docs[0];
158
+ // Detect changes by comparing workflow definition
159
+ const stepsChanged = JSON.stringify(existing.steps) !== JSON.stringify(seedWorkflow.steps);
160
+ const triggersChanged = JSON.stringify(existing.triggers) !== JSON.stringify(seedWorkflow.triggers);
161
+ const nameChanged = existing.name !== seedWorkflow.name;
162
+ const descriptionChanged = existing.description !== seedWorkflow.description;
163
+ const hasChanges = stepsChanged || triggersChanged || nameChanged || descriptionChanged;
164
+ if (hasChanges) {
165
+ logger.info(`Updating seeded workflow '${seedWorkflow.slug}': ${seedWorkflow.name}`);
166
+ await payload.update({
167
+ collection: 'workflows',
168
+ id: existing.id,
169
+ data: {
170
+ ...seedWorkflow,
171
+ readOnly: true
172
+ }
173
+ });
174
+ logger.info(`Updated workflow: ${seedWorkflow.name}`);
175
+ } else {
176
+ logger.debug(`Workflow '${seedWorkflow.slug}' is up to date, skipping`);
177
+ }
178
+ } else {
179
+ // Create the workflow as read-only
180
+ await payload.create({
181
+ collection: 'workflows',
182
+ data: {
183
+ ...seedWorkflow,
184
+ readOnly: true
185
+ }
186
+ });
187
+ logger.info(`Seeded workflow: ${seedWorkflow.name}`);
188
+ }
189
+ } catch (error) {
190
+ logger.error(`Failed to seed workflow '${seedWorkflow.name}':`, error);
191
+ }
192
+ }
193
+ }
141
194
  logger.info('Plugin initialized successfully - all hooks registered');
142
195
  };
143
196
  return config;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {CollectionConfig, Config} from 'payload'\n\nimport type {WorkflowsPluginConfig} from \"./config-types.js\"\n\nimport {createWorkflowCollection} from '../collections/Workflow.js'\nimport {WorkflowRunsCollection} from '../collections/WorkflowRuns.js'\nimport {WorkflowExecutor} from '../core/workflow-executor.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\nimport {createCollectionTriggerHook} from \"./collection-hook.js\"\nimport {createGlobalTriggerHook} from \"./global-hook.js\"\n\nexport {getLogger} from './logger.js'\n\nconst applyCollectionsConfig = <T extends string>(pluginOptions: WorkflowsPluginConfig<T>, config: Config) => {\n // Add workflow collections\n if (!config.collections) {\n config.collections = []\n }\n\n config.collections.push(\n createWorkflowCollection(pluginOptions),\n WorkflowRunsCollection\n )\n}\n\ntype AnyHook =\n CollectionConfig['hooks'] extends infer H\n ? H extends Record<string, unknown>\n ? NonNullable<H[keyof H]> extends (infer U)[]\n ? U\n : never\n : never\n : never;\n\ntype HookArgs = Parameters<AnyHook>[0]\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\n if (config.collections && pluginOptions.collectionTriggers) {\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n continue\n }\n\n // Find the collection config that matches\n const collectionIndex = config.collections.findIndex(c => c.slug === collectionSlug)\n if (collectionIndex === -1) {\n logger.warn(`Collection '${collectionSlug}' not found in config.collections`)\n continue\n }\n\n const collection = config.collections[collectionIndex]\n\n // Initialize hooks if needed\n if (!collection.hooks) {\n collection.hooks = {}\n }\n\n // Determine which hooks to register based on config\n const hooksToRegister = triggerConfig === true\n ? {\n afterChange: true,\n afterDelete: true,\n afterRead: true,\n }\n : triggerConfig\n\n // Register each configured hook\n Object.entries(hooksToRegister).forEach(([hookName, enabled]) => {\n if (!enabled) {\n return\n }\n\n const hookKey = hookName as keyof typeof collection.hooks\n\n // Initialize the hook array if needed\n if (!collection.hooks![hookKey]) {\n collection.hooks![hookKey] = []\n }\n\n // Create the automation hook for this specific collection and hook type\n const automationHook = createCollectionTriggerHook(collectionSlug, hookKey)\n\n // Mark it for debugging\n Object.defineProperty(automationHook, '__isAutomationHook', {\n value: true,\n enumerable: false\n })\n Object.defineProperty(automationHook, '__hookType', {\n value: hookKey,\n enumerable: false\n })\n\n // Add the hook to the collection\n ;(collection.hooks![hookKey] as Array<unknown>).push(automationHook)\n\n logger.debug(`Registered ${hookKey} hook for collection '${collectionSlug}'`)\n })\n }\n }\n\n // Handle global triggers similarly to collection triggers\n if (config.globals && pluginOptions.globalTriggers) {\n for (const [globalSlug, triggerConfig] of Object.entries(pluginOptions.globalTriggers)) {\n if (!triggerConfig) {\n continue\n }\n\n // Find the global config that matches\n const globalIndex = config.globals.findIndex(g => g.slug === globalSlug)\n if (globalIndex === -1) {\n logger.warn(`Global '${globalSlug}' not found in config.globals`)\n continue\n }\n\n const global = config.globals[globalIndex]\n\n // Initialize hooks if needed\n if (!global.hooks) {\n global.hooks = {}\n }\n\n // Determine which hooks to register based on config\n const hooksToRegister = triggerConfig === true\n ? {\n afterChange: true,\n afterRead: true,\n }\n : triggerConfig\n\n // Register each configured hook\n Object.entries(hooksToRegister).forEach(([hookName, enabled]) => {\n if (!enabled) {\n return\n }\n\n const hookKey = hookName as keyof typeof global.hooks\n\n // Initialize the hook array if needed\n if (!global.hooks![hookKey]) {\n global.hooks![hookKey] = []\n }\n\n // Create the automation hook for this specific global and hook type\n const automationHook = createGlobalTriggerHook(globalSlug, hookKey)\n\n // Mark it for debugging\n Object.defineProperty(automationHook, '__isAutomationHook', {\n value: true,\n enumerable: false\n })\n Object.defineProperty(automationHook, '__hookType', {\n value: hookKey,\n enumerable: false\n })\n\n // Add the hook to the global\n ;(global.hooks![hookKey] as Array<unknown>).push(automationHook)\n\n logger.debug(`Registered ${hookKey} hook for global '${globalSlug}'`)\n })\n }\n }\n\n if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n for (const step of pluginOptions.steps) {\n if (!config.jobs?.tasks?.find(task => task.slug === step.slug)) {\n config.jobs?.tasks?.push(step)\n }\n }\n\n\n // Set up onInit to initialize features\n const incomingOnInit = config.onInit\n config.onInit = async (payload) => {\n // Execute any existing onInit functions first\n if (incomingOnInit) {\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${Object.keys(pluginOptions.globalTriggers || {}).length} global triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n logger.info('Plugin initialized successfully - all hooks registered')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","getConfigLogger","initializeLogger","createCollectionTriggerHook","createGlobalTriggerHook","getLogger","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","logger","collectionTriggers","collectionSlug","triggerConfig","Object","entries","collectionIndex","findIndex","c","slug","warn","collection","hooks","hooksToRegister","afterChange","afterDelete","afterRead","forEach","hookName","hookKey","automationHook","defineProperty","value","enumerable","debug","globals","globalTriggers","globalSlug","globalIndex","g","global","jobs","tasks","step","steps","find","task","incomingOnInit","onInit","payload","info","keys","length"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {CollectionConfig, Config} from 'payload'\n\nimport type {WorkflowsPluginConfig} from \"./config-types.js\"\n\nimport {createWorkflowCollection} from '../collections/Workflow.js'\nimport {WorkflowRunsCollection} from '../collections/WorkflowRuns.js'\nimport {WorkflowExecutor} from '../core/workflow-executor.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\nimport {createCollectionTriggerHook} from \"./collection-hook.js\"\nimport {createGlobalTriggerHook} from \"./global-hook.js\"\n\nexport {getLogger} from './logger.js'\n\nconst applyCollectionsConfig = <T extends string>(pluginOptions: WorkflowsPluginConfig<T>, config: Config) => {\n // Add workflow collections\n if (!config.collections) {\n config.collections = []\n }\n\n config.collections.push(\n createWorkflowCollection(pluginOptions),\n WorkflowRunsCollection\n )\n}\n\ntype AnyHook =\n CollectionConfig['hooks'] extends infer H\n ? H extends Record<string, unknown>\n ? NonNullable<H[keyof H]> extends (infer U)[]\n ? U\n : never\n : never\n : never;\n\ntype HookArgs = Parameters<AnyHook>[0]\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\n if (config.collections && pluginOptions.collectionTriggers) {\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n continue\n }\n\n // Find the collection config that matches\n const collectionIndex = config.collections.findIndex(c => c.slug === collectionSlug)\n if (collectionIndex === -1) {\n logger.warn(`Collection '${collectionSlug}' not found in config.collections`)\n continue\n }\n\n const collection = config.collections[collectionIndex]\n\n // Initialize hooks if needed\n if (!collection.hooks) {\n collection.hooks = {}\n }\n\n // Determine which hooks to register based on config\n const hooksToRegister = triggerConfig === true\n ? {\n afterChange: true,\n afterDelete: true,\n afterRead: true,\n }\n : triggerConfig\n\n // Register each configured hook\n Object.entries(hooksToRegister).forEach(([hookName, enabled]) => {\n if (!enabled) {\n return\n }\n\n const hookKey = hookName as keyof typeof collection.hooks\n\n // Initialize the hook array if needed\n if (!collection.hooks![hookKey]) {\n collection.hooks![hookKey] = []\n }\n\n // Create the automation hook for this specific collection and hook type\n const automationHook = createCollectionTriggerHook(collectionSlug, hookKey)\n\n // Mark it for debugging\n Object.defineProperty(automationHook, '__isAutomationHook', {\n value: true,\n enumerable: false\n })\n Object.defineProperty(automationHook, '__hookType', {\n value: hookKey,\n enumerable: false\n })\n\n // Add the hook to the collection\n ;(collection.hooks![hookKey] as Array<unknown>).push(automationHook)\n\n logger.debug(`Registered ${hookKey} hook for collection '${collectionSlug}'`)\n })\n }\n }\n\n // Handle global triggers similarly to collection triggers\n if (config.globals && pluginOptions.globalTriggers) {\n for (const [globalSlug, triggerConfig] of Object.entries(pluginOptions.globalTriggers)) {\n if (!triggerConfig) {\n continue\n }\n\n // Find the global config that matches\n const globalIndex = config.globals.findIndex(g => g.slug === globalSlug)\n if (globalIndex === -1) {\n logger.warn(`Global '${globalSlug}' not found in config.globals`)\n continue\n }\n\n const global = config.globals[globalIndex]\n\n // Initialize hooks if needed\n if (!global.hooks) {\n global.hooks = {}\n }\n\n // Determine which hooks to register based on config\n const hooksToRegister = triggerConfig === true\n ? {\n afterChange: true,\n afterRead: true,\n }\n : triggerConfig\n\n // Register each configured hook\n Object.entries(hooksToRegister).forEach(([hookName, enabled]) => {\n if (!enabled) {\n return\n }\n\n const hookKey = hookName as keyof typeof global.hooks\n\n // Initialize the hook array if needed\n if (!global.hooks![hookKey]) {\n global.hooks![hookKey] = []\n }\n\n // Create the automation hook for this specific global and hook type\n const automationHook = createGlobalTriggerHook(globalSlug, hookKey)\n\n // Mark it for debugging\n Object.defineProperty(automationHook, '__isAutomationHook', {\n value: true,\n enumerable: false\n })\n Object.defineProperty(automationHook, '__hookType', {\n value: hookKey,\n enumerable: false\n })\n\n // Add the hook to the global\n ;(global.hooks![hookKey] as Array<unknown>).push(automationHook)\n\n logger.debug(`Registered ${hookKey} hook for global '${globalSlug}'`)\n })\n }\n }\n\n if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n for (const step of pluginOptions.steps) {\n if (!config.jobs?.tasks?.find(task => task.slug === step.slug)) {\n config.jobs?.tasks?.push(step)\n }\n }\n\n\n // Set up onInit to initialize features\n const incomingOnInit = config.onInit\n config.onInit = async (payload) => {\n // Execute any existing onInit functions first\n if (incomingOnInit) {\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${Object.keys(pluginOptions.globalTriggers || {}).length} global triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n // Seed workflows if configured\n if (pluginOptions.seedWorkflows && pluginOptions.seedWorkflows.length > 0) {\n logger.info(`Seeding ${pluginOptions.seedWorkflows.length} workflows...`)\n\n for (const seedWorkflow of pluginOptions.seedWorkflows) {\n try {\n // Check if workflow already exists by slug\n const existingWorkflow = await payload.find({\n collection: 'workflows',\n where: {\n slug: {\n equals: seedWorkflow.slug,\n },\n },\n limit: 1,\n })\n\n if (existingWorkflow.docs.length > 0) {\n const existing = existingWorkflow.docs[0]\n\n // Detect changes by comparing workflow definition\n const stepsChanged = JSON.stringify(existing.steps) !== JSON.stringify(seedWorkflow.steps)\n const triggersChanged = JSON.stringify(existing.triggers) !== JSON.stringify(seedWorkflow.triggers)\n const nameChanged = existing.name !== seedWorkflow.name\n const descriptionChanged = existing.description !== seedWorkflow.description\n\n const hasChanges = stepsChanged || triggersChanged || nameChanged || descriptionChanged\n\n if (hasChanges) {\n logger.info(`Updating seeded workflow '${seedWorkflow.slug}': ${seedWorkflow.name}`)\n\n await payload.update({\n collection: 'workflows',\n id: existing.id,\n data: {\n ...seedWorkflow,\n readOnly: true,\n },\n })\n\n logger.info(`Updated workflow: ${seedWorkflow.name}`)\n } else {\n logger.debug(`Workflow '${seedWorkflow.slug}' is up to date, skipping`)\n }\n } else {\n // Create the workflow as read-only\n await payload.create({\n collection: 'workflows',\n data: {\n ...seedWorkflow,\n readOnly: true,\n },\n })\n\n logger.info(`Seeded workflow: ${seedWorkflow.name}`)\n }\n } catch (error) {\n logger.error(`Failed to seed workflow '${seedWorkflow.name}':`, error)\n }\n }\n }\n\n logger.info('Plugin initialized successfully - all hooks registered')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","getConfigLogger","initializeLogger","createCollectionTriggerHook","createGlobalTriggerHook","getLogger","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","logger","collectionTriggers","collectionSlug","triggerConfig","Object","entries","collectionIndex","findIndex","c","slug","warn","collection","hooks","hooksToRegister","afterChange","afterDelete","afterRead","forEach","hookName","hookKey","automationHook","defineProperty","value","enumerable","debug","globals","globalTriggers","globalSlug","globalIndex","g","global","jobs","tasks","step","steps","find","task","incomingOnInit","onInit","payload","info","keys","length","seedWorkflows","seedWorkflow","existingWorkflow","where","equals","limit","docs","existing","stepsChanged","JSON","stringify","triggersChanged","triggers","nameChanged","name","descriptionChanged","description","hasChanges","update","id","data","readOnly","create","error"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Payload } from 'payload';
2
+ /**
3
+ * Get a logger for config-time use (before Payload initialization)
4
+ */
5
+ export declare function getConfigLogger(): {
6
+ debug: <T>(message: string, ...args: T[]) => void;
7
+ error: <T>(message: string, ...args: T[]) => void;
8
+ info: <T>(message: string, ...args: T[]) => void;
9
+ warn: <T>(message: string, ...args: T[]) => void;
10
+ };
11
+ /**
12
+ * Initialize the plugin logger using Payload's Pino instance
13
+ * This creates a child logger with plugin identification
14
+ */
15
+ export declare function initializeLogger(payload: Payload): Payload['logger'];
16
+ /**
17
+ * Get the plugin logger instance
18
+ * Throws error if not initialized
19
+ */
20
+ export declare function getLogger(): Payload['logger'];
@@ -0,0 +1,2 @@
1
+ import type { TaskHandler } from "payload";
2
+ export declare const createDocumentHandler: TaskHandler<'create-document'>;
@@ -0,0 +1,46 @@
1
+ export declare const CreateDocumentStepTask: {
2
+ slug: "create-document";
3
+ handler: import("payload").TaskHandler<"create-document">;
4
+ inputSchema: ({
5
+ name: string;
6
+ type: "text";
7
+ admin: {
8
+ description: string;
9
+ };
10
+ required: true;
11
+ } | {
12
+ name: string;
13
+ type: "json";
14
+ admin: {
15
+ description: string;
16
+ };
17
+ required: true;
18
+ } | {
19
+ name: string;
20
+ type: "checkbox";
21
+ admin: {
22
+ description: string;
23
+ };
24
+ required?: undefined;
25
+ } | {
26
+ name: string;
27
+ type: "text";
28
+ admin: {
29
+ description: string;
30
+ };
31
+ required?: undefined;
32
+ })[];
33
+ outputSchema: ({
34
+ name: string;
35
+ type: "json";
36
+ admin: {
37
+ description: string;
38
+ };
39
+ } | {
40
+ name: string;
41
+ type: "text";
42
+ admin: {
43
+ description: string;
44
+ };
45
+ })[];
46
+ };
@@ -0,0 +1,2 @@
1
+ import type { TaskHandler } from "payload";
2
+ export declare const deleteDocumentHandler: TaskHandler<'delete-document'>;
@@ -0,0 +1,39 @@
1
+ export declare const DeleteDocumentStepTask: {
2
+ slug: "delete-document";
3
+ handler: import("payload").TaskHandler<"delete-document">;
4
+ inputSchema: ({
5
+ name: string;
6
+ type: "text";
7
+ admin: {
8
+ description: string;
9
+ };
10
+ required: true;
11
+ } | {
12
+ name: string;
13
+ type: "text";
14
+ admin: {
15
+ description: string;
16
+ };
17
+ required?: undefined;
18
+ } | {
19
+ name: string;
20
+ type: "json";
21
+ admin: {
22
+ description: string;
23
+ };
24
+ required?: undefined;
25
+ })[];
26
+ outputSchema: ({
27
+ name: string;
28
+ type: "json";
29
+ admin: {
30
+ description: string;
31
+ };
32
+ } | {
33
+ name: string;
34
+ type: "number";
35
+ admin: {
36
+ description: string;
37
+ };
38
+ })[];
39
+ };
@@ -0,0 +1,2 @@
1
+ import type { TaskHandler } from "payload";
2
+ export declare const httpStepHandler: TaskHandler<'http-request-step'>;