@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.
- package/README.md +76 -160
- package/dist/collections/Workflow.d.ts +3 -0
- package/dist/collections/Workflow.js +46 -2
- package/dist/collections/Workflow.js.map +1 -1
- package/dist/collections/WorkflowRuns.d.ts +2 -0
- package/dist/components/ErrorDisplay.d.ts +9 -0
- package/dist/components/ReadOnlyBanner.d.ts +2 -0
- package/dist/components/ReadOnlyBanner.js +67 -0
- package/dist/components/ReadOnlyBanner.js.map +1 -0
- package/dist/components/StatusCell.d.ts +6 -0
- package/dist/components/WorkflowBuilder/StepConfigurationForm.d.ts +34 -0
- package/dist/components/WorkflowBuilder/WorkflowBuilder.d.ts +40 -0
- package/dist/components/WorkflowBuilder/WorkflowToolbar.d.ts +14 -0
- package/dist/components/WorkflowBuilder/index.d.ts +4 -0
- package/dist/components/WorkflowBuilder/nodes/StepNode.d.ts +3 -0
- package/dist/core/trigger-custom-workflow.d.ts +52 -0
- package/dist/core/workflow-executor.d.ts +90 -0
- package/dist/exports/client.d.ts +3 -0
- package/dist/exports/client.js +2 -1
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/fields.d.ts +1 -0
- package/dist/exports/rsc.d.ts +1 -0
- package/dist/exports/server.d.ts +5 -0
- package/dist/exports/views.d.ts +1 -0
- package/dist/fields/WorkflowBuilderField.d.ts +7 -0
- package/dist/fields/parameter.d.ts +4 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin/collection-hook.d.ts +1 -0
- package/dist/plugin/config-types.d.ts +36 -0
- package/dist/plugin/config-types.js.map +1 -1
- package/dist/plugin/global-hook.d.ts +1 -0
- package/dist/plugin/index.d.ts +4 -0
- package/dist/plugin/index.js +53 -0
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/logger.d.ts +20 -0
- package/dist/steps/create-document-handler.d.ts +2 -0
- package/dist/steps/create-document.d.ts +46 -0
- package/dist/steps/delete-document-handler.d.ts +2 -0
- package/dist/steps/delete-document.d.ts +39 -0
- package/dist/steps/http-request-handler.d.ts +2 -0
- package/dist/steps/http-request.d.ts +155 -0
- package/dist/steps/index.d.ts +12 -0
- package/dist/steps/read-document-handler.d.ts +2 -0
- package/dist/steps/read-document.d.ts +46 -0
- package/dist/steps/send-email-handler.d.ts +2 -0
- package/dist/steps/send-email.d.ts +44 -0
- package/dist/steps/update-document-handler.d.ts +2 -0
- package/dist/steps/update-document.d.ts +46 -0
- package/dist/triggers/collection-trigger.d.ts +2 -0
- package/dist/triggers/global-trigger.d.ts +2 -0
- package/dist/triggers/index.d.ts +2 -0
- package/dist/triggers/types.d.ts +5 -0
- package/dist/types/index.d.ts +24 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- 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
|
+
}
|
package/dist/exports/client.js
CHANGED
|
@@ -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';
|
|
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,
|
|
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 {};
|
package/dist/index.d.ts
ADDED
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,
|
|
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":"
|
|
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;
|
package/dist/plugin/index.js
CHANGED
|
@@ -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;
|
package/dist/plugin/index.js.map
CHANGED
|
@@ -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,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,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
|
+
};
|