From 1bd455bc7bd32b0fda8c808b203ad341253f095d Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Tue, 22 Jul 2025 09:53:24 -0300 Subject: [PATCH] fix(workflows-sdk): fix step name config used before default (#12926) --- .changeset/quick-weeks-press.md | 5 +++ .../src/utils/composer/__tests__/compose.ts | 35 +++++++++++++++++++ .../src/utils/composer/create-step.ts | 11 +++--- .../src/utils/composer/create-workflow.ts | 1 + .../workflows-sdk/src/utils/composer/type.ts | 1 + 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 .changeset/quick-weeks-press.md diff --git a/.changeset/quick-weeks-press.md b/.changeset/quick-weeks-press.md new file mode 100644 index 0000000000..f90b877e4f --- /dev/null +++ b/.changeset/quick-weeks-press.md @@ -0,0 +1,5 @@ +--- +"@medusajs/workflows-sdk": patch +--- + +fix(workflows-sdk): step config name before default step diff --git a/packages/core/workflows-sdk/src/utils/composer/__tests__/compose.ts b/packages/core/workflows-sdk/src/utils/composer/__tests__/compose.ts index d82ed7e6d6..68fb2bbbf9 100644 --- a/packages/core/workflows-sdk/src/utils/composer/__tests__/compose.ts +++ b/packages/core/workflows-sdk/src/utils/composer/__tests__/compose.ts @@ -1408,6 +1408,41 @@ describe("Workflow composer", function () { expect(logStepFn).toHaveBeenCalledTimes(0) }) + it("should run same step multiple times", async () => { + const log = createStep("log", async (input: number) => { + return new StepResponse(input) + }) + + const sameStepWorkflow = createWorkflow("fake-workflow", () => { + const a = log(1).config({ name: "aaaa" }) + const b = log(2) // without config on purpose + const c = log(3).config({ name: "cccc" }) + return new WorkflowResponse([a, b, c]) + }) + + const sameStepWorkflow2 = createWorkflow("fake-workflow-2", () => { + const a = log(1) + const b = log(2).config({ name: "bbbb" }) + const c = log(3).config({ name: "cccc" }) + return new WorkflowResponse([a, b, c]) + }) + + const sameStepWorkflow3 = createWorkflow("fake-workflow-3", () => { + const a = log(1).config({ name: "aaaa" }) + const b = log(2).config({ name: "bbbb" }) + const c = log(3) + return new WorkflowResponse([a, b, c]) + }) + + const { result } = await sameStepWorkflow().run() + const { result: result2 } = await sameStepWorkflow2().run() + const { result: result3 } = await sameStepWorkflow3().run() + + expect(result).toEqual([1, 2, 3]) + expect(result2).toEqual([1, 2, 3]) + expect(result3).toEqual([1, 2, 3]) + }) + it("should skip steps until the named step in case of permanent failure", async () => { const logStepFn = jest.fn(async ({ input }: { input: object }) => { return new StepResponse("done and returned") diff --git a/packages/core/workflows-sdk/src/utils/composer/create-step.ts b/packages/core/workflows-sdk/src/utils/composer/create-step.ts index 1b8020ff87..7991bc5301 100644 --- a/packages/core/workflows-sdk/src/utils/composer/create-step.ts +++ b/packages/core/workflows-sdk/src/utils/composer/create-step.ts @@ -143,9 +143,9 @@ export function applyStep< this.isAsync ||= !!(stepConfig.async || stepConfig.compensateAsync) - if (!this.handlers.has(stepName)) { - this.handlers.set(stepName, handler) - } + this.overriddenHandler.set(stepName, this.handlers.get(stepName)!) + + this.handlers.set(stepName, handler) const ret = { __type: OrchestrationUtils.SymbolWorkflowStep, @@ -177,7 +177,7 @@ export function applyStep< newConfig.nested ||= newConfig.async } - delete localConfig.name + delete newConfig.name const handler = createStepHandler.bind(this)({ stepName: newStepName, @@ -188,6 +188,9 @@ export function applyStep< wrapAsyncHandler(newConfig, handler) + this.handlers.set(stepName, this.overriddenHandler.get(stepName)!) + this.overriddenHandler.delete(stepName) + this.handlers.set(newStepName, handler) this.flow.replaceAction(stepConfig.uuid!, newStepName, newConfig) diff --git a/packages/core/workflows-sdk/src/utils/composer/create-workflow.ts b/packages/core/workflows-sdk/src/utils/composer/create-workflow.ts index 8a512f5d1a..7807d9d4fe 100644 --- a/packages/core/workflows-sdk/src/utils/composer/create-workflow.ts +++ b/packages/core/workflows-sdk/src/utils/composer/create-workflow.ts @@ -117,6 +117,7 @@ export function createWorkflow( flow: WorkflowManager.getEmptyTransactionDefinition(), isAsync: false, handlers, + overriddenHandler: new Map(), hooks_: { declared: [], registered: [], diff --git a/packages/core/workflows-sdk/src/utils/composer/type.ts b/packages/core/workflows-sdk/src/utils/composer/type.ts index c4a51a0d4c..5b343e9b65 100644 --- a/packages/core/workflows-sdk/src/utils/composer/type.ts +++ b/packages/core/workflows-sdk/src/utils/composer/type.ts @@ -113,6 +113,7 @@ export type CreateWorkflowComposerContext = { flow: OrchestratorBuilder isAsync: boolean handlers: WorkflowHandler + overriddenHandler: WorkflowHandler stepBinder: ( fn: StepFunctionResult ) => WorkflowData