diff --git a/www/apps/book/app/advanced-development/api-routes/protected-routes/page.mdx b/www/apps/book/app/advanced-development/api-routes/protected-routes/page.mdx
index 5feb08658f..121b1960cb 100644
--- a/www/apps/book/app/advanced-development/api-routes/protected-routes/page.mdx
+++ b/www/apps/book/app/advanced-development/api-routes/protected-routes/page.mdx
@@ -142,7 +142,7 @@ export const highlights = [
```ts title="src/api/middlewares.ts" highlights={highlights}
import {
defineMiddlewares,
- authenticate
+ authenticate,
} from "@medusajs/medusa"
export default defineMiddlewares({
diff --git a/www/apps/book/app/advanced-development/workflows/add-workflow-hook/page.mdx b/www/apps/book/app/advanced-development/workflows/add-workflow-hook/page.mdx
new file mode 100644
index 0000000000..f7901c9cf1
--- /dev/null
+++ b/www/apps/book/app/advanced-development/workflows/add-workflow-hook/page.mdx
@@ -0,0 +1,125 @@
+export const metadata = {
+ title: `${pageNumber} Workflow Hooks`,
+}
+
+# {metadata.title}
+
+In this chapter, you'll learn what a workflow hook is, how to expose it in your workflow, and how to consume the hook with a handler.
+
+## What is a Workflow Hook?
+
+A workflow hook is a point in a workflow where you can inject custom functionality as a step function, called a hook handler.
+
+Hook handlers receive input from the workflow to perform custom actions during the workflow's execution.
+
+
+
+- Your workflow is reusable in other applications, and you allow performing an external action at some point in your workflow.
+
+
+
+
+
+- Your workflow isn't reusable by other applications. Use a step that performs what a hook handler would instead.
+
+
+
+---
+
+## How to Expose a Hook in a Workflow?
+
+To expose a hook in your workflow, use the `createHook` function imported from `@medusajs/workflows-sdk`.
+
+For example:
+
+export const hookHighlights = [
+ ["13", "createHook", "Add a hook to the workflow."],
+ ["14", `"productCreated"`, "The hook's name."],
+ ["15", "productId", "The data to pass to the hook handler."],
+ ["19", "hooks", "Return the list of hooks in the workflow."]
+]
+
+```ts title="src/workflows/my-workflow/index.ts" highlights={hookHighlights}
+import {
+ createStep,
+ createHook,
+ createWorkflow,
+ WorkflowResponse,
+} from "@medusajs/workflows-sdk"
+import { createProductStep } from "./steps/create-product"
+
+export const myWorkflow = createWorkflow(
+ "my-workflow",
+ function (input) {
+ const product = createProductStep(input)
+ const productCreatedHook = createHook(
+ "productCreated",
+ { productId: product.id }
+ )
+
+ return new WorkflowResponse(product, {
+ hooks: [productCreatedHook],
+ })
+ }
+)
+```
+
+The `createHook` function accepts two parameters:
+
+1. The first is a string indicating the hook's name. This is used to add a hook handler later.
+2. The second is the input to pass to the hook handler.
+
+The workflow must also pass an object having a `hooks` property as a second parameter to the `WorkflowResponse` constructor. Its value is an array of the workflow's hooks.
+
+---
+
+## How to Consume a Hook?
+
+You consume a hook by registering a hook handler on the workflow. A hook handler is registered in a TypeScript or JavaScript file created in the `src/workflows/hooks` directory.
+
+You'll find a workflow's exposed hooks in its `hooks` property.
+
+For example, to consume the hook of the workflow in the previous example, create the file `src/workflows/hooks/my-workflow.ts` with the following content:
+
+export const handlerHighlights = [
+ ["3", "productCreated", "Invoke the hook, passing it a step function as a parameter."],
+]
+
+```ts title="src/workflows/hooks/my-workflow.ts" highlights={handlerHighlights}
+import { myWorkflow } from "../my-workflow"
+
+myWorkflow.hooks.productCreated(
+ async ({ productId }, { container }) => {
+ // TODO perform an action
+ }
+)
+```
+
+
+
+A hook can have only one handler.
+
+
+
+The hook is available on the workflow's `hooks` property using its name `productCreated`. You invoke the hook, passing the handler as a parameter, which is a step function.
+
+Similar to a step, the handler receives the hook's input as a first parameter, and the container in the object as a second parameter.
+
+### Hook Handler Compensation
+
+You can also pass a compensation function as a second parameter:
+
+```ts
+import { myWorkflow } from "../my-workflow"
+
+myWorkflow.hooks.productCreated(
+ async ({ productId }, { container }) => {
+ // TODO perform an action
+ },
+ async () => {
+ // undo the performed action
+ }
+)
+```
+
+The compensation function is executed if an error occurs in the workflow to undo the actions performed by the hook handler.
diff --git a/www/apps/book/app/advanced-development/workflows/advanced-example/page.mdx b/www/apps/book/app/advanced-development/workflows/advanced-example/page.mdx
index 25445ac0c1..6469146670 100644
--- a/www/apps/book/app/advanced-development/workflows/advanced-example/page.mdx
+++ b/www/apps/book/app/advanced-development/workflows/advanced-example/page.mdx
@@ -205,8 +205,11 @@ With the steps ready, you'll create the workflow that runs these steps to update
Change the content of `src/workflows/update-product-erp/index.ts` to the following:
-```ts title="src/workflows/update-product-erp/index.ts" collapsibleLines="1-5" expandButtonLabel="Show Imports"
-import { createWorkflow } from "@medusajs/workflows-sdk"
+```ts title="src/workflows/update-product-erp/index.ts" collapsibleLines="1-8" expandButtonLabel="Show Imports"
+import {
+ createWorkflow,
+ WorkflowResponse,
+} from "@medusajs/workflows-sdk"
import { UpsertProductDTO } from "@medusajs/types"
import updateProduct from "./steps/update-product"
import updateErp from "./steps/update-erp"
@@ -219,10 +222,10 @@ const updateProductAndErpWorkflow = createWorkflow(
const product = updateProduct(input)
const erpData = updateErp(input)
- return {
+ return new WorkflowResponse({
product,
erpData,
- }
+ })
})
export default updateProductAndErpWorkflow
diff --git a/www/apps/book/app/advanced-development/workflows/compensation-function/page.mdx b/www/apps/book/app/advanced-development/workflows/compensation-function/page.mdx
index 52f9bb368f..9577aab9f0 100644
--- a/www/apps/book/app/advanced-development/workflows/compensation-function/page.mdx
+++ b/www/apps/book/app/advanced-development/workflows/compensation-function/page.mdx
@@ -54,10 +54,11 @@ const step2 = createStep(
2. Use the steps in a workflow. For example:
-```ts title="src/workflows/hello-world.ts" collapsibleLines="1-7" expandButtonLabel="Show Imports"
+```ts title="src/workflows/hello-world.ts" collapsibleLines="1-8" expandButtonLabel="Show Imports"
import {
// other imports...
createWorkflow,
+ WorkflowResponse,
} from "@medusajs/workflows-sdk"
// ...
@@ -68,9 +69,9 @@ const myWorkflow = createWorkflow(
const str1 = step1()
step2()
- return {
+ return new WorkflowResponse({
message: str1,
- }
+ })
})
export default myWorkflow
diff --git a/www/apps/book/app/advanced-development/workflows/conditions/page.mdx b/www/apps/book/app/advanced-development/workflows/conditions/page.mdx
index 98ceb43197..9b4634ca66 100644
--- a/www/apps/book/app/advanced-development/workflows/conditions/page.mdx
+++ b/www/apps/book/app/advanced-development/workflows/conditions/page.mdx
@@ -19,14 +19,15 @@ Since if-conditions aren't allowed in the workflow constructor function, use the
For example:
export const highlights = [
- ["15", "input", "The data to pass as a parameter to the function in the second parameter"],
- ["17", "return", "The function must return a boolean value indicating whether\nthe callback function passed to `then` should be executed."],
- ["19", "() => {", "The function to execute if `when`'s second parameter returns a `true` value."]
+ ["16", "input", "The data to pass as a parameter to the function in the second parameter"],
+ ["18", "return", "The function must return a boolean value indicating whether\nthe callback function passed to `then` should be executed."],
+ ["20", "() => {", "The function to execute if `when`'s second parameter returns a `true` value."]
]
```ts highlights={highlights}
import {
createWorkflow,
+ WorkflowResponse,
when,
} from "@medusajs/workflows-sdk"
// step imports...
@@ -49,7 +50,11 @@ const workflow = createWorkflow(
})
// executed without condition
- return anotherStep(result)
+ const anotherStepResult = anotherStep(result)
+
+ return new WorkflowResponse(
+ anotherStepResult
+ )
}
)
```
diff --git a/www/apps/book/app/advanced-development/workflows/long-running-workflow/page.mdx b/www/apps/book/app/advanced-development/workflows/long-running-workflow/page.mdx
index 2b1301ea2a..34bef1eb33 100644
--- a/www/apps/book/app/advanced-development/workflows/long-running-workflow/page.mdx
+++ b/www/apps/book/app/advanced-development/workflows/long-running-workflow/page.mdx
@@ -22,10 +22,11 @@ A workflow is considered long-running if at least one step has its `async` confi
For example, consider the following workflow and steps:
-```ts title="src/workflows/hello-world.ts" highlights={[["14"]]} collapsibleLines="1-10" expandButtonLabel="Show More"
+```ts title="src/workflows/hello-world.ts" highlights={[["15"]]} collapsibleLines="1-11" expandButtonLabel="Show More"
import {
createStep,
createWorkflow,
+ WorkflowResponse,
StepResponse,
} from "@medusajs/workflows-sdk"
@@ -54,9 +55,9 @@ const myWorkflow = createWorkflow(
step2()
const message = step3()
- return {
+ return new WorkflowResponse({
message,
- }
+ })
})
export default myWorkflow
diff --git a/www/apps/book/app/advanced-development/workflows/parallel-steps/page.mdx b/www/apps/book/app/advanced-development/workflows/parallel-steps/page.mdx
index cd9ed6d167..a50f845d91 100644
--- a/www/apps/book/app/advanced-development/workflows/parallel-steps/page.mdx
+++ b/www/apps/book/app/advanced-development/workflows/parallel-steps/page.mdx
@@ -15,13 +15,14 @@ The workflow waits until all steps passed to the `parallelize` function finish e
For example:
export const highlights = [
- ["21", "[prices, productSalesChannel]", "The result of the steps. `prices` is the result of `createPricesStep`, and `productSalesChannel` is the result of `attachProductToSalesChannelStep`."],
- ["21", "parallelize", "Run the steps passed as parameters in parallel."],
+ ["22", "[prices, productSalesChannel]", "The result of the steps. `prices` is the result of `createPricesStep`, and `productSalesChannel` is the result of `attachProductToSalesChannelStep`."],
+ ["22", "parallelize", "Run the steps passed as parameters in parallel."],
]
```ts highlights={highlights} collapsibleLines="1-12" expandButtonLabel="Show Imports"
import {
createWorkflow,
+ WorkflowResponse,
parallelize,
} from "@medusajs/workflows-sdk"
import {
@@ -46,7 +47,9 @@ const myWorkflow = createWorkflow(
)
const id = product.id
- return getProductStep(product.id)
+ const refetchedProduct = getProductStep(product.id)
+
+ return new WorkflowResponse(refetchedProduct)
}
)
```
diff --git a/www/apps/book/app/advanced-development/workflows/retry-failed-steps/page.mdx b/www/apps/book/app/advanced-development/workflows/retry-failed-steps/page.mdx
index c232d5740a..103a7a80d9 100644
--- a/www/apps/book/app/advanced-development/workflows/retry-failed-steps/page.mdx
+++ b/www/apps/book/app/advanced-development/workflows/retry-failed-steps/page.mdx
@@ -14,10 +14,11 @@ You can configure the step to retry on failure. The `createStep` function can ac
For example:
-```ts title="src/workflows/hello-world.ts" highlights={[["9"]]} collapsibleLines="1-5" expandButtonLabel="Show Imports"
+```ts title="src/workflows/hello-world.ts" highlights={[["10"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports"
import {
createStep,
createWorkflow,
+ WorkflowResponse,
} from "@medusajs/workflows-sdk"
const step1 = createStep(
@@ -37,9 +38,9 @@ const myWorkflow = createWorkflow(
function () {
const str1 = step1()
- return {
+ return new WorkflowResponse({
message: str1,
- }
+ })
})
export default myWorkflow
diff --git a/www/apps/book/app/advanced-development/workflows/workflow-timeout/page.mdx b/www/apps/book/app/advanced-development/workflows/workflow-timeout/page.mdx
index a586ea8895..9e38a37992 100644
--- a/www/apps/book/app/advanced-development/workflows/workflow-timeout/page.mdx
+++ b/www/apps/book/app/advanced-development/workflows/workflow-timeout/page.mdx
@@ -20,10 +20,11 @@ Timeout doesn't stop the execution of a running step. The timeout only affects t
For example:
-```ts title="src/workflows/hello-world.ts" highlights={[["15"]]} collapsibleLines="1-12" expandButtonLabel="Show More"
+```ts title="src/workflows/hello-world.ts" highlights={[["16"]]} collapsibleLines="1-13" expandButtonLabel="Show More"
import {
createStep,
createWorkflow,
+ WorkflowResponse,
} from "@medusajs/workflows-sdk"
const step1 = createStep(
@@ -39,9 +40,9 @@ const myWorkflow = createWorkflow({
}, function () {
const str1 = step1()
- return {
+ return new WorkflowResponse({
message: str1,
- }
+ })
})
export default myWorkflow
diff --git a/www/apps/book/app/basics/workflows/page.mdx b/www/apps/book/app/basics/workflows/page.mdx
index b90e5962b1..b5bb622869 100644
--- a/www/apps/book/app/basics/workflows/page.mdx
+++ b/www/apps/book/app/basics/workflows/page.mdx
@@ -56,6 +56,7 @@ Next, add the following to the same file to create the workflow using the `creat
import {
// other imports...
createWorkflow,
+ WorkflowResponse,
} from "@medusajs/workflows-sdk"
// ...
@@ -67,9 +68,9 @@ const myWorkflow = createWorkflow(
// to pass input
const str2 = step2(input)
- return {
+ return new WorkflowResponse({
message: str1,
- }
+ })
}
)
@@ -78,6 +79,8 @@ export default myWorkflow
This creates a `hello-world` workflow. When you create a workflow, it’s constructed but not executed yet.
+The workflow must return an instance of `WorkflowResponse`, whose first parameter is returned to workflow executors.
+
### 3. Execute the Workflow
You can execute a workflow from different resources within Medusa.
@@ -223,19 +226,20 @@ Each step in the workflow receives as a second parameter a `context` object. The
For example:
export const highlights = [
- ["11", "resolve", "Resolve the Product Module's main service."],
+ ["12", "resolve", "Resolve the Product Module's main service."],
[
- "11",
+ "12",
"ModuleRegistrationName.PRODUCT",
"The resource registration name imported from `@medusajs/modules-sdk`.",
],
]
-```ts title="src/workflows/product-count.ts" highlights={highlights} collapsibleLines="1-12" expandButtonLabel="Show Imports"
+```ts title="src/workflows/product-count.ts" highlights={highlights} collapsibleLines="1-9" expandButtonLabel="Show Imports"
import {
createStep,
StepResponse,
createWorkflow,
+ WorkflowResponse,
} from "@medusajs/workflows-sdk"
import { IProductModuleService } from "@medusajs/types"
import { ModuleRegistrationName } from "@medusajs/utils"
@@ -254,9 +258,9 @@ const myWorkflow = createWorkflow(
function () {
const count = step1()
- return {
+ return new WorkflowResponse({
count,
- }
+ })
}
)
diff --git a/www/apps/book/sidebar.mjs b/www/apps/book/sidebar.mjs
index 3228846971..ff74077fdd 100644
--- a/www/apps/book/sidebar.mjs
+++ b/www/apps/book/sidebar.mjs
@@ -207,6 +207,10 @@ export const sidebar = sidebarAttachHrefCommonOptions(
path: "/advanced-development/workflows/compensation-function",
title: "Compensation Function",
},
+ {
+ path: "/advanced-development/workflows/add-workflow-hook",
+ title: "Workflow Hooks",
+ },
{
path: "/advanced-development/workflows/access-workflow-errors",
title: "Access Workflow Errors",
diff --git a/www/apps/resources/app/commerce-modules/auth/auth-identity-and-actor-types/page.mdx b/www/apps/resources/app/commerce-modules/auth/auth-identity-and-actor-types/page.mdx
index 9651fe1a25..96e7a49a91 100644
--- a/www/apps/resources/app/commerce-modules/auth/auth-identity-and-actor-types/page.mdx
+++ b/www/apps/resources/app/commerce-modules/auth/auth-identity-and-actor-types/page.mdx
@@ -33,7 +33,7 @@ export const highlights = [
```ts title="src/api/middlewares.ts" highlights={highlights}
import {
defineMiddlewares,
- authenticate
+ authenticate,
} from "@medusajs/medusa"
export default defineMiddlewares({
diff --git a/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx b/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx
index 107c38ff0d..371b8e1daa 100644
--- a/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx
+++ b/www/apps/resources/app/commerce-modules/auth/create-actor-type/page.mdx
@@ -37,10 +37,10 @@ Start by creating a workflow that does two things:
For example, create the file `src/workflows/create-manager.ts`. with the following content:
export const workflowHighlights = [
- ["20", "createManagerStep", "Thi step creates a manager."],
- ["37", "createManagerWorkflow", "The workflow used to create a manager and set its auth identity's actor type."],
- ["44", "setAuthAppMetadataStep", "Set the actor type of the manager's associated auth identity."],
- ["46", '"manager"', "The actor type of the manager."]
+ ["21", "createManagerStep", "Thi step creates a manager."],
+ ["38", "createManagerWorkflow", "The workflow used to create a manager and set its auth identity's actor type."],
+ ["45", "setAuthAppMetadataStep", "Set the actor type of the manager's associated auth identity."],
+ ["47", '"manager"', "The actor type of the manager."]
]
```ts title="src/workflows/create-manager.ts" highlights={workflowHighlights}
@@ -48,6 +48,7 @@ import {
createWorkflow,
createStep,
StepResponse,
+ WorkflowResponse,
} from "@medusajs/workflows-sdk"
import {
setAuthAppMetadataStep,
@@ -93,7 +94,7 @@ const createManagerWorkflow = createWorkflow(
value: manager.id,
})
- return manager
+ return new WorkflowResponse(manager)
}
)
@@ -184,7 +185,7 @@ export const middlewareHighlights = [
```ts title="src/api/middlewares.ts" highlights={middlewareHighlights}
import {
defineMiddlewares,
- authenticate
+ authenticate,
} from "@medusajs/medusa"
export default defineMiddlewares({
diff --git a/www/apps/resources/app/commerce-modules/product/guides/price/page.mdx b/www/apps/resources/app/commerce-modules/product/guides/price/page.mdx
index ba271dbdab..45ce4d0050 100644
--- a/www/apps/resources/app/commerce-modules/product/guides/price/page.mdx
+++ b/www/apps/resources/app/commerce-modules/product/guides/price/page.mdx
@@ -30,15 +30,15 @@ const query = remoteQueryObjectFromString({
fields: [
"*",
"variants.*",
- "variants.prices.*"
+ "variants.prices.*",
],
variables: {
filters: {
id: [
- "prod_123"
- ]
+ "prod_123",
+ ],
},
- }
+ },
})
// `result` is array of products
@@ -72,19 +72,19 @@ const query = remoteQueryObjectFromString({
fields: [
"*",
"variants.*",
- "variants.calculated_price.*"
+ "variants.calculated_price.*",
],
variables: {
filters: {
- id
+ id,
},
"variants.calculated_price": {
context: {
region_id: "reg_01J3MRPDNXXXDSCC76Y6YCZARS",
- currency_code: "eur"
- }
- }
- }
+ currency_code: "eur",
+ },
+ },
+ },
})
// `result` is array of products
diff --git a/www/apps/resources/app/deployment/admin/vercel/page.mdx b/www/apps/resources/app/deployment/admin/vercel/page.mdx
index 5f1c68e582..125025f48f 100644
--- a/www/apps/resources/app/deployment/admin/vercel/page.mdx
+++ b/www/apps/resources/app/deployment/admin/vercel/page.mdx
@@ -35,7 +35,7 @@ module.exports = defineConfig({
admin: {
disable: process.env.DISABLE_MEDUSA_ADMIN === "true",
backendUrl: process.env.MEDUSA_BACKEND_URL,
- path: process.env.MEDUSA_ADMIN_PATH
+ path: process.env.MEDUSA_ADMIN_PATH,
},
})
```
diff --git a/www/apps/resources/app/deployment/medusa-application/railway/page.mdx b/www/apps/resources/app/deployment/medusa-application/railway/page.mdx
index cb5ecc3b26..405225fc64 100644
--- a/www/apps/resources/app/deployment/medusa-application/railway/page.mdx
+++ b/www/apps/resources/app/deployment/medusa-application/railway/page.mdx
@@ -50,7 +50,7 @@ So, add the following configuration in `medusa-config.js`:
module.exports = defineConfig({
projectConfig: {
// ...
- workerMode: process.env.MEDUSA_WORKER_MODE
+ workerMode: process.env.MEDUSA_WORKER_MODE,
},
})
@@ -77,8 +77,8 @@ Add the following configuration in `medusa-config.js`:
module.exports = defineConfig({
// ...
admin: {
- disable: process.env.DISABLE_MEDUSA_ADMIN === "true"
- }
+ disable: process.env.DISABLE_MEDUSA_ADMIN === "true",
+ },
})
```
@@ -93,7 +93,7 @@ Add the following configuration in `medusa-config.js` :
module.exports = defineConfig({
projectConfig: {
// ...
- redisUrl: process.env.REDIS_URL
+ redisUrl: process.env.REDIS_URL,
},
})
@@ -142,7 +142,7 @@ For example, add the following dependencies in `package.json` for the Cache, Eve
Then, add these modules in `medusa-config.js`:
```js title="medusa-config.js"
-import { Modules } from '@medusajs/utils'
+import { Modules } from "@medusajs/utils"
module.exports = defineConfig({
// ...
@@ -167,8 +167,8 @@ module.exports = defineConfig({
url: process.env.REDIS_URL,
},
},
- }
- }
+ },
+ },
})
```
@@ -293,7 +293,7 @@ module.exports = defineConfig({
// ...
admin: {
// ...
- backendUrl: process.env.MEDUSA_BACKEND_URL
+ backendUrl: process.env.MEDUSA_BACKEND_URL,
},
})
```
diff --git a/www/apps/resources/app/recipes/commerce-automation/page.mdx b/www/apps/resources/app/recipes/commerce-automation/page.mdx
index 6286191e5c..2fa04e1c37 100644
--- a/www/apps/resources/app/recipes/commerce-automation/page.mdx
+++ b/www/apps/resources/app/recipes/commerce-automation/page.mdx
@@ -485,7 +485,7 @@ export const syncProductsWorkflowHighlight = [
import {
StepResponse,
createStep,
- createWorkflow
+ createWorkflow,
} from "@medusajs/workflows-sdk"
type RetrieveStoreStepInput = {
@@ -597,9 +597,7 @@ export const syncProductsWorkflowHighlight = [
store_id: string
}
- export const syncProductsWorkflow = createWorkflow<
- SyncProductsWorkflowInput, {}
- >(
+ export const syncProductsWorkflow = createWorkflow(
"sync-products-workflow",
function ({ store_id }: SyncProductsWorkflowInput) {
const { store } = retrieveStoreStep({
diff --git a/www/apps/resources/app/recipes/integrate-ecommerce-stack/page.mdx b/www/apps/resources/app/recipes/integrate-ecommerce-stack/page.mdx
index 895b13ca47..64a9015b13 100644
--- a/www/apps/resources/app/recipes/integrate-ecommerce-stack/page.mdx
+++ b/www/apps/resources/app/recipes/integrate-ecommerce-stack/page.mdx
@@ -163,24 +163,25 @@ Workflows guarantee data consistency through their compensation feature. You can
For example, create the following workflow in `src/workflows/create-product.ts`:
export const workflowHighlights = [
- ["18", "createInErpStep", "A step that creates a product in the ERP system."],
- ["21", "erpModuleService", "Resolve the ERP Module's main service."],
- ["24", "productModuleService", "Resolve the Product Module's main service."],
- ["28", "retrieve", "Retrieve the created product's data."],
- ["30", "createProduct", "Create the product in the ERP system."],
- ["34", "update", "Update the product in Medusa with the ID of the ERP product."],
- ["43", "erpId", "Pass the ERP product's ID to the compensation function."],
- ["44", "productId", "Pass the product's ID to the compensation function."],
- ["46", "", "Define a compensation function that rolls back changes when an error occurs."],
- ["53", "deleteProduct", "Undo creating the product in the ERP system by deleting it."],
- ["54", "update", "Update the product in Medusa to remove the ERP product's ID."]
+ ["19", "createInErpStep", "A step that creates a product in the ERP system."],
+ ["22", "erpModuleService", "Resolve the ERP Module's main service."],
+ ["25", "productModuleService", "Resolve the Product Module's main service."],
+ ["29", "retrieve", "Retrieve the created product's data."],
+ ["31", "createProduct", "Create the product in the ERP system."],
+ ["35", "update", "Update the product in Medusa with the ID of the ERP product."],
+ ["44", "erpId", "Pass the ERP product's ID to the compensation function."],
+ ["45", "productId", "Pass the product's ID to the compensation function."],
+ ["47", "", "Define a compensation function that rolls back changes when an error occurs."],
+ ["54", "deleteProduct", "Undo creating the product in the ERP system by deleting it."],
+ ["55", "update", "Update the product in Medusa to remove the ERP product's ID."]
]
- ```ts title="src/workflows/create-product.ts" highlights={workflowHighlights} collapsibleLines="1-9" expandButtonLabel="Show Imports"
+ ```ts title="src/workflows/create-product.ts" highlights={workflowHighlights} collapsibleLines="1-10" expandButtonLabel="Show Imports"
import {
createStep,
StepResponse,
- createWorkflow
+ createWorkflow,
+ WorkflowResponse,
} from "@medusajs/workflows-sdk"
import { IProductModuleService } from "@medusajs/types"
import { ModuleRegistrationName } from "@medusajs/utils"
@@ -240,7 +241,7 @@ export const workflowHighlights = [
>("create-product-in-systems", function (input) {
const erpData = createInErpStep(input)
- return erpData
+ return new WorkflowResponse(erpData)
})
export default createProductWorkflow
diff --git a/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx b/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx
index bf622d034d..f33ac22a49 100644
--- a/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx
+++ b/www/apps/resources/app/recipes/marketplace/examples/vendors/page.mdx
@@ -292,12 +292,15 @@ In the compensation function, which runs if an error occurs in the workflow, it
Then, create the workflow at `src/workflows/marketplace/create-vendor-admin/index.ts` with the following content:
export const vendorAdminWorkflowHighlights = [
- ["20", "createVendorAdminStep", "Create the vendor admin."],
- ["24", "setAuthAppMetadataStep", "Step is imported from `@medusajs/core-flows`."]
+ ["23", "createVendorAdminStep", "Create the vendor admin."],
+ ["27", "setAuthAppMetadataStep", "Step is imported from `@medusajs/core-flows`."]
]
```ts title="src/workflows/marketplace/create-vendor-admin/index.ts" highlights={vendorAdminWorkflowHighlights}
-import { createWorkflow } from "@medusajs/workflows-sdk"
+import {
+ createWorkflow,
+ WorkflowResponse,
+} from "@medusajs/workflows-sdk"
import {
setAuthAppMetadataStep,
} from "@medusajs/core-flows"
@@ -326,7 +329,7 @@ const createVendorAdminWorkflow = createWorkflow(
value: vendorAdmin.id,
})
- return vendorAdmin
+ return new WorkflowResponse(vendorAdmin)
}
)
@@ -457,7 +460,7 @@ Next, create the file `src/api/middlewares.ts` with the following content:
```ts title="src/api/middlewares.ts"
import {
defineMiddlewares,
- authenticate
+ authenticate,
} from "@medusajs/medusa"
export default defineMiddlewares({
@@ -709,13 +712,13 @@ Finally, in `src/api/middlewares.ts`, apply a middleware on the create products
```ts title="src/api/middlewares.ts"
import {
defineMiddlewares,
- authenticate
+ authenticate,
} from "@medusajs/medusa"
import {
- validateAndTransformBody
+ validateAndTransformBody,
} from "@medusajs/medusa/dist/api/utils/validate-body"
import {
- AdminCreateProduct
+ AdminCreateProduct,
} from "@medusajs/medusa/dist/api/admin/products/validators"
export default defineMiddlewares({
@@ -1002,7 +1005,7 @@ try {
const items = vendorsItems[vendorId]
const vendor = vendors.find((v) => v.id === vendorId)!
- const {result: childOrder} = await createOrdersWorkflow(
+ const { result: childOrder } = await createOrdersWorkflow(
container
)
.run({
@@ -1123,19 +1126,22 @@ The compensation function cancels all child orders received from the step. It us
Finally, create the workflow at the file `src/workflows/marketplace/create-vendor-orders/index.ts`:
export const createVendorOrdersWorkflowHighlights = [
- ["18", "useRemoteQueryStep", "Retrieve the cart's details."],
- ["26", "completeCartWorkflow", "Create the parent order from the cart."],
- ["32", "groupVendorItemsStep", "Group the items by their vendor."],
- ["39", "createVendorOrdersStep", "Create child orders for each vendor"],
- ["44", "createRemoteLinkStep", "Create the links returned by the previous step."]
+ ["21", "useRemoteQueryStep", "Retrieve the cart's details."],
+ ["29", "completeCartWorkflow", "Create the parent order from the cart."],
+ ["35", "groupVendorItemsStep", "Group the items by their vendor."],
+ ["42", "createVendorOrdersStep", "Create child orders for each vendor"],
+ ["47", "createRemoteLinkStep", "Create the links returned by the previous step."]
]
-```ts title="src/workflows/marketplace/create-vendor-orders/index.ts" collapsibleLines="1-10" expandMoreLabel="Show Imports"
-import { createWorkflow } from "@medusajs/workflows-sdk"
+```ts title="src/workflows/marketplace/create-vendor-orders/index.ts" collapsibleLines="1-13" expandMoreLabel="Show Imports"
+import {
+ createWorkflow,
+ WorkflowResponse,
+} from "@medusajs/workflows-sdk"
import {
useRemoteQueryStep,
createRemoteLinkStep,
- completeCartWorkflow
+ completeCartWorkflow,
} from "@medusajs/core-flows"
import { CartDTO } from "@medusajs/types"
import groupVendorItemsStep from "./steps/group-vendor-items"
@@ -1150,7 +1156,7 @@ const createVendorOrdersWorkflow = createWorkflow(
(input: WorkflowInput) => {
const cart = useRemoteQueryStep({
entry_point: "cart",
- fields: ['items.*'],
+ fields: ["items.*"],
variables: { id: input.cart_id },
list: false,
throw_if_key_not_found: true,
@@ -1158,28 +1164,28 @@ const createVendorOrdersWorkflow = createWorkflow(
const order = completeCartWorkflow.runAsStep({
input: {
- id: cart.id
- }
+ id: cart.id,
+ },
})
const { vendorsItems } = groupVendorItemsStep({
- cart
+ cart,
})
const {
orders: vendorOrders,
- linkDefs
+ linkDefs,
} = createVendorOrdersStep({
parentOrder: order,
- vendorsItems
+ vendorsItems,
})
createRemoteLinkStep(linkDefs)
- return {
+ return new WorkflowResponse({
parent_order: order,
- vendor_orders: vendorOrders
- }
+ vendor_orders: vendorOrders,
+ })
}
)
diff --git a/www/apps/resources/app/service-factory-reference/methods/create/page.mdx b/www/apps/resources/app/service-factory-reference/methods/create/page.mdx
index a1bc9d8ea6..31cd83de04 100644
--- a/www/apps/resources/app/service-factory-reference/methods/create/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/create/page.mdx
@@ -17,8 +17,8 @@ const post = await postModuleService.createPosts({
name: "My Post",
published_at: new Date(),
metadata: {
- external_id: "1234"
- }
+ external_id: "1234",
+ },
})
```
@@ -32,12 +32,12 @@ If an object is passed of the method, an object of the created record is also re
const posts = await postModuleService.createPosts([
{
name: "My Post",
- published_at: new Date()
+ published_at: new Date(),
},
{
name: "My Other Post",
- published_at: new Date()
- }
+ published_at: new Date(),
+ },
])
```
diff --git a/www/apps/resources/app/service-factory-reference/methods/delete/page.mdx b/www/apps/resources/app/service-factory-reference/methods/delete/page.mdx
index 078f4ceff5..852eef29f4 100644
--- a/www/apps/resources/app/service-factory-reference/methods/delete/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/delete/page.mdx
@@ -25,7 +25,7 @@ To delete one record, pass its ID as a parameter of the method.
```ts
await postModuleService.deletePosts([
"123",
- "321"
+ "321",
])
```
@@ -37,7 +37,7 @@ To delete multiple records, pass an array of IDs as a parameter of the method.
```ts
await postModuleService.deletePosts({
- name: "My Post"
+ name: "My Post",
})
```
diff --git a/www/apps/resources/app/service-factory-reference/methods/list/page.mdx b/www/apps/resources/app/service-factory-reference/methods/list/page.mdx
index 3bc1d19b71..7d01634e04 100644
--- a/www/apps/resources/app/service-factory-reference/methods/list/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/list/page.mdx
@@ -24,7 +24,7 @@ If no parameters are passed, the method returns an array of the first `15` recor
```ts
const posts = await postModuleService.listPosts({
- id: ["123", "321"]
+ id: ["123", "321"],
})
```
@@ -54,7 +54,7 @@ This applies to relations between data models of the same module. To retrieve li
```ts
const posts = await postModuleService.listPosts({}, {
- relations: ["author"]
+ relations: ["author"],
})
```
@@ -72,7 +72,7 @@ The method returns an array of the first `15` records matching the filters.
```ts
const posts = await postModuleService.listPosts({}, {
- select: ["id", "name"]
+ select: ["id", "name"],
})
```
@@ -93,7 +93,7 @@ The method returns an array of the first `15` records matching the filters.
```ts
const posts = await postModuleService.listPosts({}, {
take: 20,
- skip: 10
+ skip: 10,
})
```
@@ -115,8 +115,8 @@ The method returns an array of records. The number of records is less than or eq
```ts
const posts = await postModuleService.listPosts({}, {
order: {
- name: "ASC"
- }
+ name: "ASC",
+ },
})
```
diff --git a/www/apps/resources/app/service-factory-reference/methods/listAndCount/page.mdx b/www/apps/resources/app/service-factory-reference/methods/listAndCount/page.mdx
index b3dc2bcaaf..a9507e9c47 100644
--- a/www/apps/resources/app/service-factory-reference/methods/listAndCount/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/listAndCount/page.mdx
@@ -27,7 +27,7 @@ If no parameters are passed, the method returns an array with two items:
```ts
const [posts, count] = await postModuleService.listAndCountPosts({
- id: ["123", "321"]
+ id: ["123", "321"],
})
```
@@ -60,7 +60,7 @@ This applies to relations between data models of the same module. To retrieve li
```ts
const [posts, count] = await postModuleService.listAndCountPosts({}, {
- relations: ["author"]
+ relations: ["author"],
})
```
@@ -81,7 +81,7 @@ The method returns an array with two items:
```ts
const [posts, count] = await postModuleService.listAndCountPosts({}, {
- select: ["id", "name"]
+ select: ["id", "name"],
})
```
@@ -105,7 +105,7 @@ The method returns an array with two items:
```ts
const [posts, count] = await postModuleService.listAndCountPosts({}, {
take: 20,
- skip: 10
+ skip: 10,
})
```
@@ -130,8 +130,8 @@ The method returns an array with two items:
```ts
const [posts, count] = await postModuleService.listAndCountPosts({}, {
order: {
- name: "ASC"
- }
+ name: "ASC",
+ },
})
```
diff --git a/www/apps/resources/app/service-factory-reference/methods/restore/page.mdx b/www/apps/resources/app/service-factory-reference/methods/restore/page.mdx
index 0c0994a26f..f9bfbc8a9d 100644
--- a/www/apps/resources/app/service-factory-reference/methods/restore/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/restore/page.mdx
@@ -28,7 +28,7 @@ For example, the returned object of the above example is:
```ts
restoredPosts = {
- post_id: ["123"]
+ post_id: ["123"],
}
```
@@ -39,7 +39,7 @@ restoredPosts = {
```ts
const restoredPosts = await postModuleService.restorePosts([
"123",
- "321"
+ "321",
])
```
@@ -57,8 +57,8 @@ For example, the returned object of the above example is:
restoredPosts = {
post_id: [
"123",
- "321"
- ]
+ "321",
+ ],
}
```
@@ -68,7 +68,7 @@ restoredPosts = {
```ts
const restoredPosts = await postModuleService.restorePosts({
- name: "My Post"
+ name: "My Post",
})
```
@@ -91,7 +91,7 @@ For example, the returned object of the above example is:
```ts
restoredPosts = {
post_id: [
- "123"
- ]
+ "123",
+ ],
}
```
\ No newline at end of file
diff --git a/www/apps/resources/app/service-factory-reference/methods/retrieve/page.mdx b/www/apps/resources/app/service-factory-reference/methods/retrieve/page.mdx
index 982963f25b..81bdf24ecb 100644
--- a/www/apps/resources/app/service-factory-reference/methods/retrieve/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/retrieve/page.mdx
@@ -36,7 +36,7 @@ This applies to relations between data models of the same module. To retrieve li
```ts
const post = await postModuleService.retrievePost("123", {
- relations: ["author"]
+ relations: ["author"],
})
```
@@ -54,7 +54,7 @@ The method returns the record as an object.
```ts
const post = await postModuleService.retrievePost("123", {
- select: ["id", "name"]
+ select: ["id", "name"],
})
```
diff --git a/www/apps/resources/app/service-factory-reference/methods/soft-delete/page.mdx b/www/apps/resources/app/service-factory-reference/methods/soft-delete/page.mdx
index 19960e0315..d820d43666 100644
--- a/www/apps/resources/app/service-factory-reference/methods/soft-delete/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/soft-delete/page.mdx
@@ -30,7 +30,7 @@ For example, the returned object of the above example is:
```ts
deletedPosts = {
- post_id: ["123"]
+ post_id: ["123"],
}
```
@@ -41,7 +41,7 @@ deletedPosts = {
```ts
const deletedPosts = await postModuleService.softDeletePosts([
"123",
- "321"
+ "321",
])
```
@@ -59,8 +59,8 @@ For example, the returned object of the above example is:
deletedPosts = {
post_id: [
"123",
- "321"
- ]
+ "321",
+ ],
}
```
@@ -70,7 +70,7 @@ deletedPosts = {
```ts
const deletedPosts = await postModuleService.softDeletePosts({
- name: "My Post"
+ name: "My Post",
})
```
@@ -92,6 +92,6 @@ For example, the returned object of the above example is:
```ts
deletedPosts = {
- post_id: ["123"]
+ post_id: ["123"],
}
```
\ No newline at end of file
diff --git a/www/apps/resources/app/service-factory-reference/methods/update/page.mdx b/www/apps/resources/app/service-factory-reference/methods/update/page.mdx
index 8a97a0e4d3..1d6305043d 100644
--- a/www/apps/resources/app/service-factory-reference/methods/update/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/methods/update/page.mdx
@@ -15,7 +15,7 @@ This method updates one or more records of the data model.
```ts
const post = await postModuleService.updatePosts({
id: "123",
- name: "My Post"
+ name: "My Post",
})
```
@@ -37,12 +37,12 @@ The method returns the updated record as an object.
const posts = await postModuleService.updatePosts([
{
id: "123",
- name: "My Post"
+ name: "My Post",
},
{
id: "321",
- published_at: new Date()
- }
+ published_at: new Date(),
+ },
])
```
@@ -63,11 +63,11 @@ The method returns an array of objects of updated records.
```ts
const posts = await postModuleService.updatePosts({
selector: {
- name: "My Post"
+ name: "My Post",
},
data: {
- published_at: new Date()
- }
+ published_at: new Date(),
+ },
})
```
@@ -98,22 +98,22 @@ The method returns an array of objects of updated records.
const posts = await postModuleService.updatePosts([
{
selector: {
- name: "My Post"
+ name: "My Post",
},
data: {
- published_at: new Date()
- }
+ published_at: new Date(),
+ },
},
{
selector: {
- name: "Another Post"
+ name: "Another Post",
},
data: {
metadata: {
- external_id: "123"
- }
- }
- }
+ external_id: "123",
+ },
+ },
+ },
])
```
diff --git a/www/apps/resources/app/service-factory-reference/tips/filtering/page.mdx b/www/apps/resources/app/service-factory-reference/tips/filtering/page.mdx
index 80792a4113..9f4c518b2c 100644
--- a/www/apps/resources/app/service-factory-reference/tips/filtering/page.mdx
+++ b/www/apps/resources/app/service-factory-reference/tips/filtering/page.mdx
@@ -40,8 +40,8 @@ In the example above, only posts having the name `My Post 2` are retrieved.
const posts = await postModuleService.listPosts({
views: [
50,
- 100
- ]
+ 100,
+ ],
})
```
@@ -57,9 +57,9 @@ In the example above, only posts having either `50` or `100` views are retrieved
const posts = await postModuleService.listPosts({
name: {
$nin: [
- "My Post"
- ]
- }
+ "My Post",
+ ],
+ },
})
```
@@ -80,8 +80,8 @@ This filter only applies to text-like properties, including `id` and `enum` prop
```ts
const posts = await postModuleService.listPosts({
name: {
- $like: "My%"
- }
+ $like: "My%",
+ },
})
```
@@ -102,8 +102,8 @@ This filter only applies to the `number` and `dateTime` properties.
```ts
const posts = await postModuleService.listPosts({
published_at: {
- $lt: new Date()
- }
+ $lt: new Date(),
+ },
})
```
@@ -128,8 +128,8 @@ endToday.setHours(23, 59, 59, 59)
const posts = await postModuleService.listPosts({
published_at: {
$gte: startToday,
- $lte: endToday
- }
+ $lte: endToday,
+ },
})
```
@@ -149,10 +149,10 @@ const posts = await postModuleService.listPosts({
},
{
published_at: {
- $lt: new Date()
- }
- }
- ]
+ $lt: new Date(),
+ },
+ },
+ ],
})
```
diff --git a/www/apps/resources/app/storefront-development/products/price/examples/tax-price/page.mdx b/www/apps/resources/app/storefront-development/products/price/examples/tax-price/page.mdx
index dbc5af259c..ab226e4933 100644
--- a/www/apps/resources/app/storefront-development/products/price/examples/tax-price/page.mdx
+++ b/www/apps/resources/app/storefront-development/products/price/examples/tax-price/page.mdx
@@ -25,7 +25,7 @@ export const fetchHighlights = [
const queryParams = new URLSearchParams({
fields: `*variants.calculated_price`,
region_id: region.id,
- country_code: region.countries[0].iso_2
+ country_code: region.countries[0].iso_2,
})
fetch(`http://localhost:9000/store/products/${id}?${queryParams.toString()}`, {
@@ -135,7 +135,7 @@ export default function Product({ params: { id } }: Params) {
const queryParams = new URLSearchParams({
fields: `*variants.calculated_price`,
region_id: region.id,
- country_code: region.countries[0].iso_2
+ country_code: region.countries[0].iso_2,
})
fetch(`http://localhost:9000/store/products/${id}?${queryParams.toString()}`, {