@xtr-dev/payload-automation 0.0.35 → 0.0.37
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 +61 -0
- package/dist/collections/Workflow.js +30 -305
- package/dist/collections/Workflow.js.map +1 -1
- package/dist/components/ErrorDisplay.js +3 -3
- package/dist/components/ErrorDisplay.js.map +1 -1
- package/dist/core/workflow-executor.d.ts +33 -85
- package/dist/core/workflow-executor.js +136 -229
- package/dist/core/workflow-executor.js.map +1 -1
- package/dist/exports/client.d.ts +0 -2
- package/dist/exports/client.js +1 -3
- package/dist/exports/client.js.map +1 -1
- package/dist/fields/parameter.d.ts +4 -0
- package/dist/fields/parameter.js +32 -0
- package/dist/fields/parameter.js.map +1 -0
- package/dist/plugin/collection-hook.d.ts +1 -0
- package/dist/plugin/collection-hook.js +58 -0
- package/dist/plugin/collection-hook.js.map +1 -0
- package/dist/plugin/config-types.d.ts +14 -17
- package/dist/plugin/config-types.js.map +1 -1
- package/dist/plugin/global-hook.d.ts +1 -0
- package/dist/plugin/global-hook.js +83 -0
- package/dist/plugin/global-hook.js.map +1 -0
- package/dist/plugin/index.js +83 -206
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/logger.js +23 -7
- package/dist/plugin/logger.js.map +1 -1
- package/dist/test/workflow-executor.test.js +2 -2
- package/dist/test/workflow-executor.test.js.map +1 -1
- package/dist/triggers/collection-trigger.d.ts +2 -0
- package/dist/triggers/collection-trigger.js +36 -0
- package/dist/triggers/collection-trigger.js.map +1 -0
- package/dist/triggers/global-trigger.d.ts +2 -0
- package/dist/triggers/global-trigger.js +29 -0
- package/dist/triggers/global-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +2 -0
- package/dist/triggers/index.js +4 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/types.d.ts +5 -0
- package/dist/triggers/types.js +3 -0
- package/dist/triggers/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/TriggerWorkflowButton.d.ts +0 -7
- package/dist/components/TriggerWorkflowButton.js +0 -46
- package/dist/components/TriggerWorkflowButton.js.map +0 -1
- package/dist/components/WorkflowExecutionStatus.d.ts +0 -6
- package/dist/components/WorkflowExecutionStatus.js +0 -287
- package/dist/components/WorkflowExecutionStatus.js.map +0 -1
- package/dist/exports/helpers.d.ts +0 -25
- package/dist/exports/helpers.js +0 -28
- package/dist/exports/helpers.js.map +0 -1
- package/dist/plugin/cron-scheduler.d.ts +0 -32
- package/dist/plugin/cron-scheduler.js +0 -537
- package/dist/plugin/cron-scheduler.js.map +0 -1
- package/dist/plugin/init-collection-hooks.d.ts +0 -4
- package/dist/plugin/init-collection-hooks.js +0 -100
- package/dist/plugin/init-collection-hooks.js.map +0 -1
- package/dist/plugin/init-global-hooks.d.ts +0 -3
- package/dist/plugin/init-global-hooks.js +0 -83
- package/dist/plugin/init-global-hooks.js.map +0 -1
- package/dist/plugin/init-step-tasks.d.ts +0 -3
- package/dist/plugin/init-step-tasks.js +0 -22
- package/dist/plugin/init-step-tasks.js.map +0 -1
- package/dist/plugin/init-webhook.d.ts +0 -2
- package/dist/plugin/init-webhook.js +0 -163
- package/dist/plugin/init-webhook.js.map +0 -1
- package/dist/plugin/init-workflow-hooks.d.ts +0 -6
- package/dist/plugin/init-workflow-hooks.js +0 -46
- package/dist/plugin/init-workflow-hooks.js.map +0 -1
- package/dist/utils/trigger-helpers.d.ts +0 -60
- package/dist/utils/trigger-helpers.js +0 -130
- package/dist/utils/trigger-helpers.js.map +0 -1
- package/dist/utils/trigger-presets.d.ts +0 -24
- package/dist/utils/trigger-presets.js +0 -177
- package/dist/utils/trigger-presets.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/test/workflow-executor.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from 'vitest'\nimport { WorkflowExecutor } from '../core/workflow-executor.js'\nimport type { Payload } from 'payload'\n\ndescribe('WorkflowExecutor', () => {\n let mockPayload: Payload\n let mockLogger: any\n let executor: WorkflowExecutor\n\n beforeEach(() => {\n mockLogger = {\n info: vi.fn(),\n debug: vi.fn(),\n warn: vi.fn(),\n error: vi.fn()\n }\n\n mockPayload = {\n jobs: {\n queue: vi.fn().mockResolvedValue({ id: 'job-123' }),\n run: vi.fn().mockResolvedValue(undefined)\n },\n create: vi.fn(),\n update: vi.fn(),\n find: vi.fn()\n } as any\n\n executor = new WorkflowExecutor(mockPayload, mockLogger)\n })\n\n describe('resolveJSONPathValue', () => {\n it('should resolve simple JSONPath expressions', () => {\n const context = {\n trigger: {\n doc: { id: 'test-id', title: 'Test Title' }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveJSONPathValue('$.trigger.doc.id', context)\n expect(result).toBe('test-id')\n })\n\n it('should resolve nested JSONPath expressions', () => {\n const context = {\n trigger: {\n doc: { \n id: 'test-id',\n nested: { value: 'nested-value' }\n }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveJSONPathValue('$.trigger.doc.nested.value', context)\n expect(result).toBe('nested-value')\n })\n\n it('should return original value for non-JSONPath strings', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).resolveJSONPathValue('plain-string', context)\n expect(result).toBe('plain-string')\n })\n\n it('should handle missing JSONPath gracefully', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).resolveJSONPathValue('$.trigger.missing.field', context)\n expect(result).toBe('$.trigger.missing.field') // Should return original if resolution fails\n })\n })\n\n describe('resolveStepInput', () => {\n it('should resolve all JSONPath expressions in step config', () => {\n const config = {\n url: '$.trigger.webhook.url',\n message: 'Static message',\n data: {\n id: '$.trigger.doc.id',\n title: '$.trigger.doc.title'\n }\n }\n\n const context = {\n trigger: {\n doc: { id: 'doc-123', title: 'Doc Title' },\n webhook: { url: 'https://example.com/webhook' }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveStepInput(config, context)\n \n expect(result).toEqual({\n url: 'https://example.com/webhook',\n message: 'Static message',\n data: {\n id: 'doc-123',\n title: 'Doc Title'\n }\n })\n })\n\n it('should handle arrays with JSONPath expressions', () => {\n const config = {\n items: ['$.trigger.doc.id', 'static-value', '$.trigger.doc.title']\n }\n\n const context = {\n trigger: {\n doc: { id: 'doc-123', title: 'Doc Title' }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveStepInput(config, context)\n \n expect(result).toEqual({\n items: ['doc-123', 'static-value', 'Doc Title']\n })\n })\n })\n\n describe('resolveExecutionOrder', () => {\n it('should handle steps without dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request' },\n { name: 'step2', step: 'create-document' },\n { name: 'step3', step: 'http-request' }\n ]\n\n const result = (executor as any).resolveExecutionOrder(steps)\n \n expect(result).toHaveLength(1) // All in one batch\n expect(result[0]).toHaveLength(3) // All steps in first batch\n })\n\n it('should handle steps with dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request' },\n { name: 'step2', step: 'create-document', dependencies: ['step1'] },\n { name: 'step3', step: 'http-request', dependencies: ['step2'] }\n ]\n\n const result = (executor as any).resolveExecutionOrder(steps)\n \n expect(result).toHaveLength(3) // Three batches\n expect(result[0]).toHaveLength(1) // step1 first\n expect(result[1]).toHaveLength(1) // step2 second\n expect(result[2]).toHaveLength(1) // step3 third\n })\n\n it('should handle parallel execution with partial dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request' },\n { name: 'step2', step: 'create-document' },\n { name: 'step3', step: 'http-request', dependencies: ['step1'] },\n { name: 'step4', step: 'create-document', dependencies: ['step1'] }\n ]\n\n const result = (executor as any).resolveExecutionOrder(steps)\n \n expect(result).toHaveLength(2) // Two batches\n expect(result[0]).toHaveLength(2) // step1 and step2 in parallel\n expect(result[1]).toHaveLength(2) // step3 and step4 in parallel\n })\n\n it('should detect circular dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request', dependencies: ['step2'] },\n { name: 'step2', step: 'create-document', dependencies: ['step1'] }\n ]\n\n expect(() => {\n (executor as any).resolveExecutionOrder(steps)\n }).toThrow('Circular dependency detected')\n })\n })\n\n describe('evaluateCondition', () => {\n it('should evaluate simple equality conditions', () => {\n const context = {\n trigger: {\n doc: { status: 'published' }\n },\n steps: {}\n }\n\n const result = (executor as any).evaluateCondition('$.trigger.doc.status == \"published\"', context)\n expect(result).toBe(true)\n })\n\n it('should evaluate inequality conditions', () => {\n const context = {\n trigger: {\n doc: { count: 5 }\n },\n steps: {}\n }\n\n const result = (executor as any).evaluateCondition('$.trigger.doc.count > 3', context)\n expect(result).toBe(true)\n })\n\n it('should return false for invalid conditions', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).evaluateCondition('invalid condition syntax', context)\n expect(result).toBe(false)\n })\n\n it('should handle missing context gracefully', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).evaluateCondition('$.trigger.doc.status == \"published\"', context)\n expect(result).toBe(false) // Missing values should fail condition\n })\n })\n\n describe('safeSerialize', () => {\n it('should serialize simple objects', () => {\n const obj = { name: 'test', value: 123 }\n const result = (executor as any).safeSerialize(obj)\n expect(result).toBe('{\"name\":\"test\",\"value\":123}')\n })\n\n it('should handle circular references', () => {\n const obj: any = { name: 'test' }\n obj.self = obj // Create circular reference\n\n const result = (executor as any).safeSerialize(obj)\n expect(result).toContain('\"name\":\"test\"')\n expect(result).toContain('\"self\":\"[Circular]\"')\n })\n\n it('should handle undefined and null values', () => {\n const obj = { \n defined: 'value',\n undefined: undefined,\n null: null\n }\n \n const result = (executor as any).safeSerialize(obj)\n const parsed = JSON.parse(result)\n expect(parsed.defined).toBe('value')\n expect(parsed.null).toBe(null)\n expect(parsed).not.toHaveProperty('undefined') // undefined props are omitted\n })\n })\n\n describe('executeWorkflow', () => {\n it('should execute workflow with single step', async () => {\n const workflow = {\n id: 'test-workflow',\n steps: [\n {\n name: 'test-step',\n step: 'http-request-step',\n url: 'https://example.com',\n method: 'GET'\n }\n ]\n }\n \n const context = {\n trigger: { doc: { id: 'test-doc' } },\n steps: {}\n }\n\n // Mock step task\n const mockStepTask = {\n taskSlug: 'http-request-step',\n handler: vi.fn().mockResolvedValue({\n output: { status: 200, body: 'success' },\n state: 'succeeded'\n })\n }\n\n // Mock the step tasks registry\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = await (executor as any).executeWorkflow(workflow, context)\n\n expect(result.status).toBe('completed')\n expect(result.context.steps['test-step']).toBeDefined()\n expect(result.context.steps['test-step'].state).toBe('succeeded')\n expect(mockStepTask.handler).toHaveBeenCalledOnce()\n\n // Restore original step tasks\n ;(executor as any).stepTasks = originalStepTasks\n })\n\n it('should handle step execution failures', async () => {\n const workflow = {\n id: 'test-workflow',\n steps: [\n {\n name: 'failing-step',\n step: 'http-request-step',\n url: 'https://invalid-url',\n method: 'GET'\n }\n ]\n }\n \n const context = {\n trigger: { doc: { id: 'test-doc' } },\n steps: {}\n }\n\n // Mock failing step task\n const mockStepTask = {\n taskSlug: 'http-request-step',\n handler: vi.fn().mockRejectedValue(new Error('Network error'))\n }\n\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = await (executor as any).executeWorkflow(workflow, context)\n\n expect(result.status).toBe('failed')\n expect(result.error).toContain('Network error')\n expect(result.context.steps['failing-step']).toBeDefined()\n expect(result.context.steps['failing-step'].state).toBe('failed')\n\n ;(executor as any).stepTasks = originalStepTasks\n })\n\n it('should execute steps with dependencies in correct order', async () => {\n const workflow = {\n id: 'test-workflow',\n steps: [\n {\n name: 'step1',\n step: 'http-request-step',\n url: 'https://example.com/1',\n method: 'GET'\n },\n {\n name: 'step2',\n step: 'http-request-step',\n url: 'https://example.com/2',\n method: 'GET',\n dependencies: ['step1']\n },\n {\n name: 'step3',\n step: 'http-request-step',\n url: 'https://example.com/3',\n method: 'GET',\n dependencies: ['step1']\n }\n ]\n }\n \n const context = {\n trigger: { doc: { id: 'test-doc' } },\n steps: {}\n }\n\n const executionOrder: string[] = []\n const mockStepTask = {\n taskSlug: 'http-request-step',\n handler: vi.fn().mockImplementation(async ({ input }) => {\n executionOrder.push(input.stepName)\n return {\n output: { status: 200, body: 'success' },\n state: 'succeeded'\n }\n })\n }\n\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = await (executor as any).executeWorkflow(workflow, context)\n\n expect(result.status).toBe('completed')\n expect(executionOrder[0]).toBe('step1') // First step executed first\n expect(executionOrder.slice(1)).toContain('step2') // Dependent steps after\n expect(executionOrder.slice(1)).toContain('step3')\n\n ;(executor as any).stepTasks = originalStepTasks\n })\n })\n\n describe('findStepTask', () => {\n it('should find registered step task by slug', () => {\n const mockStepTask = {\n taskSlug: 'test-step',\n handler: vi.fn()\n }\n\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = (executor as any).findStepTask('test-step')\n expect(result).toBe(mockStepTask)\n\n ;(executor as any).stepTasks = originalStepTasks\n })\n\n it('should return undefined for unknown step type', () => {\n const result = (executor as any).findStepTask('unknown-step')\n expect(result).toBeUndefined()\n })\n })\n\n describe('validateStepConfiguration', () => {\n it('should validate step with required fields', () => {\n const step = {\n name: 'valid-step',\n step: 'http-request-step',\n url: 'https://example.com',\n method: 'GET'\n }\n\n expect(() => {\n (executor as any).validateStepConfiguration(step)\n }).not.toThrow()\n })\n\n it('should throw error for step without name', () => {\n const step = {\n step: 'http-request-step',\n url: 'https://example.com',\n method: 'GET'\n }\n\n expect(() => {\n (executor as any).validateStepConfiguration(step)\n }).toThrow('Step name is required')\n })\n\n it('should throw error for step without type', () => {\n const step = {\n name: 'test-step',\n url: 'https://example.com',\n method: 'GET'\n }\n\n expect(() => {\n (executor as any).validateStepConfiguration(step)\n }).toThrow('Step type is required')\n })\n })\n\n describe('createExecutionContext', () => {\n it('should create context with trigger data', () => {\n const triggerContext = {\n operation: 'create',\n doc: { id: 'test-id', title: 'Test Doc' },\n collection: 'posts'\n }\n\n const result = (executor as any).createExecutionContext(triggerContext)\n\n expect(result.trigger).toEqual(triggerContext)\n expect(result.steps).toEqual({})\n expect(result.metadata).toBeDefined()\n expect(result.metadata.startedAt).toBeDefined()\n })\n\n it('should include metadata in context', () => {\n const triggerContext = { doc: { id: 'test' } }\n const result = (executor as any).createExecutionContext(triggerContext)\n\n expect(result.metadata).toHaveProperty('startedAt')\n expect(result.metadata).toHaveProperty('executionId')\n expect(typeof result.metadata.executionId).toBe('string')\n })\n })\n})"],"names":["describe","it","expect","beforeEach","vi","WorkflowExecutor","mockPayload","mockLogger","executor","info","fn","debug","warn","error","jobs","queue","mockResolvedValue","id","run","undefined","create","update","find","context","trigger","doc","title","steps","result","resolveJSONPathValue","toBe","nested","value","config","url","message","data","webhook","resolveStepInput","toEqual","items","name","step","resolveExecutionOrder","toHaveLength","dependencies","toThrow","status","evaluateCondition","count","obj","safeSerialize","self","toContain","defined","null","parsed","JSON","parse","not","toHaveProperty","workflow","method","mockStepTask","taskSlug","handler","output","body","state","originalStepTasks","stepTasks","executeWorkflow","toBeDefined","toHaveBeenCalledOnce","mockRejectedValue","Error","executionOrder","mockImplementation","input","push","stepName","slice","findStepTask","toBeUndefined","validateStepConfiguration","triggerContext","operation","collection","createExecutionContext","metadata","startedAt","executionId"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,EAAE,QAAQ,SAAQ;AAC7D,SAASC,gBAAgB,QAAQ,+BAA8B;AAG/DL,SAAS,oBAAoB;IAC3B,IAAIM;IACJ,IAAIC;IACJ,IAAIC;IAEJL,WAAW;QACTI,aAAa;YACXE,MAAML,GAAGM,EAAE;YACXC,OAAOP,GAAGM,EAAE;YACZE,MAAMR,GAAGM,EAAE;YACXG,OAAOT,GAAGM,EAAE;QACd;QAEAJ,cAAc;YACZQ,MAAM;gBACJC,OAAOX,GAAGM,EAAE,GAAGM,iBAAiB,CAAC;oBAAEC,IAAI;gBAAU;gBACjDC,KAAKd,GAAGM,EAAE,GAAGM,iBAAiB,CAACG;YACjC;YACAC,QAAQhB,GAAGM,EAAE;YACbW,QAAQjB,GAAGM,EAAE;YACbY,MAAMlB,GAAGM,EAAE;QACb;QAEAF,WAAW,IAAIH,iBAAiBC,aAAaC;IAC/C;IAEAP,SAAS,wBAAwB;QAC/BC,GAAG,8CAA8C;YAC/C,MAAMsB,UAAU;gBACdC,SAAS;oBACPC,KAAK;wBAAER,IAAI;wBAAWS,OAAO;oBAAa;gBAC5C;gBACAC,OAAO,CAAC;YACV;YAEA,MAAMC,SAAS,AAACpB,SAAiBqB,oBAAoB,CAAC,oBAAoBN;YAC1ErB,OAAO0B,QAAQE,IAAI,CAAC;QACtB;QAEA7B,GAAG,8CAA8C;YAC/C,MAAMsB,UAAU;gBACdC,SAAS;oBACPC,KAAK;wBACHR,IAAI;wBACJc,QAAQ;4BAAEC,OAAO;wBAAe;oBAClC;gBACF;gBACAL,OAAO,CAAC;YACV;YAEA,MAAMC,SAAS,AAACpB,SAAiBqB,oBAAoB,CAAC,8BAA8BN;YACpFrB,OAAO0B,QAAQE,IAAI,CAAC;QACtB;QAEA7B,GAAG,yDAAyD;YAC1D,MAAMsB,UAAU;gBAAEC,SAAS,CAAC;gBAAGG,OAAO,CAAC;YAAE;YACzC,MAAMC,SAAS,AAACpB,SAAiBqB,oBAAoB,CAAC,gBAAgBN;YACtErB,OAAO0B,QAAQE,IAAI,CAAC;QACtB;QAEA7B,GAAG,6CAA6C;YAC9C,MAAMsB,UAAU;gBAAEC,SAAS,CAAC;gBAAGG,OAAO,CAAC;YAAE;YACzC,MAAMC,SAAS,AAACpB,SAAiBqB,oBAAoB,CAAC,2BAA2BN;YACjFrB,OAAO0B,QAAQE,IAAI,CAAC,4BAA2B,6CAA6C;QAC9F;IACF;IAEA9B,SAAS,oBAAoB;QAC3BC,GAAG,0DAA0D;YAC3D,MAAMgC,SAAS;gBACbC,KAAK;gBACLC,SAAS;gBACTC,MAAM;oBACJnB,IAAI;oBACJS,OAAO;gBACT;YACF;YAEA,MAAMH,UAAU;gBACdC,SAAS;oBACPC,KAAK;wBAAER,IAAI;wBAAWS,OAAO;oBAAY;oBACzCW,SAAS;wBAAEH,KAAK;oBAA8B;gBAChD;gBACAP,OAAO,CAAC;YACV;YAEA,MAAMC,SAAS,AAACpB,SAAiB8B,gBAAgB,CAACL,QAAQV;YAE1DrB,OAAO0B,QAAQW,OAAO,CAAC;gBACrBL,KAAK;gBACLC,SAAS;gBACTC,MAAM;oBACJnB,IAAI;oBACJS,OAAO;gBACT;YACF;QACF;QAEAzB,GAAG,kDAAkD;YACnD,MAAMgC,SAAS;gBACbO,OAAO;oBAAC;oBAAoB;oBAAgB;iBAAsB;YACpE;YAEA,MAAMjB,UAAU;gBACdC,SAAS;oBACPC,KAAK;wBAAER,IAAI;wBAAWS,OAAO;oBAAY;gBAC3C;gBACAC,OAAO,CAAC;YACV;YAEA,MAAMC,SAAS,AAACpB,SAAiB8B,gBAAgB,CAACL,QAAQV;YAE1DrB,OAAO0B,QAAQW,OAAO,CAAC;gBACrBC,OAAO;oBAAC;oBAAW;oBAAgB;iBAAY;YACjD;QACF;IACF;IAEAxC,SAAS,yBAAyB;QAChCC,GAAG,4CAA4C;YAC7C,MAAM0B,QAAQ;gBACZ;oBAAEc,MAAM;oBAASC,MAAM;gBAAe;gBACtC;oBAAED,MAAM;oBAASC,MAAM;gBAAkB;gBACzC;oBAAED,MAAM;oBAASC,MAAM;gBAAe;aACvC;YAED,MAAMd,SAAS,AAACpB,SAAiBmC,qBAAqB,CAAChB;YAEvDzB,OAAO0B,QAAQgB,YAAY,CAAC,IAAG,mBAAmB;YAClD1C,OAAO0B,MAAM,CAAC,EAAE,EAAEgB,YAAY,CAAC,IAAG,2BAA2B;QAC/D;QAEA3C,GAAG,yCAAyC;YAC1C,MAAM0B,QAAQ;gBACZ;oBAAEc,MAAM;oBAASC,MAAM;gBAAe;gBACtC;oBAAED,MAAM;oBAASC,MAAM;oBAAmBG,cAAc;wBAAC;qBAAQ;gBAAC;gBAClE;oBAAEJ,MAAM;oBAASC,MAAM;oBAAgBG,cAAc;wBAAC;qBAAQ;gBAAC;aAChE;YAED,MAAMjB,SAAS,AAACpB,SAAiBmC,qBAAqB,CAAChB;YAEvDzB,OAAO0B,QAAQgB,YAAY,CAAC,IAAG,gBAAgB;YAC/C1C,OAAO0B,MAAM,CAAC,EAAE,EAAEgB,YAAY,CAAC,IAAG,cAAc;YAChD1C,OAAO0B,MAAM,CAAC,EAAE,EAAEgB,YAAY,CAAC,IAAG,eAAe;YACjD1C,OAAO0B,MAAM,CAAC,EAAE,EAAEgB,YAAY,CAAC,IAAG,cAAc;QAClD;QAEA3C,GAAG,8DAA8D;YAC/D,MAAM0B,QAAQ;gBACZ;oBAAEc,MAAM;oBAASC,MAAM;gBAAe;gBACtC;oBAAED,MAAM;oBAASC,MAAM;gBAAkB;gBACzC;oBAAED,MAAM;oBAASC,MAAM;oBAAgBG,cAAc;wBAAC;qBAAQ;gBAAC;gBAC/D;oBAAEJ,MAAM;oBAASC,MAAM;oBAAmBG,cAAc;wBAAC;qBAAQ;gBAAC;aACnE;YAED,MAAMjB,SAAS,AAACpB,SAAiBmC,qBAAqB,CAAChB;YAEvDzB,OAAO0B,QAAQgB,YAAY,CAAC,IAAG,cAAc;YAC7C1C,OAAO0B,MAAM,CAAC,EAAE,EAAEgB,YAAY,CAAC,IAAG,8BAA8B;YAChE1C,OAAO0B,MAAM,CAAC,EAAE,EAAEgB,YAAY,CAAC,IAAG,8BAA8B;QAClE;QAEA3C,GAAG,uCAAuC;YACxC,MAAM0B,QAAQ;gBACZ;oBAAEc,MAAM;oBAASC,MAAM;oBAAgBG,cAAc;wBAAC;qBAAQ;gBAAC;gBAC/D;oBAAEJ,MAAM;oBAASC,MAAM;oBAAmBG,cAAc;wBAAC;qBAAQ;gBAAC;aACnE;YAED3C,OAAO;gBACJM,SAAiBmC,qBAAqB,CAAChB;YAC1C,GAAGmB,OAAO,CAAC;QACb;IACF;IAEA9C,SAAS,qBAAqB;QAC5BC,GAAG,8CAA8C;YAC/C,MAAMsB,UAAU;gBACdC,SAAS;oBACPC,KAAK;wBAAEsB,QAAQ;oBAAY;gBAC7B;gBACApB,OAAO,CAAC;YACV;YAEA,MAAMC,SAAS,AAACpB,SAAiBwC,iBAAiB,CAAC,uCAAuCzB;YAC1FrB,OAAO0B,QAAQE,IAAI,CAAC;QACtB;QAEA7B,GAAG,yCAAyC;YAC1C,MAAMsB,UAAU;gBACdC,SAAS;oBACPC,KAAK;wBAAEwB,OAAO;oBAAE;gBAClB;gBACAtB,OAAO,CAAC;YACV;YAEA,MAAMC,SAAS,AAACpB,SAAiBwC,iBAAiB,CAAC,2BAA2BzB;YAC9ErB,OAAO0B,QAAQE,IAAI,CAAC;QACtB;QAEA7B,GAAG,8CAA8C;YAC/C,MAAMsB,UAAU;gBAAEC,SAAS,CAAC;gBAAGG,OAAO,CAAC;YAAE;YACzC,MAAMC,SAAS,AAACpB,SAAiBwC,iBAAiB,CAAC,4BAA4BzB;YAC/ErB,OAAO0B,QAAQE,IAAI,CAAC;QACtB;QAEA7B,GAAG,4CAA4C;YAC7C,MAAMsB,UAAU;gBAAEC,SAAS,CAAC;gBAAGG,OAAO,CAAC;YAAE;YACzC,MAAMC,SAAS,AAACpB,SAAiBwC,iBAAiB,CAAC,uCAAuCzB;YAC1FrB,OAAO0B,QAAQE,IAAI,CAAC,QAAO,uCAAuC;QACpE;IACF;IAEA9B,SAAS,iBAAiB;QACxBC,GAAG,mCAAmC;YACpC,MAAMiD,MAAM;gBAAET,MAAM;gBAAQT,OAAO;YAAI;YACvC,MAAMJ,SAAS,AAACpB,SAAiB2C,aAAa,CAACD;YAC/ChD,OAAO0B,QAAQE,IAAI,CAAC;QACtB;QAEA7B,GAAG,qCAAqC;YACtC,MAAMiD,MAAW;gBAAET,MAAM;YAAO;YAChCS,IAAIE,IAAI,GAAGF,KAAI,4BAA4B;YAE3C,MAAMtB,SAAS,AAACpB,SAAiB2C,aAAa,CAACD;YAC/ChD,OAAO0B,QAAQyB,SAAS,CAAC;YACzBnD,OAAO0B,QAAQyB,SAAS,CAAC;QAC3B;QAEApD,GAAG,2CAA2C;YAC5C,MAAMiD,MAAM;gBACVI,SAAS;gBACTnC,WAAWA;gBACXoC,MAAM;YACR;YAEA,MAAM3B,SAAS,AAACpB,SAAiB2C,aAAa,CAACD;YAC/C,MAAMM,SAASC,KAAKC,KAAK,CAAC9B;YAC1B1B,OAAOsD,OAAOF,OAAO,EAAExB,IAAI,CAAC;YAC5B5B,OAAOsD,OAAOD,IAAI,EAAEzB,IAAI,CAAC;YACzB5B,OAAOsD,QAAQG,GAAG,CAACC,cAAc,CAAC,cAAa,8BAA8B;QAC/E;IACF;IAEA5D,SAAS,mBAAmB;QAC1BC,GAAG,4CAA4C;YAC7C,MAAM4D,WAAW;gBACf5C,IAAI;gBACJU,OAAO;oBACL;wBACEc,MAAM;wBACNC,MAAM;wBACNR,KAAK;wBACL4B,QAAQ;oBACV;iBACD;YACH;YAEA,MAAMvC,UAAU;gBACdC,SAAS;oBAAEC,KAAK;wBAAER,IAAI;oBAAW;gBAAE;gBACnCU,OAAO,CAAC;YACV;YAEA,iBAAiB;YACjB,MAAMoC,eAAe;gBACnBC,UAAU;gBACVC,SAAS7D,GAAGM,EAAE,GAAGM,iBAAiB,CAAC;oBACjCkD,QAAQ;wBAAEnB,QAAQ;wBAAKoB,MAAM;oBAAU;oBACvCC,OAAO;gBACT;YACF;YAEA,+BAA+B;YAC/B,MAAMC,oBAAoB,AAAC7D,SAAiB8D,SAAS;YACnD9D,SAAiB8D,SAAS,GAAG;gBAACP;aAAa;YAE7C,MAAMnC,SAAS,MAAM,AAACpB,SAAiB+D,eAAe,CAACV,UAAUtC;YAEjErB,OAAO0B,OAAOmB,MAAM,EAAEjB,IAAI,CAAC;YAC3B5B,OAAO0B,OAAOL,OAAO,CAACI,KAAK,CAAC,YAAY,EAAE6C,WAAW;YACrDtE,OAAO0B,OAAOL,OAAO,CAACI,KAAK,CAAC,YAAY,CAACyC,KAAK,EAAEtC,IAAI,CAAC;YACrD5B,OAAO6D,aAAaE,OAAO,EAAEQ,oBAAoB;YAG/CjE,SAAiB8D,SAAS,GAAGD;QACjC;QAEApE,GAAG,yCAAyC;YAC1C,MAAM4D,WAAW;gBACf5C,IAAI;gBACJU,OAAO;oBACL;wBACEc,MAAM;wBACNC,MAAM;wBACNR,KAAK;wBACL4B,QAAQ;oBACV;iBACD;YACH;YAEA,MAAMvC,UAAU;gBACdC,SAAS;oBAAEC,KAAK;wBAAER,IAAI;oBAAW;gBAAE;gBACnCU,OAAO,CAAC;YACV;YAEA,yBAAyB;YACzB,MAAMoC,eAAe;gBACnBC,UAAU;gBACVC,SAAS7D,GAAGM,EAAE,GAAGgE,iBAAiB,CAAC,IAAIC,MAAM;YAC/C;YAEA,MAAMN,oBAAoB,AAAC7D,SAAiB8D,SAAS;YACnD9D,SAAiB8D,SAAS,GAAG;gBAACP;aAAa;YAE7C,MAAMnC,SAAS,MAAM,AAACpB,SAAiB+D,eAAe,CAACV,UAAUtC;YAEjErB,OAAO0B,OAAOmB,MAAM,EAAEjB,IAAI,CAAC;YAC3B5B,OAAO0B,OAAOf,KAAK,EAAEwC,SAAS,CAAC;YAC/BnD,OAAO0B,OAAOL,OAAO,CAACI,KAAK,CAAC,eAAe,EAAE6C,WAAW;YACxDtE,OAAO0B,OAAOL,OAAO,CAACI,KAAK,CAAC,eAAe,CAACyC,KAAK,EAAEtC,IAAI,CAAC;YAEtDtB,SAAiB8D,SAAS,GAAGD;QACjC;QAEApE,GAAG,2DAA2D;YAC5D,MAAM4D,WAAW;gBACf5C,IAAI;gBACJU,OAAO;oBACL;wBACEc,MAAM;wBACNC,MAAM;wBACNR,KAAK;wBACL4B,QAAQ;oBACV;oBACA;wBACErB,MAAM;wBACNC,MAAM;wBACNR,KAAK;wBACL4B,QAAQ;wBACRjB,cAAc;4BAAC;yBAAQ;oBACzB;oBACA;wBACEJ,MAAM;wBACNC,MAAM;wBACNR,KAAK;wBACL4B,QAAQ;wBACRjB,cAAc;4BAAC;yBAAQ;oBACzB;iBACD;YACH;YAEA,MAAMtB,UAAU;gBACdC,SAAS;oBAAEC,KAAK;wBAAER,IAAI;oBAAW;gBAAE;gBACnCU,OAAO,CAAC;YACV;YAEA,MAAMiD,iBAA2B,EAAE;YACnC,MAAMb,eAAe;gBACnBC,UAAU;gBACVC,SAAS7D,GAAGM,EAAE,GAAGmE,kBAAkB,CAAC,OAAO,EAAEC,KAAK,EAAE;oBAClDF,eAAeG,IAAI,CAACD,MAAME,QAAQ;oBAClC,OAAO;wBACLd,QAAQ;4BAAEnB,QAAQ;4BAAKoB,MAAM;wBAAU;wBACvCC,OAAO;oBACT;gBACF;YACF;YAEA,MAAMC,oBAAoB,AAAC7D,SAAiB8D,SAAS;YACnD9D,SAAiB8D,SAAS,GAAG;gBAACP;aAAa;YAE7C,MAAMnC,SAAS,MAAM,AAACpB,SAAiB+D,eAAe,CAACV,UAAUtC;YAEjErB,OAAO0B,OAAOmB,MAAM,EAAEjB,IAAI,CAAC;YAC3B5B,OAAO0E,cAAc,CAAC,EAAE,EAAE9C,IAAI,CAAC,UAAS,4BAA4B;YACpE5B,OAAO0E,eAAeK,KAAK,CAAC,IAAI5B,SAAS,CAAC,UAAS,wBAAwB;YAC3EnD,OAAO0E,eAAeK,KAAK,CAAC,IAAI5B,SAAS,CAAC;YAExC7C,SAAiB8D,SAAS,GAAGD;QACjC;IACF;IAEArE,SAAS,gBAAgB;QACvBC,GAAG,4CAA4C;YAC7C,MAAM8D,eAAe;gBACnBC,UAAU;gBACVC,SAAS7D,GAAGM,EAAE;YAChB;YAEA,MAAM2D,oBAAoB,AAAC7D,SAAiB8D,SAAS;YACnD9D,SAAiB8D,SAAS,GAAG;gBAACP;aAAa;YAE7C,MAAMnC,SAAS,AAACpB,SAAiB0E,YAAY,CAAC;YAC9ChF,OAAO0B,QAAQE,IAAI,CAACiC;YAElBvD,SAAiB8D,SAAS,GAAGD;QACjC;QAEApE,GAAG,iDAAiD;YAClD,MAAM2B,SAAS,AAACpB,SAAiB0E,YAAY,CAAC;YAC9ChF,OAAO0B,QAAQuD,aAAa;QAC9B;IACF;IAEAnF,SAAS,6BAA6B;QACpCC,GAAG,6CAA6C;YAC9C,MAAMyC,OAAO;gBACXD,MAAM;gBACNC,MAAM;gBACNR,KAAK;gBACL4B,QAAQ;YACV;YAEA5D,OAAO;gBACJM,SAAiB4E,yBAAyB,CAAC1C;YAC9C,GAAGiB,GAAG,CAACb,OAAO;QAChB;QAEA7C,GAAG,4CAA4C;YAC7C,MAAMyC,OAAO;gBACXA,MAAM;gBACNR,KAAK;gBACL4B,QAAQ;YACV;YAEA5D,OAAO;gBACJM,SAAiB4E,yBAAyB,CAAC1C;YAC9C,GAAGI,OAAO,CAAC;QACb;QAEA7C,GAAG,4CAA4C;YAC7C,MAAMyC,OAAO;gBACXD,MAAM;gBACNP,KAAK;gBACL4B,QAAQ;YACV;YAEA5D,OAAO;gBACJM,SAAiB4E,yBAAyB,CAAC1C;YAC9C,GAAGI,OAAO,CAAC;QACb;IACF;IAEA9C,SAAS,0BAA0B;QACjCC,GAAG,2CAA2C;YAC5C,MAAMoF,iBAAiB;gBACrBC,WAAW;gBACX7D,KAAK;oBAAER,IAAI;oBAAWS,OAAO;gBAAW;gBACxC6D,YAAY;YACd;YAEA,MAAM3D,SAAS,AAACpB,SAAiBgF,sBAAsB,CAACH;YAExDnF,OAAO0B,OAAOJ,OAAO,EAAEe,OAAO,CAAC8C;YAC/BnF,OAAO0B,OAAOD,KAAK,EAAEY,OAAO,CAAC,CAAC;YAC9BrC,OAAO0B,OAAO6D,QAAQ,EAAEjB,WAAW;YACnCtE,OAAO0B,OAAO6D,QAAQ,CAACC,SAAS,EAAElB,WAAW;QAC/C;QAEAvE,GAAG,sCAAsC;YACvC,MAAMoF,iBAAiB;gBAAE5D,KAAK;oBAAER,IAAI;gBAAO;YAAE;YAC7C,MAAMW,SAAS,AAACpB,SAAiBgF,sBAAsB,CAACH;YAExDnF,OAAO0B,OAAO6D,QAAQ,EAAE7B,cAAc,CAAC;YACvC1D,OAAO0B,OAAO6D,QAAQ,EAAE7B,cAAc,CAAC;YACvC1D,OAAO,OAAO0B,OAAO6D,QAAQ,CAACE,WAAW,EAAE7D,IAAI,CAAC;QAClD;IACF;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../src/test/workflow-executor.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from 'vitest'\nimport { WorkflowExecutor } from '../core/workflow-executor.js'\nimport type { Payload } from 'payload'\n\ndescribe('WorkflowExecutor', () => {\n let mockPayload: Payload\n let mockLogger: any\n let executor: WorkflowExecutor\n\n beforeEach(() => {\n mockLogger = {\n info: vi.fn(),\n debug: vi.fn(),\n warn: vi.fn(),\n error: vi.fn()\n }\n\n mockPayload = {\n jobs: {\n queue: vi.fn().mockResolvedValue({ id: 'job-123' }),\n run: vi.fn().mockResolvedValue(undefined)\n },\n create: vi.fn(),\n update: vi.fn(),\n find: vi.fn()\n } as any\n\n executor = new WorkflowExecutor(mockPayload, mockLogger)\n })\n\n describe('resolveJSONPathValue', () => {\n it('should resolve simple JSONPath expressions', () => {\n const context = {\n trigger: {\n doc: { id: 'test-id', title: 'Test Title' }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveJSONPathValue('$.trigger.doc.id', context)\n expect(result).toBe('test-id')\n })\n\n it('should resolve nested JSONPath expressions', () => {\n const context = {\n trigger: {\n doc: { \n id: 'test-id',\n nested: { value: 'nested-value' }\n }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveJSONPathValue('$.trigger.doc.nested.value', context)\n expect(result).toBe('nested-value')\n })\n\n it('should return original value for non-JSONPath strings', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).resolveJSONPathValue('plain-string', context)\n expect(result).toBe('plain-string')\n })\n\n it('should handle missing JSONPath gracefully', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).resolveJSONPathValue('$.trigger.missing.field', context)\n expect(result).toBe('$.trigger.missing.field') // Should return original if resolution fails\n })\n })\n\n describe('resolveStepInput', () => {\n it('should resolve all JSONPath expressions in step config', () => {\n const config = {\n url: '$.trigger.data.url',\n message: 'Static message',\n data: {\n id: '$.trigger.doc.id',\n title: '$.trigger.doc.title'\n }\n }\n\n const context = {\n trigger: {\n doc: { id: 'doc-123', title: 'Doc Title' },\n data: { url: 'https://example.com/webhook' }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveStepInput(config, context)\n \n expect(result).toEqual({\n url: 'https://example.com/webhook',\n message: 'Static message',\n data: {\n id: 'doc-123',\n title: 'Doc Title'\n }\n })\n })\n\n it('should handle arrays with JSONPath expressions', () => {\n const config = {\n items: ['$.trigger.doc.id', 'static-value', '$.trigger.doc.title']\n }\n\n const context = {\n trigger: {\n doc: { id: 'doc-123', title: 'Doc Title' }\n },\n steps: {}\n }\n\n const result = (executor as any).resolveStepInput(config, context)\n \n expect(result).toEqual({\n items: ['doc-123', 'static-value', 'Doc Title']\n })\n })\n })\n\n describe('resolveExecutionOrder', () => {\n it('should handle steps without dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request' },\n { name: 'step2', step: 'create-document' },\n { name: 'step3', step: 'http-request' }\n ]\n\n const result = (executor as any).resolveExecutionOrder(steps)\n \n expect(result).toHaveLength(1) // All in one batch\n expect(result[0]).toHaveLength(3) // All steps in first batch\n })\n\n it('should handle steps with dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request' },\n { name: 'step2', step: 'create-document', dependencies: ['step1'] },\n { name: 'step3', step: 'http-request', dependencies: ['step2'] }\n ]\n\n const result = (executor as any).resolveExecutionOrder(steps)\n \n expect(result).toHaveLength(3) // Three batches\n expect(result[0]).toHaveLength(1) // step1 first\n expect(result[1]).toHaveLength(1) // step2 second\n expect(result[2]).toHaveLength(1) // step3 third\n })\n\n it('should handle parallel execution with partial dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request' },\n { name: 'step2', step: 'create-document' },\n { name: 'step3', step: 'http-request', dependencies: ['step1'] },\n { name: 'step4', step: 'create-document', dependencies: ['step1'] }\n ]\n\n const result = (executor as any).resolveExecutionOrder(steps)\n \n expect(result).toHaveLength(2) // Two batches\n expect(result[0]).toHaveLength(2) // step1 and step2 in parallel\n expect(result[1]).toHaveLength(2) // step3 and step4 in parallel\n })\n\n it('should detect circular dependencies', () => {\n const steps = [\n { name: 'step1', step: 'http-request', dependencies: ['step2'] },\n { name: 'step2', step: 'create-document', dependencies: ['step1'] }\n ]\n\n expect(() => {\n (executor as any).resolveExecutionOrder(steps)\n }).toThrow('Circular dependency detected')\n })\n })\n\n describe('evaluateCondition', () => {\n it('should evaluate simple equality conditions', () => {\n const context = {\n trigger: {\n doc: { status: 'published' }\n },\n steps: {}\n }\n\n const result = (executor as any).evaluateCondition('$.trigger.doc.status == \"published\"', context)\n expect(result).toBe(true)\n })\n\n it('should evaluate inequality conditions', () => {\n const context = {\n trigger: {\n doc: { count: 5 }\n },\n steps: {}\n }\n\n const result = (executor as any).evaluateCondition('$.trigger.doc.count > 3', context)\n expect(result).toBe(true)\n })\n\n it('should return false for invalid conditions', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).evaluateCondition('invalid condition syntax', context)\n expect(result).toBe(false)\n })\n\n it('should handle missing context gracefully', () => {\n const context = { trigger: {}, steps: {} }\n const result = (executor as any).evaluateCondition('$.trigger.doc.status == \"published\"', context)\n expect(result).toBe(false) // Missing values should fail condition\n })\n })\n\n describe('safeSerialize', () => {\n it('should serialize simple objects', () => {\n const obj = { name: 'test', value: 123 }\n const result = (executor as any).safeSerialize(obj)\n expect(result).toBe('{\"name\":\"test\",\"value\":123}')\n })\n\n it('should handle circular references', () => {\n const obj: any = { name: 'test' }\n obj.self = obj // Create circular reference\n\n const result = (executor as any).safeSerialize(obj)\n expect(result).toContain('\"name\":\"test\"')\n expect(result).toContain('\"self\":\"[Circular]\"')\n })\n\n it('should handle undefined and null values', () => {\n const obj = { \n defined: 'value',\n undefined: undefined,\n null: null\n }\n \n const result = (executor as any).safeSerialize(obj)\n const parsed = JSON.parse(result)\n expect(parsed.defined).toBe('value')\n expect(parsed.null).toBe(null)\n expect(parsed).not.toHaveProperty('undefined') // undefined props are omitted\n })\n })\n\n describe('executeWorkflow', () => {\n it('should execute workflow with single step', async () => {\n const workflow = {\n id: 'test-workflow',\n steps: [\n {\n name: 'test-step',\n step: 'http-request-step',\n url: 'https://example.com',\n method: 'GET'\n }\n ]\n }\n \n const context = {\n trigger: { doc: { id: 'test-doc' } },\n steps: {}\n }\n\n // Mock step task\n const mockStepTask = {\n taskSlug: 'http-request-step',\n handler: vi.fn().mockResolvedValue({\n output: { status: 200, body: 'success' },\n state: 'succeeded'\n })\n }\n\n // Mock the step tasks registry\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = await (executor as any).executeWorkflow(workflow, context)\n\n expect(result.status).toBe('completed')\n expect(result.context.steps['test-step']).toBeDefined()\n expect(result.context.steps['test-step'].state).toBe('succeeded')\n expect(mockStepTask.handler).toHaveBeenCalledOnce()\n\n // Restore original step tasks\n ;(executor as any).stepTasks = originalStepTasks\n })\n\n it('should handle step execution failures', async () => {\n const workflow = {\n id: 'test-workflow',\n steps: [\n {\n name: 'failing-step',\n step: 'http-request-step',\n url: 'https://invalid-url',\n method: 'GET'\n }\n ]\n }\n \n const context = {\n trigger: { doc: { id: 'test-doc' } },\n steps: {}\n }\n\n // Mock failing step task\n const mockStepTask = {\n taskSlug: 'http-request-step',\n handler: vi.fn().mockRejectedValue(new Error('Network error'))\n }\n\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = await (executor as any).executeWorkflow(workflow, context)\n\n expect(result.status).toBe('failed')\n expect(result.error).toContain('Network error')\n expect(result.context.steps['failing-step']).toBeDefined()\n expect(result.context.steps['failing-step'].state).toBe('failed')\n\n ;(executor as any).stepTasks = originalStepTasks\n })\n\n it('should execute steps with dependencies in correct order', async () => {\n const workflow = {\n id: 'test-workflow',\n steps: [\n {\n name: 'step1',\n step: 'http-request-step',\n url: 'https://example.com/1',\n method: 'GET'\n },\n {\n name: 'step2',\n step: 'http-request-step',\n url: 'https://example.com/2',\n method: 'GET',\n dependencies: ['step1']\n },\n {\n name: 'step3',\n step: 'http-request-step',\n url: 'https://example.com/3',\n method: 'GET',\n dependencies: ['step1']\n }\n ]\n }\n \n const context = {\n trigger: { doc: { id: 'test-doc' } },\n steps: {}\n }\n\n const executionOrder: string[] = []\n const mockStepTask = {\n taskSlug: 'http-request-step',\n handler: vi.fn().mockImplementation(async ({ input }) => {\n executionOrder.push(input.stepName)\n return {\n output: { status: 200, body: 'success' },\n state: 'succeeded'\n }\n })\n }\n\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = await (executor as any).executeWorkflow(workflow, context)\n\n expect(result.status).toBe('completed')\n expect(executionOrder[0]).toBe('step1') // First step executed first\n expect(executionOrder.slice(1)).toContain('step2') // Dependent steps after\n expect(executionOrder.slice(1)).toContain('step3')\n\n ;(executor as any).stepTasks = originalStepTasks\n })\n })\n\n describe('findStepTask', () => {\n it('should find registered step task by slug', () => {\n const mockStepTask = {\n taskSlug: 'test-step',\n handler: vi.fn()\n }\n\n const originalStepTasks = (executor as any).stepTasks\n ;(executor as any).stepTasks = [mockStepTask]\n\n const result = (executor as any).findStepTask('test-step')\n expect(result).toBe(mockStepTask)\n\n ;(executor as any).stepTasks = originalStepTasks\n })\n\n it('should return undefined for unknown step type', () => {\n const result = (executor as any).findStepTask('unknown-step')\n expect(result).toBeUndefined()\n })\n })\n\n describe('validateStepConfiguration', () => {\n it('should validate step with required fields', () => {\n const step = {\n name: 'valid-step',\n step: 'http-request-step',\n url: 'https://example.com',\n method: 'GET'\n }\n\n expect(() => {\n (executor as any).validateStepConfiguration(step)\n }).not.toThrow()\n })\n\n it('should throw error for step without name', () => {\n const step = {\n step: 'http-request-step',\n url: 'https://example.com',\n method: 'GET'\n }\n\n expect(() => {\n (executor as any).validateStepConfiguration(step)\n }).toThrow('Step name is required')\n })\n\n it('should throw error for step without type', () => {\n const step = {\n name: 'test-step',\n url: 'https://example.com',\n method: 'GET'\n }\n\n expect(() => {\n (executor as any).validateStepConfiguration(step)\n }).toThrow('Step type is required')\n })\n })\n\n describe('createExecutionContext', () => {\n it('should create context with trigger data', () => {\n const triggerContext = {\n operation: 'create',\n doc: { id: 'test-id', title: 'Test Doc' },\n collection: 'posts'\n }\n\n const result = (executor as any).createExecutionContext(triggerContext)\n\n expect(result.trigger).toEqual(triggerContext)\n expect(result.steps).toEqual({})\n expect(result.metadata).toBeDefined()\n expect(result.metadata.startedAt).toBeDefined()\n })\n\n it('should include metadata in context', () => {\n const triggerContext = { doc: { id: 'test' } }\n const result = (executor as any).createExecutionContext(triggerContext)\n\n expect(result.metadata).toHaveProperty('startedAt')\n expect(result.metadata).toHaveProperty('executionId')\n expect(typeof result.metadata.executionId).toBe('string')\n })\n })\n})"],"names":["describe","it","expect","beforeEach","vi","WorkflowExecutor","mockPayload","mockLogger","executor","info","fn","debug","warn","error","jobs","queue","mockResolvedValue","id","run","undefined","create","update","find","context","trigger","doc","title","steps","result","resolveJSONPathValue","toBe","nested","value","config","url","message","data","resolveStepInput","toEqual","items","name","step","resolveExecutionOrder","toHaveLength","dependencies","toThrow","status","evaluateCondition","count","obj","safeSerialize","self","toContain","defined","null","parsed","JSON","parse","not","toHaveProperty","workflow","method","mockStepTask","taskSlug","handler","output","body","state","originalStepTasks","stepTasks","executeWorkflow","toBeDefined","toHaveBeenCalledOnce","mockRejectedValue","Error","executionOrder","mockImplementation","input","push","stepName","slice","findStepTask","toBeUndefined","validateStepConfiguration","triggerContext","operation","collection","createExecutionContext","metadata","startedAt","executionId"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const collectionTrigger = ({ collectionTriggers })=>({
|
|
2
|
+
slug: 'collection-hook',
|
|
3
|
+
parameters: [
|
|
4
|
+
{
|
|
5
|
+
name: 'collectionSlug',
|
|
6
|
+
type: 'select',
|
|
7
|
+
options: Object.keys(collectionTriggers || {})
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: 'hook',
|
|
11
|
+
type: 'select',
|
|
12
|
+
options: [
|
|
13
|
+
"afterChange",
|
|
14
|
+
"afterDelete",
|
|
15
|
+
"afterError",
|
|
16
|
+
"afterForgotPassword",
|
|
17
|
+
"afterLogin",
|
|
18
|
+
"afterLogout",
|
|
19
|
+
"afterMe",
|
|
20
|
+
"afterOperation",
|
|
21
|
+
"afterRead",
|
|
22
|
+
"afterRefresh",
|
|
23
|
+
"beforeChange",
|
|
24
|
+
"beforeDelete",
|
|
25
|
+
"beforeLogin",
|
|
26
|
+
"beforeOperation",
|
|
27
|
+
"beforeRead",
|
|
28
|
+
"beforeValidate",
|
|
29
|
+
"me",
|
|
30
|
+
"refresh"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=collection-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/triggers/collection-trigger.ts"],"sourcesContent":["import type {TriggerConfig} from '../plugin/config-types.js'\n\nexport const collectionTrigger: TriggerConfig = ({collectionTriggers}) => ({\n slug: 'collection-hook',\n parameters: [\n {\n name: 'collectionSlug',\n type: 'select',\n options: Object.keys(collectionTriggers || {}),\n },\n {\n name: 'hook',\n type: 'select',\n options: [\n \"afterChange\",\n \"afterDelete\",\n \"afterError\",\n \"afterForgotPassword\",\n \"afterLogin\",\n \"afterLogout\",\n \"afterMe\",\n \"afterOperation\",\n \"afterRead\",\n \"afterRefresh\",\n \"beforeChange\",\n \"beforeDelete\",\n \"beforeLogin\",\n \"beforeOperation\",\n \"beforeRead\",\n \"beforeValidate\",\n \"me\",\n \"refresh\"\n ]\n }\n ]\n})\n"],"names":["collectionTrigger","collectionTriggers","slug","parameters","name","type","options","Object","keys"],"mappings":"AAEA,OAAO,MAAMA,oBAAmC,CAAC,EAACC,kBAAkB,EAAC,GAAM,CAAA;QACzEC,MAAM;QACNC,YAAY;YACV;gBACEC,MAAM;gBACNC,MAAM;gBACNC,SAASC,OAAOC,IAAI,CAACP,sBAAsB,CAAC;YAC9C;YACA;gBACEG,MAAM;gBACNC,MAAM;gBACNC,SAAS;oBACP;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;iBACD;YACH;SACD;IACH,CAAA,EAAE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const globalTrigger = ({ globalTriggers })=>({
|
|
2
|
+
slug: 'global-hook',
|
|
3
|
+
parameters: [
|
|
4
|
+
{
|
|
5
|
+
name: 'global',
|
|
6
|
+
type: 'select',
|
|
7
|
+
admin: {
|
|
8
|
+
description: 'Global that triggers the workflow'
|
|
9
|
+
},
|
|
10
|
+
options: Object.keys(globalTriggers || {})
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'operation',
|
|
14
|
+
type: 'select',
|
|
15
|
+
admin: {
|
|
16
|
+
description: 'Global hook that triggers the workflow'
|
|
17
|
+
},
|
|
18
|
+
options: [
|
|
19
|
+
"afterChange",
|
|
20
|
+
"afterRead",
|
|
21
|
+
"beforeChange",
|
|
22
|
+
"beforeRead",
|
|
23
|
+
"beforeValidate"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=global-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/triggers/global-trigger.ts"],"sourcesContent":["import type {TriggerConfig} from '../plugin/config-types.js'\n\nexport const globalTrigger: TriggerConfig = ({globalTriggers}) => ({\n slug: 'global-hook',\n parameters: [\n {\n name: 'global',\n type: 'select',\n admin: {\n description: 'Global that triggers the workflow',\n },\n options: Object.keys(globalTriggers || {}),\n },\n {\n name: 'operation',\n type: 'select',\n admin: {\n description: 'Global hook that triggers the workflow',\n },\n options: [\n \"afterChange\",\n \"afterRead\", \n \"beforeChange\",\n \"beforeRead\",\n \"beforeValidate\"\n ],\n }\n ]\n})\n"],"names":["globalTrigger","globalTriggers","slug","parameters","name","type","admin","description","options","Object","keys"],"mappings":"AAEA,OAAO,MAAMA,gBAA+B,CAAC,EAACC,cAAc,EAAC,GAAM,CAAA;QACjEC,MAAM;QACNC,YAAY;YACV;gBACEC,MAAM;gBACNC,MAAM;gBACNC,OAAO;oBACLC,aAAa;gBACf;gBACAC,SAASC,OAAOC,IAAI,CAACT,kBAAkB,CAAC;YAC1C;YACA;gBACEG,MAAM;gBACNC,MAAM;gBACNC,OAAO;oBACLC,aAAa;gBACf;gBACAC,SAAS;oBACP;oBACA;oBACA;oBACA;oBACA;iBACD;YACH;SACD;IACH,CAAA,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/triggers/index.ts"],"sourcesContent":["export { collectionTrigger } from './collection-trigger.js'\nexport { globalTrigger } from './global-trigger.js'\n"],"names":["collectionTrigger","globalTrigger"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,0BAAyB;AAC3D,SAASC,aAAa,QAAQ,sBAAqB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/triggers/types.ts"],"sourcesContent":["import type {Field} from \"payload\"\n\nexport type Trigger = {\n slug: string\n parameters: Field[]\n}\n"],"names":[],"mappings":"AAEA,WAGC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xtr-dev/payload-automation",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.37",
|
|
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",
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { Button, toast } from '@payloadcms/ui';
|
|
4
|
-
import { useState } from 'react';
|
|
5
|
-
export const TriggerWorkflowButton = ({ workflowId, workflowName, triggerSlug = 'manual-trigger' })=>{
|
|
6
|
-
const [loading, setLoading] = useState(false);
|
|
7
|
-
const handleTrigger = async ()=>{
|
|
8
|
-
setLoading(true);
|
|
9
|
-
try {
|
|
10
|
-
const response = await fetch('/api/workflows/trigger-custom', {
|
|
11
|
-
method: 'POST',
|
|
12
|
-
headers: {
|
|
13
|
-
'Content-Type': 'application/json'
|
|
14
|
-
},
|
|
15
|
-
body: JSON.stringify({
|
|
16
|
-
workflowId,
|
|
17
|
-
triggerSlug,
|
|
18
|
-
data: {
|
|
19
|
-
triggeredAt: new Date().toISOString(),
|
|
20
|
-
source: 'admin-button'
|
|
21
|
-
}
|
|
22
|
-
})
|
|
23
|
-
});
|
|
24
|
-
if (!response.ok) {
|
|
25
|
-
const error = await response.json();
|
|
26
|
-
throw new Error(error.message || 'Failed to trigger workflow');
|
|
27
|
-
}
|
|
28
|
-
const result = await response.json();
|
|
29
|
-
toast.success(`Workflow "${workflowName}" triggered successfully! Run ID: ${result.runId}`);
|
|
30
|
-
} catch (error) {
|
|
31
|
-
console.error('Error triggering workflow:', error);
|
|
32
|
-
toast.error(`Failed to trigger workflow: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
33
|
-
} finally{
|
|
34
|
-
setLoading(false);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
return /*#__PURE__*/ _jsx(Button, {
|
|
38
|
-
onClick: handleTrigger,
|
|
39
|
-
disabled: loading,
|
|
40
|
-
size: "small",
|
|
41
|
-
buttonStyle: "secondary",
|
|
42
|
-
children: loading ? 'Triggering...' : 'Trigger Workflow'
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
//# sourceMappingURL=TriggerWorkflowButton.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/TriggerWorkflowButton.tsx"],"sourcesContent":["'use client'\n\nimport { Button, toast } from '@payloadcms/ui'\nimport { useState } from 'react'\n\ninterface TriggerWorkflowButtonProps {\n workflowId: string\n workflowName: string\n triggerSlug?: string\n}\n\nexport const TriggerWorkflowButton: React.FC<TriggerWorkflowButtonProps> = ({\n workflowId,\n workflowName,\n triggerSlug = 'manual-trigger'\n}) => {\n const [loading, setLoading] = useState(false)\n\n const handleTrigger = async () => {\n setLoading(true)\n \n try {\n const response = await fetch('/api/workflows/trigger-custom', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n workflowId,\n triggerSlug,\n data: {\n triggeredAt: new Date().toISOString(),\n source: 'admin-button'\n }\n }),\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.message || 'Failed to trigger workflow')\n }\n\n const result = await response.json()\n \n toast.success(`Workflow \"${workflowName}\" triggered successfully! Run ID: ${result.runId}`)\n } catch (error) {\n console.error('Error triggering workflow:', error)\n toast.error(`Failed to trigger workflow: ${error instanceof Error ? error.message : 'Unknown error'}`)\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <Button\n onClick={handleTrigger}\n disabled={loading}\n size=\"small\"\n buttonStyle=\"secondary\"\n >\n {loading ? 'Triggering...' : 'Trigger Workflow'}\n </Button>\n )\n}"],"names":["Button","toast","useState","TriggerWorkflowButton","workflowId","workflowName","triggerSlug","loading","setLoading","handleTrigger","response","fetch","method","headers","body","JSON","stringify","data","triggeredAt","Date","toISOString","source","ok","error","json","Error","message","result","success","runId","console","onClick","disabled","size","buttonStyle"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,KAAK,QAAQ,iBAAgB;AAC9C,SAASC,QAAQ,QAAQ,QAAO;AAQhC,OAAO,MAAMC,wBAA8D,CAAC,EAC1EC,UAAU,EACVC,YAAY,EACZC,cAAc,gBAAgB,EAC/B;IACC,MAAM,CAACC,SAASC,WAAW,GAAGN,SAAS;IAEvC,MAAMO,gBAAgB;QACpBD,WAAW;QAEX,IAAI;YACF,MAAME,WAAW,MAAMC,MAAM,iCAAiC;gBAC5DC,QAAQ;gBACRC,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,MAAMC,KAAKC,SAAS,CAAC;oBACnBZ;oBACAE;oBACAW,MAAM;wBACJC,aAAa,IAAIC,OAAOC,WAAW;wBACnCC,QAAQ;oBACV;gBACF;YACF;YAEA,IAAI,CAACX,SAASY,EAAE,EAAE;gBAChB,MAAMC,QAAQ,MAAMb,SAASc,IAAI;gBACjC,MAAM,IAAIC,MAAMF,MAAMG,OAAO,IAAI;YACnC;YAEA,MAAMC,SAAS,MAAMjB,SAASc,IAAI;YAElCvB,MAAM2B,OAAO,CAAC,CAAC,UAAU,EAAEvB,aAAa,kCAAkC,EAAEsB,OAAOE,KAAK,EAAE;QAC5F,EAAE,OAAON,OAAO;YACdO,QAAQP,KAAK,CAAC,8BAA8BA;YAC5CtB,MAAMsB,KAAK,CAAC,CAAC,4BAA4B,EAAEA,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG,iBAAiB;QACvG,SAAU;YACRlB,WAAW;QACb;IACF;IAEA,qBACE,KAACR;QACC+B,SAAStB;QACTuB,UAAUzB;QACV0B,MAAK;QACLC,aAAY;kBAEX3B,UAAU,kBAAkB;;AAGnC,EAAC"}
|
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import React, { useState, useEffect } from 'react';
|
|
4
|
-
import { Button } from '@payloadcms/ui';
|
|
5
|
-
export const WorkflowExecutionStatus = ({ workflowId })=>{
|
|
6
|
-
const [runs, setRuns] = useState([]);
|
|
7
|
-
const [loading, setLoading] = useState(true);
|
|
8
|
-
const [expanded, setExpanded] = useState(false);
|
|
9
|
-
useEffect(()=>{
|
|
10
|
-
const fetchRecentRuns = async ()=>{
|
|
11
|
-
try {
|
|
12
|
-
const response = await fetch(`/api/workflow-runs?where[workflow][equals]=${workflowId}&limit=5&sort=-startedAt`);
|
|
13
|
-
if (response.ok) {
|
|
14
|
-
const data = await response.json();
|
|
15
|
-
setRuns(data.docs || []);
|
|
16
|
-
}
|
|
17
|
-
} catch (error) {
|
|
18
|
-
console.warn('Failed to fetch workflow runs:', error);
|
|
19
|
-
} finally{
|
|
20
|
-
setLoading(false);
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
fetchRecentRuns();
|
|
24
|
-
}, [
|
|
25
|
-
workflowId
|
|
26
|
-
]);
|
|
27
|
-
if (loading) {
|
|
28
|
-
return /*#__PURE__*/ _jsx("div", {
|
|
29
|
-
style: {
|
|
30
|
-
padding: '16px',
|
|
31
|
-
color: '#6B7280'
|
|
32
|
-
},
|
|
33
|
-
children: "Loading execution history..."
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
if (runs.length === 0) {
|
|
37
|
-
return /*#__PURE__*/ _jsxs("div", {
|
|
38
|
-
style: {
|
|
39
|
-
padding: '16px',
|
|
40
|
-
backgroundColor: '#F9FAFB',
|
|
41
|
-
border: '1px solid #E5E7EB',
|
|
42
|
-
borderRadius: '8px',
|
|
43
|
-
color: '#6B7280',
|
|
44
|
-
textAlign: 'center'
|
|
45
|
-
},
|
|
46
|
-
children: [
|
|
47
|
-
"📋 No execution history yet",
|
|
48
|
-
/*#__PURE__*/ _jsx("br", {}),
|
|
49
|
-
/*#__PURE__*/ _jsx("small", {
|
|
50
|
-
children: "This workflow hasn't been triggered yet."
|
|
51
|
-
})
|
|
52
|
-
]
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
const getStatusIcon = (status)=>{
|
|
56
|
-
switch(status){
|
|
57
|
-
case 'pending':
|
|
58
|
-
return '⏳';
|
|
59
|
-
case 'running':
|
|
60
|
-
return '🔄';
|
|
61
|
-
case 'completed':
|
|
62
|
-
return '✅';
|
|
63
|
-
case 'failed':
|
|
64
|
-
return '❌';
|
|
65
|
-
case 'cancelled':
|
|
66
|
-
return '⏹️';
|
|
67
|
-
default:
|
|
68
|
-
return '❓';
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
const getStatusColor = (status)=>{
|
|
72
|
-
switch(status){
|
|
73
|
-
case 'pending':
|
|
74
|
-
return '#6B7280';
|
|
75
|
-
case 'running':
|
|
76
|
-
return '#3B82F6';
|
|
77
|
-
case 'completed':
|
|
78
|
-
return '#10B981';
|
|
79
|
-
case 'failed':
|
|
80
|
-
return '#EF4444';
|
|
81
|
-
case 'cancelled':
|
|
82
|
-
return '#F59E0B';
|
|
83
|
-
default:
|
|
84
|
-
return '#6B7280';
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
const formatDate = (dateString)=>{
|
|
88
|
-
const date = new Date(dateString);
|
|
89
|
-
const now = new Date();
|
|
90
|
-
const diffMs = now.getTime() - date.getTime();
|
|
91
|
-
if (diffMs < 60000) {
|
|
92
|
-
return 'Just now';
|
|
93
|
-
} else if (diffMs < 3600000) {
|
|
94
|
-
return `${Math.floor(diffMs / 60000)} min ago`;
|
|
95
|
-
} else if (diffMs < 86400000) {
|
|
96
|
-
return `${Math.floor(diffMs / 3600000)} hrs ago`;
|
|
97
|
-
} else {
|
|
98
|
-
return date.toLocaleDateString();
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
const getDuration = (startedAt, completedAt)=>{
|
|
102
|
-
const start = new Date(startedAt);
|
|
103
|
-
const end = completedAt ? new Date(completedAt) : new Date();
|
|
104
|
-
const diffMs = end.getTime() - start.getTime();
|
|
105
|
-
if (diffMs < 1000) return '<1s';
|
|
106
|
-
if (diffMs < 60000) return `${Math.floor(diffMs / 1000)}s`;
|
|
107
|
-
if (diffMs < 3600000) return `${Math.floor(diffMs / 60000)}m ${Math.floor(diffMs % 60000 / 1000)}s`;
|
|
108
|
-
return `${Math.floor(diffMs / 3600000)}h ${Math.floor(diffMs % 3600000 / 60000)}m`;
|
|
109
|
-
};
|
|
110
|
-
const recentRun = runs[0];
|
|
111
|
-
const recentStatus = getStatusIcon(recentRun.status);
|
|
112
|
-
const recentColor = getStatusColor(recentRun.status);
|
|
113
|
-
return /*#__PURE__*/ _jsxs("div", {
|
|
114
|
-
style: {
|
|
115
|
-
border: '1px solid #E5E7EB',
|
|
116
|
-
borderRadius: '8px',
|
|
117
|
-
backgroundColor: '#FAFAFA'
|
|
118
|
-
},
|
|
119
|
-
children: [
|
|
120
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
121
|
-
style: {
|
|
122
|
-
padding: '16px',
|
|
123
|
-
borderBottom: expanded ? '1px solid #E5E7EB' : 'none',
|
|
124
|
-
display: 'flex',
|
|
125
|
-
justifyContent: 'space-between',
|
|
126
|
-
alignItems: 'center'
|
|
127
|
-
},
|
|
128
|
-
children: [
|
|
129
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
130
|
-
style: {
|
|
131
|
-
display: 'flex',
|
|
132
|
-
alignItems: 'center',
|
|
133
|
-
gap: '12px'
|
|
134
|
-
},
|
|
135
|
-
children: [
|
|
136
|
-
/*#__PURE__*/ _jsx("span", {
|
|
137
|
-
style: {
|
|
138
|
-
fontSize: '20px'
|
|
139
|
-
},
|
|
140
|
-
children: recentStatus
|
|
141
|
-
}),
|
|
142
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
143
|
-
children: [
|
|
144
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
145
|
-
style: {
|
|
146
|
-
fontWeight: '600',
|
|
147
|
-
color: recentColor
|
|
148
|
-
},
|
|
149
|
-
children: [
|
|
150
|
-
"Last run: ",
|
|
151
|
-
recentRun.status
|
|
152
|
-
]
|
|
153
|
-
}),
|
|
154
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
155
|
-
style: {
|
|
156
|
-
fontSize: '13px',
|
|
157
|
-
color: '#6B7280'
|
|
158
|
-
},
|
|
159
|
-
children: [
|
|
160
|
-
formatDate(recentRun.startedAt),
|
|
161
|
-
" • Duration: ",
|
|
162
|
-
getDuration(recentRun.startedAt, recentRun.completedAt)
|
|
163
|
-
]
|
|
164
|
-
})
|
|
165
|
-
]
|
|
166
|
-
})
|
|
167
|
-
]
|
|
168
|
-
}),
|
|
169
|
-
/*#__PURE__*/ _jsxs(Button, {
|
|
170
|
-
onClick: ()=>setExpanded(!expanded),
|
|
171
|
-
size: "small",
|
|
172
|
-
buttonStyle: "secondary",
|
|
173
|
-
children: [
|
|
174
|
-
expanded ? 'Hide' : 'Show',
|
|
175
|
-
" History (",
|
|
176
|
-
runs.length,
|
|
177
|
-
")"
|
|
178
|
-
]
|
|
179
|
-
})
|
|
180
|
-
]
|
|
181
|
-
}),
|
|
182
|
-
expanded && /*#__PURE__*/ _jsxs("div", {
|
|
183
|
-
style: {
|
|
184
|
-
padding: '16px'
|
|
185
|
-
},
|
|
186
|
-
children: [
|
|
187
|
-
/*#__PURE__*/ _jsx("h4", {
|
|
188
|
-
style: {
|
|
189
|
-
margin: '0 0 12px 0',
|
|
190
|
-
fontSize: '14px',
|
|
191
|
-
fontWeight: '600'
|
|
192
|
-
},
|
|
193
|
-
children: "Recent Executions"
|
|
194
|
-
}),
|
|
195
|
-
runs.map((run, index)=>/*#__PURE__*/ _jsxs("div", {
|
|
196
|
-
style: {
|
|
197
|
-
display: 'flex',
|
|
198
|
-
justifyContent: 'space-between',
|
|
199
|
-
alignItems: 'center',
|
|
200
|
-
padding: '8px 12px',
|
|
201
|
-
marginBottom: index < runs.length - 1 ? '8px' : '0',
|
|
202
|
-
backgroundColor: 'white',
|
|
203
|
-
border: '1px solid #E5E7EB',
|
|
204
|
-
borderRadius: '6px'
|
|
205
|
-
},
|
|
206
|
-
children: [
|
|
207
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
208
|
-
style: {
|
|
209
|
-
display: 'flex',
|
|
210
|
-
alignItems: 'center',
|
|
211
|
-
gap: '10px'
|
|
212
|
-
},
|
|
213
|
-
children: [
|
|
214
|
-
/*#__PURE__*/ _jsx("span", {
|
|
215
|
-
style: {
|
|
216
|
-
fontSize: '16px'
|
|
217
|
-
},
|
|
218
|
-
children: getStatusIcon(run.status)
|
|
219
|
-
}),
|
|
220
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
221
|
-
children: [
|
|
222
|
-
/*#__PURE__*/ _jsx("div", {
|
|
223
|
-
style: {
|
|
224
|
-
fontSize: '13px',
|
|
225
|
-
fontWeight: '500',
|
|
226
|
-
color: getStatusColor(run.status)
|
|
227
|
-
},
|
|
228
|
-
children: run.status.charAt(0).toUpperCase() + run.status.slice(1)
|
|
229
|
-
}),
|
|
230
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
231
|
-
style: {
|
|
232
|
-
fontSize: '12px',
|
|
233
|
-
color: '#6B7280'
|
|
234
|
-
},
|
|
235
|
-
children: [
|
|
236
|
-
formatDate(run.startedAt),
|
|
237
|
-
" • ",
|
|
238
|
-
run.triggeredBy
|
|
239
|
-
]
|
|
240
|
-
})
|
|
241
|
-
]
|
|
242
|
-
})
|
|
243
|
-
]
|
|
244
|
-
}),
|
|
245
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
246
|
-
style: {
|
|
247
|
-
fontSize: '12px',
|
|
248
|
-
color: '#6B7280',
|
|
249
|
-
textAlign: 'right'
|
|
250
|
-
},
|
|
251
|
-
children: [
|
|
252
|
-
/*#__PURE__*/ _jsx("div", {
|
|
253
|
-
children: getDuration(run.startedAt, run.completedAt)
|
|
254
|
-
}),
|
|
255
|
-
run.error && /*#__PURE__*/ _jsx("div", {
|
|
256
|
-
style: {
|
|
257
|
-
color: '#EF4444',
|
|
258
|
-
marginTop: '2px'
|
|
259
|
-
},
|
|
260
|
-
children: "Error"
|
|
261
|
-
})
|
|
262
|
-
]
|
|
263
|
-
})
|
|
264
|
-
]
|
|
265
|
-
}, run.id)),
|
|
266
|
-
/*#__PURE__*/ _jsx("div", {
|
|
267
|
-
style: {
|
|
268
|
-
marginTop: '12px',
|
|
269
|
-
textAlign: 'center'
|
|
270
|
-
},
|
|
271
|
-
children: /*#__PURE__*/ _jsx(Button, {
|
|
272
|
-
onClick: ()=>{
|
|
273
|
-
// Navigate to workflow runs filtered by this workflow
|
|
274
|
-
window.location.href = `/admin/collections/workflow-runs?where[workflow][equals]=${workflowId}`;
|
|
275
|
-
},
|
|
276
|
-
size: "small",
|
|
277
|
-
buttonStyle: "secondary",
|
|
278
|
-
children: "View All Runs →"
|
|
279
|
-
})
|
|
280
|
-
})
|
|
281
|
-
]
|
|
282
|
-
})
|
|
283
|
-
]
|
|
284
|
-
});
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
//# sourceMappingURL=WorkflowExecutionStatus.js.map
|