5.8.3. Workflow Constraints

This chapter lists constraints of defining a workflow or its steps.

Workflow Constraints#

No Async Functions#

The function passed to createWorkflow can’t be an async function:

Code
1// Don't2const myWorkflow = createWorkflow(3  "hello-world", 4  async function (input: WorkflowInput) {5  // ...6})7
8// Do9const myWorkflow = createWorkflow(10  "hello-world", 11  function (input: WorkflowInput) {12  // ...13})

No Direct Variable Manipulation#

You can’t directly manipulate variables within the workflow's constructor function.

NoteLearn more about why you can't manipulate variables in this chapter

Instead, use the transform utility function imported from @medusajs/framework/workflows-sdk:

Code
1// Don't2const myWorkflow = createWorkflow(3  "hello-world", 4  function (input: WorkflowInput) {5  const str1 = step1(input)6  const str2 = step2(input)7
8  return new WorkflowResponse({9    message: `${str1}${str2}`,10  })11})12
13// Do14const myWorkflow = createWorkflow(15  "hello-world", 16  function (input: WorkflowInput) {17  const str1 = step1(input)18  const str2 = step2(input)19
20  const result = transform(21    {22      str1,23      str2,24    },25    (input) => ({26      message: `${input.str1}${input.str2}`,27    })28  )29
30  return new WorkflowResponse(result)31})

No If Conditions#

You can't use if-conditions in a workflow.

NoteLearn more about why you can't use if-conditions in this chapter

Instead, use the when-then utility function imported from @medusajs/framework/workflows-sdk:

Code
1// Don't2const myWorkflow = createWorkflow(3  "hello-world", 4  function (input: WorkflowInput) {5  if (input.is_active) {6    // perform an action7  }8})9
10// Do (explained in the next chapter)11const myWorkflow = createWorkflow(12  "hello-world", 13  function (input: WorkflowInput) {14  when(input, (input) => {15    return input.is_active16  })17  .then(() => {18    // perform an action19  })20})

No Conditional Operators#

You can't use conditional operators in a workflow, such as ?? or ||.

NoteLearn more about why you can't use if-conditions in this chapter

Instead, use transform to store the desired value in a variable.

For example:

Code
1// Don't2const myWorkflow = createWorkflow(3  "hello-world", 4  function (input: WorkflowInput) {5    const message = input.message || "Hello"6})7
8// Do9// other imports...10import { transform } from "@medusajs/framework/workflows-sdk"11
12const myWorkflow = createWorkflow(13  "hello-world", 14  function (input: WorkflowInput) {15    const message = transform(16      {17        input18      },19      (data) => data.input.message || "hello"20    )21})

Step Constraints#

Returned Values#

A step must only return serializable values, such as primitive values or an object.

Values of other types, such as Maps, aren't allowed.

Code
1// Don't2import { 3  createStep,4  StepResponse,5} from "@medusajs/framework/workflows-sdk"6
7const step1 = createStep(8  "step-1",9  (input, { container }) => {10    const myMap = new Map()11
12    // ...13
14    return new StepResponse({15      myMap,16    })17  }18)19
20// Do21import { 22  createStep,23  StepResponse,24} from "@medusajs/framework/workflows-sdk"25
26const step1 = createStep(27  "step-1",28  (input, { container }) => {29    const myObj: Record<string, unknown> = {}30
31    // ...32
33    return new StepResponse({34      myObj,35    })36  }37)
Was this chapter helpful?
Edit this page