@xtr-dev/payload-automation 0.0.15 → 0.0.16

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.
@@ -16,8 +16,6 @@ const applyCollectionsConfig = (pluginOptions, config)=>{
16
16
  }
17
17
  config.collections.push(createWorkflowCollection(pluginOptions), WorkflowRunsCollection);
18
18
  };
19
- // Track if hooks have been initialized to prevent double registration
20
- let hooksInitialized = false;
21
19
  export const workflowsPlugin = (pluginOptions)=>(config)=>{
22
20
  // If the plugin is disabled, return config unchanged
23
21
  if (pluginOptions.enabled === false) {
@@ -46,12 +44,7 @@ export const workflowsPlugin = (pluginOptions)=>(config)=>{
46
44
  // Set up onInit to register collection hooks and initialize features
47
45
  const incomingOnInit = config.onInit;
48
46
  config.onInit = async (payload)=>{
49
- configLogger.info(`onInit called - hooks already initialized: ${hooksInitialized}, collections: ${Object.keys(payload.collections).length}`);
50
- // Prevent double initialization in dev mode
51
- if (hooksInitialized) {
52
- configLogger.warn('Hooks already initialized, skipping to prevent duplicate registration');
53
- return;
54
- }
47
+ configLogger.info(`onInit called - collections: ${Object.keys(payload.collections).length}`);
55
48
  // Execute any existing onInit functions first
56
49
  if (incomingOnInit) {
57
50
  configLogger.debug('Executing existing onInit function');
@@ -77,7 +70,6 @@ export const workflowsPlugin = (pluginOptions)=>(config)=>{
77
70
  logger.info('Registering cron jobs...');
78
71
  await registerCronJobs(payload, logger);
79
72
  logger.info('Plugin initialized successfully - all hooks registered');
80
- hooksInitialized = true;
81
73
  };
82
74
  return config;
83
75
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {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 {generateCronTasks, registerCronJobs} from './cron-scheduler.js'\nimport {initCollectionHooks} from \"./init-collection-hooks.js\"\nimport {initGlobalHooks} from \"./init-global-hooks.js\"\nimport {initStepTasks} from \"./init-step-tasks.js\"\nimport {initWebhookEndpoint} from \"./init-webhook.js\"\nimport {initWorkflowHooks} from './init-workflow-hooks.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport {getLogger} from './logger.js'\n\nconst applyCollectionsConfig = <T extends string>(pluginOptions: WorkflowsPluginConfig<T>, config: Config) => {\n // Add workflow collections\n if (!config.collections) {\n config.collections = []\n }\n\n config.collections.push(\n createWorkflowCollection(pluginOptions),\n WorkflowRunsCollection\n )\n}\n\n// Track if hooks have been initialized to prevent double registration\nlet hooksInitialized = false\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 if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n const configLogger = getConfigLogger()\n configLogger.info(`Configuring workflow plugin with ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers`)\n\n // Generate cron tasks for workflows with cron triggers\n generateCronTasks(config)\n\n for (const step of pluginOptions.steps) {\n if (!config.jobs?.tasks?.find(task => task.slug === step.slug)) {\n configLogger.debug(`Registering task: ${step.slug}`)\n config.jobs?.tasks?.push(step)\n } else {\n configLogger.debug(`Task ${step.slug} already registered, skipping`)\n }\n }\n\n // Initialize webhook endpoint\n initWebhookEndpoint(config, pluginOptions.webhookPrefix || 'webhook')\n\n // Set up onInit to register collection hooks and initialize features\n const incomingOnInit = config.onInit\n config.onInit = async (payload) => {\n configLogger.info(`onInit called - hooks already initialized: ${hooksInitialized}, collections: ${Object.keys(payload.collections).length}`)\n \n // Prevent double initialization in dev mode\n if (hooksInitialized) {\n configLogger.warn('Hooks already initialized, skipping to prevent duplicate registration')\n return\n }\n \n // Execute any existing onInit functions first\n if (incomingOnInit) {\n configLogger.debug('Executing existing onInit function')\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log collection trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n // Create workflow executor instance\n const executor = new WorkflowExecutor(payload, logger)\n\n // Initialize hooks\n logger.info('Initializing collection hooks...')\n initCollectionHooks(pluginOptions, payload, logger, executor)\n \n logger.info('Initializing global hooks...')\n initGlobalHooks(payload, logger, executor)\n \n logger.info('Initializing workflow hooks...')\n initWorkflowHooks(payload, logger)\n \n logger.info('Initializing step tasks...')\n initStepTasks(pluginOptions, payload, logger)\n\n // Register cron jobs for workflows with cron triggers\n logger.info('Registering cron jobs...')\n await registerCronJobs(payload, logger)\n\n logger.info('Plugin initialized successfully - all hooks registered')\n hooksInitialized = true\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","WorkflowExecutor","generateCronTasks","registerCronJobs","initCollectionHooks","initGlobalHooks","initStepTasks","initWebhookEndpoint","initWorkflowHooks","getConfigLogger","initializeLogger","getLogger","applyCollectionsConfig","pluginOptions","config","collections","push","hooksInitialized","workflowsPlugin","enabled","jobs","tasks","configLogger","info","Object","keys","collectionTriggers","length","step","steps","find","task","slug","debug","webhookPrefix","incomingOnInit","onInit","payload","warn","logger","executor"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {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 {generateCronTasks, registerCronJobs} from './cron-scheduler.js'\nimport {initCollectionHooks} from \"./init-collection-hooks.js\"\nimport {initGlobalHooks} from \"./init-global-hooks.js\"\nimport {initStepTasks} from \"./init-step-tasks.js\"\nimport {initWebhookEndpoint} from \"./init-webhook.js\"\nimport {initWorkflowHooks} from './init-workflow-hooks.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport {getLogger} from './logger.js'\n\nconst applyCollectionsConfig = <T extends string>(pluginOptions: WorkflowsPluginConfig<T>, config: Config) => {\n // Add workflow collections\n if (!config.collections) {\n config.collections = []\n }\n\n config.collections.push(\n createWorkflowCollection(pluginOptions),\n WorkflowRunsCollection\n )\n}\n\n\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 if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n const configLogger = getConfigLogger()\n configLogger.info(`Configuring workflow plugin with ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers`)\n\n // Generate cron tasks for workflows with cron triggers\n generateCronTasks(config)\n\n for (const step of pluginOptions.steps) {\n if (!config.jobs?.tasks?.find(task => task.slug === step.slug)) {\n configLogger.debug(`Registering task: ${step.slug}`)\n config.jobs?.tasks?.push(step)\n } else {\n configLogger.debug(`Task ${step.slug} already registered, skipping`)\n }\n }\n\n // Initialize webhook endpoint\n initWebhookEndpoint(config, pluginOptions.webhookPrefix || 'webhook')\n\n // Set up onInit to register collection hooks and initialize features\n const incomingOnInit = config.onInit\n config.onInit = async (payload) => {\n configLogger.info(`onInit called - collections: ${Object.keys(payload.collections).length}`)\n \n // Execute any existing onInit functions first\n if (incomingOnInit) {\n configLogger.debug('Executing existing onInit function')\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log collection trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n // Create workflow executor instance\n const executor = new WorkflowExecutor(payload, logger)\n\n // Initialize hooks\n logger.info('Initializing collection hooks...')\n initCollectionHooks(pluginOptions, payload, logger, executor)\n \n logger.info('Initializing global hooks...')\n initGlobalHooks(payload, logger, executor)\n \n logger.info('Initializing workflow hooks...')\n initWorkflowHooks(payload, logger)\n \n logger.info('Initializing step tasks...')\n initStepTasks(pluginOptions, payload, logger)\n\n // Register cron jobs for workflows with cron triggers\n logger.info('Registering cron jobs...')\n await registerCronJobs(payload, logger)\n\n logger.info('Plugin initialized successfully - all hooks registered')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","WorkflowExecutor","generateCronTasks","registerCronJobs","initCollectionHooks","initGlobalHooks","initStepTasks","initWebhookEndpoint","initWorkflowHooks","getConfigLogger","initializeLogger","getLogger","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","jobs","tasks","configLogger","info","Object","keys","collectionTriggers","length","step","steps","find","task","slug","debug","webhookPrefix","incomingOnInit","onInit","payload","logger","executor"],"mappings":"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"}
@@ -29,12 +29,30 @@ export function initCollectionHooks(pluginOptions, payload, logger, executor) {
29
29
  collection.config.hooks.afterChange = collection.config.hooks.afterChange || [];
30
30
  collection.config.hooks.afterChange.push(async (change)=>{
31
31
  const operation = change.operation;
32
- logger.debug({
32
+ logger.info({
33
33
  slug: change.collection.slug,
34
- operation
35
- }, 'Collection hook triggered');
36
- // Execute workflows for this trigger
37
- await executor.executeTriggeredWorkflows(change.collection.slug, operation, change.doc, change.previousDoc, change.req);
34
+ operation,
35
+ docId: change.doc?.id,
36
+ previousDocId: change.previousDoc?.id
37
+ }, 'AUTOMATION PLUGIN: Collection hook triggered');
38
+ try {
39
+ // Execute workflows for this trigger
40
+ await executor.executeTriggeredWorkflows(change.collection.slug, operation, change.doc, change.previousDoc, change.req);
41
+ logger.info({
42
+ slug: change.collection.slug,
43
+ operation,
44
+ docId: change.doc?.id
45
+ }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows completed successfully');
46
+ } catch (error) {
47
+ logger.error({
48
+ slug: change.collection.slug,
49
+ operation,
50
+ docId: change.doc?.id,
51
+ error: error instanceof Error ? error.message : 'Unknown error',
52
+ stack: error instanceof Error ? error.stack : undefined
53
+ }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed');
54
+ // Don't re-throw to avoid breaking other hooks
55
+ }
38
56
  });
39
57
  }
40
58
  if (crud.read) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugin/init-collection-hooks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type { WorkflowExecutor } from \"../core/workflow-executor.js\"\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initCollectionHooks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n \n if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {\n logger.warn('No collection triggers configured in plugin options')\n return\n }\n\n logger.info({\n configuredCollections: Object.keys(pluginOptions.collectionTriggers),\n availableCollections: Object.keys(payload.collections)\n }, 'Starting collection hook registration')\n\n // Add hooks to configured collections\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n logger.debug({collectionSlug}, 'Skipping collection with falsy trigger config')\n continue\n }\n\n const collection = payload.collections[collectionSlug as T]\n const crud: CollectionTriggerConfigCrud = triggerConfig === true ? {\n create: true,\n delete: true,\n read: true,\n update: true,\n } : triggerConfig\n\n if (!collection.config.hooks) {\n collection.config.hooks = {} as typeof collection.config.hooks\n }\n\n if (crud.update || crud.create) {\n collection.config.hooks.afterChange = collection.config.hooks.afterChange || []\n collection.config.hooks.afterChange.push(async (change) => {\n const operation = change.operation as 'create' | 'update'\n logger.debug({\n slug: change.collection.slug,\n operation,\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n operation,\n change.doc,\n change.previousDoc,\n change.req\n )\n })\n }\n\n if (crud.read) {\n collection.config.hooks.afterRead = collection.config.hooks.afterRead || []\n collection.config.hooks.afterRead.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'read',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'read',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (crud.delete) {\n collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || []\n collection.config.hooks.afterDelete.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'delete',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'delete',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (collection) {\n logger.info({\n collectionSlug,\n hooksRegistered: {\n afterChange: crud.update || crud.create,\n afterRead: crud.read,\n afterDelete: crud.delete\n }\n }, 'Collection hooks registered successfully')\n } else {\n logger.error({\n collectionSlug,\n availableCollections: Object.keys(payload.collections)\n }, 'Collection not found for trigger configuration - check collection slug spelling')\n }\n }\n}\n"],"names":["initCollectionHooks","pluginOptions","payload","logger","executor","collectionTriggers","Object","keys","length","warn","info","configuredCollections","availableCollections","collections","collectionSlug","triggerConfig","entries","debug","collection","crud","create","delete","read","update","config","hooks","afterChange","push","change","operation","slug","executeTriggeredWorkflows","doc","previousDoc","req","afterRead","undefined","afterDelete","hooksRegistered","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/plugin/init-collection-hooks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type { WorkflowExecutor } from \"../core/workflow-executor.js\"\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initCollectionHooks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n \n if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {\n logger.warn('No collection triggers configured in plugin options')\n return\n }\n\n logger.info({\n configuredCollections: Object.keys(pluginOptions.collectionTriggers),\n availableCollections: Object.keys(payload.collections)\n }, 'Starting collection hook registration')\n\n // Add hooks to configured collections\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n logger.debug({collectionSlug}, 'Skipping collection with falsy trigger config')\n continue\n }\n\n const collection = payload.collections[collectionSlug as T]\n const crud: CollectionTriggerConfigCrud = triggerConfig === true ? {\n create: true,\n delete: true,\n read: true,\n update: true,\n } : triggerConfig\n\n if (!collection.config.hooks) {\n collection.config.hooks = {} as typeof collection.config.hooks\n }\n\n if (crud.update || crud.create) {\n collection.config.hooks.afterChange = collection.config.hooks.afterChange || []\n collection.config.hooks.afterChange.push(async (change) => {\n const operation = change.operation as 'create' | 'update'\n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n previousDocId: change.previousDoc?.id,\n }, 'AUTOMATION PLUGIN: Collection hook triggered')\n\n try {\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n operation,\n change.doc,\n change.previousDoc,\n change.req\n )\n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id\n }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows completed successfully')\n } catch (error) {\n logger.error({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined\n }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed')\n // Don't re-throw to avoid breaking other hooks\n }\n })\n }\n\n if (crud.read) {\n collection.config.hooks.afterRead = collection.config.hooks.afterRead || []\n collection.config.hooks.afterRead.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'read',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'read',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (crud.delete) {\n collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || []\n collection.config.hooks.afterDelete.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'delete',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'delete',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (collection) {\n logger.info({\n collectionSlug,\n hooksRegistered: {\n afterChange: crud.update || crud.create,\n afterRead: crud.read,\n afterDelete: crud.delete\n }\n }, 'Collection hooks registered successfully')\n } else {\n logger.error({\n collectionSlug,\n availableCollections: Object.keys(payload.collections)\n }, 'Collection not found for trigger configuration - check collection slug spelling')\n }\n }\n}\n"],"names":["initCollectionHooks","pluginOptions","payload","logger","executor","collectionTriggers","Object","keys","length","warn","info","configuredCollections","availableCollections","collections","collectionSlug","triggerConfig","entries","debug","collection","crud","create","delete","read","update","config","hooks","afterChange","push","change","operation","slug","docId","doc","id","previousDocId","previousDoc","executeTriggeredWorkflows","req","error","Error","message","stack","undefined","afterRead","afterDelete","hooksRegistered"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xtr-dev/payload-automation",
3
- "version": "0.0.15",
3
+ "version": "0.0.16",
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",