diff --git a/www/apps/resources/app/commerce-modules/api-key/examples/page.mdx b/www/apps/resources/app/commerce-modules/api-key/examples/page.mdx deleted file mode 100644 index 141a434e47229..0000000000000 --- a/www/apps/resources/app/commerce-modules/api-key/examples/page.mdx +++ /dev/null @@ -1,306 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the API Key Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the API Key Module in your application. - - - -You should only use the API Key Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create an API Key - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const apiKeyModuleService = request.scope.resolve( - Modules.API_KEY - ) - - const apiKey = await apiKeyModuleService.createApiKeys({ - title: "Publishable API key", - type: "publishable", - created_by: "user_123", - }) - - res.json({ - api_key: apiKey, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeApiKeyModule } from "@medusajs/medusa/api-key" - -export async function POST(request: Request) { - const apiKeyModuleService = await initializeApiKeyModule() - - const apiKey = await apiKeyModuleService.createApiKeys({ - title: "Publishable API key", - type: "publishable", - created_by: "user_123", - }) - - return NextResponse.json({ - api_key: apiKey, - }) -} -``` - - - - ---- - -## List API Keys - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET(request: MedusaRequest, res: MedusaResponse) { - const apiKeyModuleService = request.scope.resolve( - Modules.API_KEY - ) - - res.json({ - api_keys: await apiKeyModuleService.listApiKeys(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeApiKeyModule } from "@medusajs/medusa/api-key" - -export async function GET(request: Request) { - const apiKeyModuleService = await initializeApiKeyModule() - - return NextResponse.json({ - api_keys: await apiKeyModuleService.listApiKeys(), - }) -} -``` - - - - ---- - -## Revoke an API Key - - - - -```ts collapsibleLines="1-9" expandButtonLabel="Show Imports" -import { AuthenticatedMedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: AuthenticatedMedusaRequest, - res: MedusaResponse -) { - const apiKeyModuleService = request.scope.resolve( - Modules.API_KEY - ) - - const revokedKey = await apiKeyModuleService.revoke(request.params.id, { - revoked_by: request.auth_context.actor_id, - }) - - res.json({ - api_key: revokedKey, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeApiKeyModule } from "@medusajs/medusa/api-key" - -type ContextType = { - params: { - id: string - user_id: string - } -} - -export async function POST(request: Request, { params }: ContextType) { - const apiKeyModuleService = await initializeApiKeyModule() - - const revokedKey = await apiKeyModuleService.revoke(params.id, { - revoked_by: params.user_id, - }) - - return NextResponse.json({ - api_key: revokedKey, - }) -} -``` - - - - ---- - -## Verify or Authenticate Token - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const apiKeyModuleService = request.scope.resolve( - Modules.API_KEY - ) - - const authenticatedToken = await apiKeyModuleService.authenticate( - request.params.token - ) - - res.json({ - is_authenticated: !!authenticatedToken, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeApiKeyModule } from "@medusajs/medusa/api-key" - -type ContextType = { - params: { - token: string - } -} - -export async function POST(request: Request, { params }: ContextType) { - const apiKeyModuleService = await initializeApiKeyModule() - - const authenticatedToken = await apiKeyModuleService.authenticate( - request.params.token - ) - - return NextResponse.json({ - is_authenticated: !!authenticatedToken, - }) -} -``` - - - - ---- - -## Roll API Key - - - - -```ts collapsibleLines="1-8" expandButtonLabel="Show Imports" -import { - AuthenticatedMedusaRequest, - MedusaResponse, -} from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: AuthenticatedMedusaRequest, - res: MedusaResponse -) { - const apiKeyModuleService = request.scope.resolve( - Modules.API_KEY - ) - - const revokedKey = await apiKeyModuleService.revoke(request.params.id, { - revoked_by: request.auth_context.actor_id, - }) - - const newKey = await apiKeyModuleService.createApiKeys({ - title: revokedKey.title, - type: revokedKey.type, - created_by: revokedKey.created_by, - }) - - res.json({ - api_key: newKey, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeApiKeyModule } from "@medusajs/medusa/api-key" - -type ContextType = { - params: { - id: string - user_id: string - } -} - -export async function POST(request: Request, { params }: ContextType) { - const apiKeyModuleService = await initializeApiKeyModule() - - const revokedKey = await apiKeyModuleService.revoke(params.id, { - revoked_by: params.user_id, - }) - - const newKey = await apiKeyModuleService.createApiKeys({ - title: revokedKey.title, - type: revokedKey.type, - created_by: revokedKey.created_by, - }) - - return NextResponse.json({ - api_key: newKey, - }) -} -``` - - - - ---- - -## More Examples - -The [API Key Module's main service reference](/references/api-key) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/api-key/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/api-key/links-to-other-modules/page.mdx index ed4bc382efc22..43a4548efb134 100644 --- a/www/apps/resources/app/commerce-modules/api-key/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/api-key/links-to-other-modules/page.mdx @@ -37,8 +37,8 @@ To retrieve the sales channels of an API key with [Query](!docs!/learn/fundament const { data: apiKeys } = await query.graph({ entity: "api_key", fields: [ - "sales_channels.*" - ] + "sales_channels.*", + ], }) // apiKeys.sales_channels @@ -55,8 +55,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: apiKeys } = useQueryGraphStep({ entity: "api_key", fields: [ - "sales_channels.*" - ] + "sales_channels.*", + ], }) // apiKeys.sales_channels diff --git a/www/apps/resources/app/commerce-modules/api-key/page.mdx b/www/apps/resources/app/commerce-modules/api-key/page.mdx index d6166d736d749..79811aa0b404a 100644 --- a/www/apps/resources/app/commerce-modules/api-key/page.mdx +++ b/www/apps/resources/app/commerce-modules/api-key/page.mdx @@ -1,4 +1,4 @@ -import { CodeTabs, CodeTab } from "docs-ui" +import { CodeTabs, CodeTab, ChildDocs } from "docs-ui" export const metadata = { title: `API Key Module`, @@ -6,132 +6,153 @@ export const metadata = { # {metadata.title} -The API Key Module provides API-key-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the API Key Module and how to use it in your application. -## How to Use API Key Module's Service +Medusa has API-key related features available out-of-the-box through the API Key Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this API Key Module. -Use the API Key Module's main service by resolving from the Medusa container the resource `Modules.API_KEY`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## API Key Features -const step1 = createStep("step-1", async (_, { container }) => { - const apiKeyModuleService = container.resolve( - Modules.API_KEY - ) +- [API Key Types and Management](./concepts/page.mdx): Manage API keys in your store. You can create both publishable and secret API keys for different use cases. +- [Token Verification](./concepts/page.mdx#token-verification): Verify tokens of secret API keys to authenticate users or actions. +- [Revoke Keys](./concepts/page.mdx#api-key-expiration): Revoke keys to disable their use permanently. +- Roll API Keys: Roll API keys by [revoking](/references/api-key/revoke) a key then [re-creating it](/references/api-key/createApiKeys). - const apiKeys = await apiKeyModuleService.listApiKeys() -}) -``` +--- - - +## How to Use the API Key Module -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const apiKeyModuleService = request.scope.resolve( - Modules.API_KEY - ) - - res.json({ - api_keys: await apiKeyModuleService.listApiKeys(), - }) -} -``` +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" +export const highlights = [ + ["12", "Modules.API_KEY", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-api-key.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -export default async function subscriberHandler({ container }: SubscriberArgs) { - const apiKeyModuleService = container.resolve( - Modules.API_KEY - ) - - const apiKeys = await apiKeyModuleService.listApiKeys() -} +const createApiKeyStep = createStep( + "create-api-key", + async ({}, { container }) => { + const apiKeyModuleService = container.resolve(Modules.API_KEY) + + const apiKey = await apiKeyModuleService.createApiKeys({ + title: "Publishable API key", + type: "publishable", + created_by: "user_123", + }) + + return new StepResponse({ apiKey }, apiKey.id) + }, + async (apiKeyId, { container }) => { + const apiKeyModuleService = container.resolve(Modules.API_KEY) + + await apiKeyModuleService.deleteApiKeys([apiKeyId]) + } +) + +export const createApiKeyWorkflow = createWorkflow( + "create-api-key", + () => { + const { apiKey } = createApiKeyStep() + + return new WorkflowResponse({ + apiKey, + }) + } +) ``` - - - ---- - -## Features - -### API Key Types and Management - -Manage API keys in your store. You can create both publishable and secret API keys for different use cases, such as: +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -- Publishable API Key associated with resources like sales channels. -- Authentication token for admin users to access Admin API Routes. -- Password reset tokens when a user or customer requests to reset their password. + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createApiKeyWorkflow } from "../../workflows/create-api-key" -```ts -const pubApiKey = await apiKeyModuleService.createApiKeys({ - title: "Publishable API key", - type: "publishable", - created_by: "user_123", -}) +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await createApiKeyWorkflow(req.scope) + .run() -const secretApiKey = await apiKeyModuleService.createApiKeys({ - title: "Authentication Key", - type: "secret", - created_by: "user_123", -}) + res.send(result) +} ``` -### Token Verification - -Verify tokens of secret API keys to authenticate users or actions, such as verifying a password reset token. - -```ts -const authenticatedToken = await apiKeyModuleService.authenticate("sk_123") + + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createApiKeyWorkflow } from "../workflows/create-api-key" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createApiKeyWorkflow(container) + .run() + + console.log(result) +} -if (!authenticatedToken) { - console.error("Couldn't verify token") -} else { - console.log("Token verified successfully!") +export const config: SubscriberConfig = { + event: "user.created", } ``` -### Revoke Keys - -Revoke keys to disable their use permenantly. + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createApiKeyWorkflow } from "../workflows/create-api-key" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createApiKeyWorkflow(container) + .run() + + console.log(result) +} -```ts -const revokedKey = await apiKeyModuleService.revoke("apk_1", { - revoked_by: "user_123", -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Roll API Keys + + -Roll API keys by revoking a key then re-creating it. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -```ts -const revokedKey = await apiKeyModuleService.revoke("apk_1", { - revoked_by: "user_123", -}) +--- -const newKey = await apiKeyModuleService.createApiKeys({ - title: revokedKey.title, - type: revokedKey.type, - created_by: revokedKey.created_by, -}) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/auth/examples/page.mdx b/www/apps/resources/app/commerce-modules/auth/examples/page.mdx deleted file mode 100644 index cfbc6170a66d0..0000000000000 --- a/www/apps/resources/app/commerce-modules/auth/examples/page.mdx +++ /dev/null @@ -1,444 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Auth Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Auth Module in your application. - - - -You should only use the Auth Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Authenticate User - - - -This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/jsonwebtoken) to create the authentication token. - - - - - - -```ts collapsibleLines="1-10" expandButtonLabel="Show Imports" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { - IAuthModuleService, - AuthenticationInput, -} from "@medusajs/framework/types" -import { Modules } from "@medusajs/framework/utils" -import { MedusaError } from "@medusajs/framework/utils" -import jwt from "jsonwebtoken" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const authModuleService = req.scope.resolve( - Modules.AUTH - ) - - const { success, authIdentity, location, error } = - await authModuleService.authenticate("emailpass", { - url: req.url, - headers: req.headers, - query: req.query, - body: req.body, - authScope: "admin", - protocol: req.protocol, - } as AuthenticationInput) - - if (!success) { - throw new MedusaError(MedusaError.Types.UNAUTHORIZED, error) - } - - if (location) { - res.json({ location }) - return - } - - const { jwtSecret } = req.scope.resolve("configModule").projectConfig.http - const token = jwt.sign(authIdentity, jwtSecret) - - res.status(200).json({ token }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeAuthModule } from "@medusajs/medusa/auth" - -export async function POST(request: Request) { - const authModuleService = await initializeAuthModule() - const url = new URL(request.url) - - const { success, authIdentity, location, error } = - await authModuleService.authenticate("emailpass", { - url: request.url, - headers: Object.fromEntries(request.headers), - query: Object.fromEntries(url.searchParams), - body: await request.json(), - authScope: "admin", - protocol: url.protocol, - } as AuthenticationInput) - - if (!success) { - throw new Error(error) - } - - if (location) { - return NextResponse.json({ location }) - } - - const token = jwt.sign(authIdentity, "supersecret") - - return NextResponse.json( - { - token, - }, - { - status: 200, - } - ) -} -``` - - - - ---- - -## Validate Callback - - - -This example uses the [jsonwebtoken NPM package](https://www.npmjs.com/package/jsonwebtoken) to create the authentication token. - - - - - - -```ts collapsibleLines="1-10" expandButtonLabel="Show Imports" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { - IAuthModuleService, - AuthenticationInput, -} from "@medusajs/framework/types" -import { Modules } from "@medusajs/framework/utils" -import { MedusaError } from "@medusajs/framework/utils" -import jwt from "jsonwebtoken" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const authModuleService = req.scope.resolve( - Modules.AUTH - ) - - const { success, authIdentity, error, successRedirectUrl } = - await authModuleService.validateCallback("google", { - url: req.url, - headers: req.headers, - query: req.query, - body: req.body, - authScope: "admin", - protocol: req.protocol, - } as AuthenticationInput) - - if (!success) { - throw new MedusaError(MedusaError.Types.UNAUTHORIZED, error) - } - - const { jwtSecret } = req.scope.resolve("configModule").projectConfig.http - const token = jwt.sign(authIdentity, jwtSecret) - - if (successRedirectUrl) { - const url = new URL(successRedirectUrl!) - url.searchParams.append("auth_token", token) - - return res.redirect(url.toString()) - } - - res.status(200).json({ token }) -} -``` - - - - -```ts collapsibleLines="1-7" expandButtonLabel="Show Imports" -import { NextResponse } from "next/server" - -import { initialize as initializeAuthModule } from "@medusajs/medusa/auth" - -export async function POST(request: Request) { - const authModuleService = await initializeAuthModule() - const url = new URL(request.url) - - const { success, authIdentity, location, error } = - await authModuleService.authenticate("google", { - url: request.url, - headers: Object.fromEntries(request.headers), - query: Object.fromEntries(url.searchParams), - body: await request.json(), - authScope: "admin", - protocol: url.protocol, - } as AuthenticationInput) - - if (!success) { - throw new Error(error) - } - - const token = jwt.sign(authIdentity, "supersecret") - - if (successRedirectUrl) { - const url = new URL(successRedirectUrl!) - url.searchParams.append("auth_token", token) - - return NextResponse.redirect(url.toString()) - } - - return NextResponse.json( - { - token, - }, - { - status: 200, - } - ) -} -``` - - - - ---- - -## Create Auth Identity - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const authModuleService = req.scope.resolve( - Modules.AUTH - ) - - const authIdentity = await authModuleService.createAuthIdentities({ - provider: "emailpass", - entity_id: "user@example.com", - scope: "admin", - }) - - res.json({ auth_identity: authIdentity }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeAuthModule } from "@medusajs/medusa/auth" - -export async function POST(request: Request) { - const authModuleService = await initializeAuthModule() - - const authIdentity = await authModuleService.createAuthIdentities({ - provider: "emailpass", - entity_id: "user@example.com", - scope: "admin", - }) - - return NextResponse.json({ - auth_identity: authIdentity, - }) -} -``` - - - - ---- - -## List Auth Identities - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const authModuleService = req.scope.resolve( - Modules.AUTH - ) - - res.json({ - auth_identitys: await authModuleService.listAuthIdentities(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeAuthModule } from "@medusajs/medusa/auth" - -export async function GET(request: Request) { - const authModuleService = await initializeAuthModule() - - return NextResponse.json({ - auth_identities: await authModuleService.listAuthIdentities(), - }) -} -``` - - - - ---- - -## Update an Auth Identity - - - - - ```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const authModuleService = req.scope.resolve( - Modules.AUTH - ) - - const authIdentity = await authModuleService.updateAuthIdentites({ - id: "authusr_123", - provider_metadata: { - test: true, - }, - }) - - res.json({ - auth_identity: authIdentity, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeAuthModule } from "@medusajs/medusa/auth" - -type ContextType = { - params: { - id: string - } -} - -export async function POST(request: Request, { params }: ContextType) { - const authModuleService = await initializeAuthModule() - - const authIdentity = await authModuleService.updateAuthIdentites({ - id: "authusr_123", - provider_metadata: { - test: true, - }, - }) - - return NextResponse.json({ - auth_identity: authIdentity, - }) -} -``` - - - - ---- - -## Delete an Auth Identity - - - - - ```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const authModuleService = req.scope.resolve( - Modules.AUTH - ) - - await authModuleService.deleteAuthIdentities(["authusr_123"]) - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeAuthModule } from "@medusajs/medusa/auth" - -type ContextType = { - params: { - id: string - } -} - -export async function DELETE(request: Request, { params }: ContextType) { - const authModuleService = await initializeAuthModule() - - await authModuleService.deleteAuthIdentities(["authusr_123"]) -} -``` - - - - ---- - -## More Examples - -The [Auth Module's main service reference](/references/auth) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/auth/page.mdx b/www/apps/resources/app/commerce-modules/auth/page.mdx index dc13c8de789c7..c80d7f266dd1e 100644 --- a/www/apps/resources/app/commerce-modules/auth/page.mdx +++ b/www/apps/resources/app/commerce-modules/auth/page.mdx @@ -1,4 +1,4 @@ -import { CodeTabs, CodeTab } from "docs-ui" +import { CodeTabs, CodeTab, ChildDocs } from "docs-ui" export const metadata = { title: `Auth Module`, @@ -6,132 +6,141 @@ export const metadata = { # {metadata.title} -The Auth Module provides authentication-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Auth Module and how to use it in your application. -## How to Use Auth Module's Service +Medusa has auth related features available out-of-the-box through the Auth Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Auth Module. -Use the Auth Module's main service by resolving from the Medusa container the resource `Modules.AUTH`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## Auth Features -const step1 = createStep("step-1", async (_, { container }) => { - const authModuleService = container.resolve( - Modules.AUTH - ) - const authIdentitys = await authModuleService.listAuthIdentities() -}) -``` +- [Basic User Authentication](./authentication-route/page.mdx#1-basic-authentication-flow): Authenticate users using their email and password credentials. +- [Third-Party and Social Authentication](./authentication-route/page.mdx#2-third-party-service-authenticate-flow): Authenticate users using third-party services and social platforms, such as [Google](./auth-providers/google/page.mdx) and [GitHub](./auth-providers/github/page.mdx). +- [Authenticate Custom Actor Types](./create-actor-type/page.mdx): Create custom user or actor types, such as managers, authenticate them in your application, and guard routes based on the custom user types. +- [Custom Authentication Providers](/references/auth/provider): Integrate third-party services with custom authentication providors. - - +--- -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" +## How to Use the Auth Module -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const authModuleService = req.scope.resolve( - Modules.AUTH - ) - - res.json({ - authIdentitys: await authModuleService.listAuthIdentities(), - }) -} -``` +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. - - +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" - -export default async function subscriberHandler({ container }: SubscriberArgs) { - const authModuleService = container.resolve( - Modules.AUTH - ) +For example: - const authIdentitys = await authModuleService.listAuthIdentities() +export const highlights = [ + ["18", "Modules.AUTH", "Resolve the module in a step."] +] + +```ts title="src/workflows/authenticate-user.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" +import { Modules, MedusaError } from "@medusajs/framework/utils" +import { MedusaRequest } from "@medusajs/framework/http" +import { AuthenticationInput } from "@medusajs/framework/types" + +type Input = { + req: MedusaRequest } -``` - - +const authenticateUserStep = createStep( + "authenticate-user", + async ({ req }: Input, { container }) => { + const authModuleService = container.resolve(Modules.AUTH) + + const { success, authIdentity, error } = await authModuleService + .authenticate( + "emailpass", + { + url: req.url, + headers: req.headers, + query: req.query, + body: req.body, + authScope: "admin", // or custom actor type + protocol: req.protocol, + } as AuthenticationInput + ) + + if (!success) { + // incorrect authentication details + throw new MedusaError( + MedusaError.Types.UNAUTHORIZED, + error || "Incorrect authentication details" + ) + } + + return new StepResponse({ authIdentity }, authIdentity?.id) + }, + async (authIdentityId, { container }) => { + if (!authIdentityId) { + return + } + + const authModuleService = container.resolve(Modules.AUTH) + + await authModuleService.deleteAuthIdentities([authIdentityId]) + } +) ---- +export const authenticateUserWorkflow = createWorkflow( + "authenticate-user", + (input: Input) => { + const { authIdentity } = authenticateUserStep(input) -## Features + return new WorkflowResponse({ + authIdentity, + }) + } +) +``` -### Basic User Authentication +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -Authenticate users using their email and password credentials. +```ts title="API Route" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { authenticateUserWorkflow } from "../../workflows/authenticate-user" -```ts -const { success, authIdentity, error } = await authModuleService.authenticate( - "emailpass", - { - url: req.url, - headers: req.headers, - query: req.query, - body: req.body, - authScope: "admin", - protocol: req.protocol, - } as AuthenticationInput -) +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await authenticateUserWorkflow(req.scope) + .run({ + req, + }) -if (!success) { - // incorrect authentication details - throw new Error(error) + res.send(result) } ``` -### Third-Party and Social Authentication +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -The Auth Module supports a variety of authentication methods, such as authenticating with third-party services and social platforms. +--- -```ts -// in authentication API route -const { success, authIdentity, location } = - await authModuleService.authenticate("google", { - url: req.url, - headers: req.headers, - query: req.query, - body: req.body, - authScope: "admin", - protocol: req.protocol, - } as AuthenticationInput) +## Configure Auth Module -if (location) { - return res.json({ location }) -} - -// in callback API route -const { success, authIdentity } = await authModuleService.validateCallback( - "google", - { - url: req.url, - headers: req.headers, - query: req.query, - body: req.body, - authScope: "admin", - protocol: req.protocol, - } as AuthenticationInput -) -``` +The Auth Module accepts options for further configurations. Refer to [this documentation](./module-options/page.mdx) for details on the module's options. --- -## Configure Auth Module +## Providers + +Medusa provides the following authentication providers out-of-the-box. You can use them to authenticate admin users, customers, or custom actor types. + + + +--- -Refer to [this documentation](./module-options/page.mdx) for details on the module's options. + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/cart/examples/page.mdx b/www/apps/resources/app/commerce-modules/cart/examples/page.mdx deleted file mode 100644 index 17c296bf869db..0000000000000 --- a/www/apps/resources/app/commerce-modules/cart/examples/page.mdx +++ /dev/null @@ -1,463 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Cart Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Cart Module in your application. - - - -You should only use the Cart Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Cart - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - const cart = await cartModuleService.createCarts({ - currency_code: "usd", - shipping_address: { - address_1: "1512 Barataria Blvd", - country_code: "us", - }, - items: [ - { - title: "Shirt", - unit_price: 1000, - quantity: 1, - }, - ], - }) - - res.json({ cart }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCartModule } from "@medusajs/medusa/cart" - -export async function POST(request: Request) { - const cartModuleService = await initializeCartModule() - - const cart = await cartModuleService.createCarts({ - currency_code: "usd", - shipping_address: { - address_1: "1512 Barataria Blvd", - country_code: "us", - }, - items: [ - { - title: "Shirt", - unit_price: 1000, - quantity: 1, - }, - ], - }) - - return NextResponse.json({ - cart, - }) -} -``` - - - - ---- - -## Retrieve Cart by ID - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - const cart = await cartModuleService.retrieveCart("cart_123") - - res.json({ cart }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCartModule } from "@medusajs/medusa/cart" - -export async function GET(request: Request) { - const cartModuleService = await initializeCartModule() - - const cart = await cartModuleService.retrieveCart("cart_123") - - return NextResponse.json({ - cart, - }) -} -``` - - - - ---- - -## Add Item to Cart - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - const lineItem = await cartModuleService.addLineItems({ - cart_id: "cart_123", - title: "Shirt", - quantity: 2, - unit_price: 5000, - }) - - res.json({ - line_item: lineItem, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCartModule } from "@medusajs/medusa/cart" - -export async function POST(request: Request) { - const cartModuleService = await initializeCartModule() - - const lineItem = await cartModuleService.addLineItems({ - cart_id: "cart_123", - title: "Shirt", - quantity: 2, - unit_price: 5000, - }) - - return NextResponse.json({ - line_item: lineItem, - }) -} -``` - - - - ---- - -## Add Shipping Method to Cart - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - const shippingMethod = await cartModuleService.addShippingMethods({ - cart_id: "cart_123", - name: "Custom shipping", - amount: 1000, - }) - - res.json({ - shipping_method: shippingMethod, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCartModule } from "@medusajs/medusa/cart" - -export async function POST(request: Request) { - const cartModuleService = await initializeCartModule() - - const shippingMethod = await cartModuleService.addShippingMethods({ - cart_id: "cart_123", - name: "Custom shipping", - amount: 1000, - }) - - return NextResponse.json({ - shipping_method: shippingMethod, - }) -} -``` - - - - ---- - -## Add Item Adjustment Line - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - const itemAdjustment = await cartModuleService.addLineItemAdjustments({ - item_id: "cali_123", - amount: 500, - code: "50%OFF", - }) - - res.json({ - adjustment: itemAdjustment, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCartModule } from "@medusajs/medusa/cart" - -export async function POST(request: Request) { - const cartModuleService = await initializeCartModule() - - const itemAdjustment = await cartModuleService.addLineItemAdjustments({ - item_id: "cali_123", - amount: 500, - code: "50%OFF", - }) - - return NextResponse.json({ - adjustment: itemAdjustment, - }) -} -``` - - - - ---- - -## Add Shipping Method Adjustment Line - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - const shippingMethodAdjustment = - await cartModuleService.addShippingMethodAdjustments({ - shipping_method_id: "casm_123", - amount: 500, - code: "FREESHIPPING", - }) - - res.json({ - adjustment: shippingMethodAdjustment, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCartModule } from "@medusajs/medusa/cart" - -export async function POST(request: Request) { - const cartModuleService = await initializeCartModule() - - const shippingMethodAdjustment = - await cartModuleService.addShippingMethodAdjustments({ - shipping_method_id: "casm_123", - amount: 500, - code: "FREESHIPPING", - }) - - return NextResponse.json({ - adjustment: shippingMethodAdjustment, - }) -} -``` - - - - ---- - -## Remove Line Item from Cart - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - await cartModuleService.deleteLineItems(["cali_123"]) - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCartModule } from "@medusajs/medusa/cart" - -export async function DELETE(request: Request) { - const cartModuleService = await initializeCartModule() - - await cartModuleService.deleteLineItems(["cali_123"]) -} -``` - - - - ---- - -## Remove Shipping Method from Cart - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - await cartModuleService.deleteShippingMethods(["casm_123"]) - - res.status(200) -} -``` - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - await cartModuleService.deleteShippingMethods(["casm_123"]) - - res.status(200) -} -``` - - - - ---- - -## More Examples - -The [Cart Module's main service reference](/references/cart) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/cart/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/cart/links-to-other-modules/page.mdx index 341ec6d153eb9..aa23a8ca90aa7 100644 --- a/www/apps/resources/app/commerce-modules/cart/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/cart/links-to-other-modules/page.mdx @@ -44,8 +44,8 @@ To retrieve the customer of a cart with [Query](!docs!/learn/fundamentals/module const { data: carts } = await query.graph({ entity: "cart", fields: [ - "customer.*" - ] + "customer.*", + ], }) // carts.order @@ -62,8 +62,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: carts } = useQueryGraphStep({ entity: "cart", fields: [ - "customer.*" - ] + "customer.*", + ], }) // carts.order @@ -93,8 +93,8 @@ To retrieve the order of a cart with [Query](!docs!/learn/fundamentals/module-li const { data: carts } = await query.graph({ entity: "cart", fields: [ - "order.*" - ] + "order.*", + ], }) // carts.order @@ -111,8 +111,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: carts } = useQueryGraphStep({ entity: "cart", fields: [ - "order.*" - ] + "order.*", + ], }) // carts.order @@ -186,8 +186,8 @@ To retrieve the payment collection of a cart with [Query](!docs!/learn/fundament const { data: carts } = await query.graph({ entity: "cart", fields: [ - "payment_collection.*" - ] + "payment_collection.*", + ], }) // carts.payment_collection @@ -204,8 +204,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: carts } = useQueryGraphStep({ entity: "cart", fields: [ - "payment_collection.*" - ] + "payment_collection.*", + ], }) // carts.payment_collection @@ -283,8 +283,8 @@ To retrieve the product, pass `product.*` in `fields`. const { data: lineItems } = await query.graph({ entity: "line_item", fields: [ - "variant.*" - ] + "variant.*", + ], }) // lineItems.variant @@ -301,8 +301,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: lineItems } = useQueryGraphStep({ entity: "line_item", fields: [ - "variant.*" - ] + "variant.*", + ], }) // lineItems.variant @@ -340,8 +340,8 @@ To retrieve the promotion of a line item adjustment, pass `promotion.*` in `fiel const { data: carts } = await query.graph({ entity: "cart", fields: [ - "promotions.*" - ] + "promotions.*", + ], }) // carts.promotions @@ -358,8 +358,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: carts } = useQueryGraphStep({ entity: "cart", fields: [ - "promotions.*" - ] + "promotions.*", + ], }) // carts.promotions @@ -429,8 +429,8 @@ To retrieve the region of a cart with [Query](!docs!/learn/fundamentals/module-l const { data: carts } = await query.graph({ entity: "cart", fields: [ - "region.*" - ] + "region.*", + ], }) // carts.region @@ -447,8 +447,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: carts } = useQueryGraphStep({ entity: "cart", fields: [ - "region.*" - ] + "region.*", + ], }) // carts.region @@ -474,8 +474,8 @@ To retrieve the sales channel of a cart with [Query](!docs!/learn/fundamentals/m const { data: carts } = await query.graph({ entity: "cart", fields: [ - "sales_channel.*" - ] + "sales_channel.*", + ], }) // carts.sales_channel @@ -492,8 +492,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: carts } = useQueryGraphStep({ entity: "cart", fields: [ - "sales_channel.*" - ] + "sales_channel.*", + ], }) // carts.sales_channel diff --git a/www/apps/resources/app/commerce-modules/cart/page.mdx b/www/apps/resources/app/commerce-modules/cart/page.mdx index 4c90a550a302a..52231a4ffecd1 100644 --- a/www/apps/resources/app/commerce-modules/cart/page.mdx +++ b/www/apps/resources/app/commerce-modules/cart/page.mdx @@ -6,120 +6,165 @@ export const metadata = { # {metadata.title} -The Cart Module provides cart-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Cart Module and how to use it in your application. -## How to Use Cart Module's Service +Medusa has cart related features available out-of-the-box through the Cart Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Cart Module. -You can use the Cart Module's main service by resolving from the Medusa container the resource `Modules.CART`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## Cart Features -const step1 = createStep("step-1", async (_, { container }) => { - const cartModuleService = container.resolve( - Modules.CART - ) +- [Cart Management](./concepts/page.mdx): Store and manage carts, including their addresses, line items, shipping methods, and more. +- [Apply Promotion Adjustments](./promotions/page.mdx): Apply promotions or discounts to line items and shipping methods by adding adjustment lines that are factored into their subtotals. +- [Apply Tax Lines](./tax-lines/page.mdx): Apply tax lines to line items and shipping methods. +- [Cart Scoping](./links-to-other-modules/page.mdx): When used in the Medusa application, Medusa creates links to other commerce modules, scoping a cart to a sales channel, region, and a customer. - const carts = await cartModuleService.listCarts() -}) -``` +--- - - +## How to Use the Cart Module -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const cartModuleService = req.scope.resolve( - Modules.CART - ) - - res.json({ - carts: await cartModuleService.listCarts(), - }) -} -``` +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" +export const highlights = [ + ["12", "Modules.CART", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-cart.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -export default async function subscriberHandler({ container }: SubscriberArgs) { - const cartModuleService = container.resolve( - Modules.CART - ) - - const carts = await cartModuleService.listCarts() -} +const createCartStep = createStep( + "create-cart", + async ({}, { container }) => { + const cartModuleService = container.resolve(Modules.CART) + + const cart = await cartModuleService.createCarts({ + currency_code: "usd", + shipping_address: { + address_1: "1512 Barataria Blvd", + country_code: "us", + }, + items: [ + { + title: "Shirt", + unit_price: 1000, + quantity: 1, + }, + ], + }) + + return new StepResponse({ cart }, cart.id) + }, + async (cartId, { container }) => { + if (!cartId) { + return + } + const cartModuleService = container.resolve(Modules.CART) + + await cartModuleService.deleteCarts([cartId]) + } +) + +export const createCartWorkflow = createWorkflow( + "create-cart", + () => { + const { cart } = createCartStep() + + return new WorkflowResponse({ + cart, + }) + } +) ``` - - - ---- - -## Features +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -### Cart Management + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createCartWorkflow } from "../../workflows/create-cart" -Store and manage carts, including their addresses, line items, shipping methods, and more. +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await createCartWorkflow(req.scope) + .run() -```ts -const cart = await cartModuleService.createCarts({ - currency_code: "usd", - shipping_address: { - address_1: "1512 Barataria Blvd", - country_code: "us", - }, - items: [ - { - title: "Shirt", - unit_price: 1000, - quantity: 1, - }, - ], -}) + res.send(result) +} ``` -### Apply Promotions + + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createCartWorkflow } from "../workflows/create-cart" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createCartWorkflow(container) + .run() + + console.log(result) +} -Apply promotions or discounts to line items and shipping methods by adding adjustment lines that are factored into their subtotals. +export const config: SubscriberConfig = { + event: "user.created", +} +``` -```ts -const lineAdjustments = await cartModuleService.addLineItemAdjustments({ - item_id: "cali_123", - code: "50OFF", - amount: 500, -}) + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createCartWorkflow } from "../workflows/create-cart" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createCartWorkflow(container) + .run() + + console.log(result) +} -const shippingAdjustments = - await cartModuleService.addShippingMethodAdjustments({ - shipping_method_id: "casm_123", - code: "FREESHIPPING", - amount: 1000, - }) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Cart Context and Scoping + + -A cart is scoped to a sales channel, region, and a customer. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -The Medusa application links the Cart Module to each of their respective modules, providing features like: +--- -- Checking product availability in a sales channel. -- Retrieving pricing per region. -- Applying promotions based on the customer's group. + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/currency/examples/page.mdx b/www/apps/resources/app/commerce-modules/currency/examples/page.mdx deleted file mode 100644 index 0f05e7b2cc9e3..0000000000000 --- a/www/apps/resources/app/commerce-modules/currency/examples/page.mdx +++ /dev/null @@ -1,111 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Currency Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Currency Module in your application. - - - -You should only use the Currency Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## List Currencies - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const currencyModuleService = req.scope.resolve( - Modules.CURRENCY - ) - - res.json({ - currencies: await currencyModuleService.listCurrencies(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCurrencyModule } from "@medusajs/medusa/currency" - -export async function GET(request: Request) { - const currencyModuleService = await initializeCurrencyModule() - - return NextResponse.json({ - currencies: await currencyModuleService.listCurrencies(), - }) -} -``` - - - - ---- - -## Retrieve a Currency by its Code - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const currencyModuleService = req.scope.resolve( - Modules.CURRENCY - ) - - const currency = await currencyModuleService.retrieveCurrency("usd") - - res.json({ - currency, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCurrencyModule } from "@medusajs/medusa/currency" - -export async function GET(request: Request) { - const currencyModuleService = await initializeCurrencyModule() - - const currency = await currencyModuleService.retrieveCurrency("usd") - - return NextResponse.json({ currency }) -} -``` - - - - ---- - -## More Examples - -The [Currency Module's main service reference](/references/currency) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/currency/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/currency/links-to-other-modules/page.mdx index 2ea00ee4de647..0cc6da0aecb28 100644 --- a/www/apps/resources/app/commerce-modules/currency/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/currency/links-to-other-modules/page.mdx @@ -39,8 +39,8 @@ To retrieve the details of a store's currencies with [Query](!docs!/learn/fundam const { data: stores } = await query.graph({ entity: "store", fields: [ - "supported_currencies.currency.*" - ] + "supported_currencies.currency.*", + ], }) // stores.supported_currencies @@ -57,8 +57,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: stores } = useQueryGraphStep({ entity: "store", fields: [ - "supported_currencies.currency.*" - ] + "supported_currencies.currency.*", + ], }) // stores.supported_currencies diff --git a/www/apps/resources/app/commerce-modules/currency/page.mdx b/www/apps/resources/app/commerce-modules/currency/page.mdx index 8ac2a67659308..511b8aa87e941 100644 --- a/www/apps/resources/app/commerce-modules/currency/page.mdx +++ b/www/apps/resources/app/commerce-modules/currency/page.mdx @@ -6,91 +6,161 @@ export const metadata = { # {metadata.title} -The Currency Module provides currency-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Currency Module and how to use it in your application. -## How to Use Currency Module's Service +Medusa has currency related features available out-of-the-box through the Currency Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Currency Module. -You can use the Currency Module's main service by resolving from the Medusa container the resource `Modules.CURRENCY`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## Currency Features + +- [Currency Management and Retrieval](/references/currency/listAndCountCurrencies): This module adds all common currencies to your application and allows you to retrieve them. +- [Support Currencies in Modules](./links-to-other-modules/page.mdx): Other commerce modules use currency codes in their data models or operations. Use the Currency Module to retrieve a currency code and its details. + +--- + +## How to Use the Currency Module + +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. - - +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. + +For example: -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +export const highlights = [ + ["13", "Modules.CURRENCY", "Resolve the module in a step."] +] + +```ts title="src/workflows/retrieve-price-with-currency.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, + transform, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const currencyModuleService = container.resolve( - Modules.CURRENCY - ) +const retrieveCurrencyStep = createStep( + "retrieve-currency", + async ({}, { container }) => { + const currencyModuleService = container.resolve(Modules.CURRENCY) - const currencies = await currencyModuleService.listCurrencies() -}) + const currency = await currencyModuleService + .retrieveCurrency("usd") + + return new StepResponse({ currency }) + } +) + +type Input = { + price: number +} + +export const retrievePriceWithCurrency = createWorkflow( + "create-currency", + (input: Input) => { + const { currency } = retrieveCurrencyStep() + + const formattedPrice = transform({ + input, + currency, + }, (data) => { + return `${data.currency.symbol}${data.input.price}` + }) + + return new WorkflowResponse({ + formattedPrice, + }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"], ["13"], ["14"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { retrievePriceWithCurrency } from "../../workflows/retrieve-price-with-currency" export async function GET( req: MedusaRequest, res: MedusaResponse -): Promise { - const currencyModuleService = req.scope.resolve( - Modules.CURRENCY - ) - - res.json({ - currencies: await currencyModuleService.listCurrencies(), - }) +) { + const { result } = await retrievePriceWithCurrency(req.scope) + .run({ + price: 10, + }) + + res.send(result) } ``` - - -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" - -export default async function subscriberHandler({ container }: SubscriberArgs) { - const currencyModuleService = container.resolve( - Modules.CURRENCY - ) + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"], ["13"], ["14"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { retrievePriceWithCurrency } from "../workflows/retrieve-price-with-currency" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await retrievePriceWithCurrency(container) + .run({ + price: 10, + }) + + console.log(result) +} - const currencies = await currencyModuleService.listCurrencies() +export const config: SubscriberConfig = { + event: "user.created", } ``` - - ---- - -## Features - -### Currency Retrieval - -List and retrieve currencies stored in your application. + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"], ["9"], ["10"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { retrievePriceWithCurrency } from "../workflows/retrieve-price-with-currency" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await retrievePriceWithCurrency(container) + .run({ + price: 10, + }) + + console.log(result) +} -```ts -const currency = await currencyModuleService.retrieveCurrency("usd") +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Support Currencies in Modules + + -Other commerce modules use currency codes in their data models or operations. Use the Currency Module to retrieve a currency code and its details. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -An example with the Region Module: +--- -```ts -const region = await regionModuleService.retrieveRegion("reg_123") -const currency = await currencyModuleService.retrieveCurrency( - region.currency_code -) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/customer/examples/page.mdx b/www/apps/resources/app/commerce-modules/customer/examples/page.mdx deleted file mode 100644 index da6db151ec125..0000000000000 --- a/www/apps/resources/app/commerce-modules/customer/examples/page.mdx +++ /dev/null @@ -1,220 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Customer Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Customer Module in your application. - - - -You should only use the Customer Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Customer - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const customerModuleService = request.scope.resolve( - Modules.CUSTOMER - ) - - const customer = await customerModuleService.createCustomers({ - first_name: "Peter", - last_name: "Hayes", - email: "peter.hayes@example.com", - }) - - res.json({ - customer, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCustomerModule } from "@medusajs/medusa/customer" - -export async function POST(request: Request) { - const customerModuleService = await initializeCustomerModule() - - const customer = await customerModuleService.createCustomers({ - first_name: "Peter", - last_name: "Hayes", - email: "peter.hayes@example.com", - }) - - return NextResponse.json({ - customer, - }) -} -``` - - - - ---- - -## Create a Customer Group - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const customerModuleService = request.scope.resolve( - Modules.CUSTOMER - ) - - const customerGroup = await customerModuleService.createCustomerGroups({ - name: "VIP", - }) - - res.json({ - customer_group: customerGroup, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCustomerModule } from "@medusajs/medusa/customer" - -export async function POST(request: Request) { - const customerModuleService = await initializeCustomerModule() - - const customerGroup = await customerModuleService.createCustomerGroups({ - name: "VIP", - }) - - return NextResponse.json({ - customer_group: customerGroup, - }) -} -``` - - - - ---- - -## Add a Customer to a Group - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const customerModuleService = request.scope.resolve( - Modules.CUSTOMER - ) - - await customerModuleService.addCustomerToGroup({ - customer_id: "cus_123", - customer_group_id: "cusgroup_123", - }) - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeCustomerModule } from "@medusajs/medusa/customer" - -export async function POST(request: Request) { - const customerModuleService = await initializeCustomerModule() - - await customerModuleService.addCustomerToGroup({ - customer_id: "cus_123", - customer_group_id: "cusgroup_123", - }) - - return NextResponse.json({}, { status: 200 }) -} -``` - - - - ---- - -## Remove a Customer from a Group - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const customerModuleService = request.scope.resolve( - Modules.CUSTOMER - ) - - await customerModuleService.removeCustomerFromGroup({ - customer_id: "cus_123", - customer_group_id: "cusgroup_123", - }) - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - - -import { initialize as initializeCustomerModule } from "@medusajs/medusa/customer" - -export async function POST(request: Request) { - const customerModuleService = await initializeCustomerModule() - - await customerModuleService.removeCustomerFromGroup({ - customer_id: "cus_123", - customer_group_id: "cusgroup_123", - }) - - return NextResponse.json({}, { status: 200 }) -} -``` - - - - ---- - -## More Examples - -The [Customer Module's main service reference](/references/customer) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/customer/extend/page.mdx b/www/apps/resources/app/commerce-modules/customer/extend/page.mdx index a511077780cd7..74298d409777c 100644 --- a/www/apps/resources/app/commerce-modules/customer/extend/page.mdx +++ b/www/apps/resources/app/commerce-modules/customer/extend/page.mdx @@ -276,9 +276,9 @@ You'll next execute the workflow in the hook handler. You can now consume the `customersCreated` hook, which is executed in the `createCustomersWorkflow` after the customer is created. -To consume the hook, create the file `src/workflow/hooks/customer-created.ts` with the following content: +To consume the hook, create the file `src/workflow/hooks/user-created.ts` with the following content: -```ts title="src/workflow/hooks/customer-created.ts" collapsibleLines="1-6" expandButtonLabel="Show Imports" +```ts title="src/workflow/hooks/user-created.ts" collapsibleLines="1-6" expandButtonLabel="Show Imports" import { createCustomersWorkflow } from "@medusajs/medusa/core-flows" import { createCustomFromCustomerWorkflow, diff --git a/www/apps/resources/app/commerce-modules/customer/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/customer/links-to-other-modules/page.mdx index 7dac5330fe47d..bf91bf2576655 100644 --- a/www/apps/resources/app/commerce-modules/customer/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/customer/links-to-other-modules/page.mdx @@ -38,8 +38,8 @@ To retrieve a customer's carts with [Query](!docs!/learn/fundamentals/module-lin const { data: customers } = await query.graph({ entity: "customer", fields: [ - "carts.*" - ] + "carts.*", + ], }) // customers.carts @@ -56,8 +56,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: customers } = useQueryGraphStep({ entity: "customer", fields: [ - "carts.*" - ] + "carts.*", + ], }) // customers.carts @@ -83,8 +83,8 @@ To retrieve a customer's orders with [Query](!docs!/learn/fundamentals/module-li const { data: customers } = await query.graph({ entity: "customer", fields: [ - "orders.*" - ] + "orders.*", + ], }) // customers.orders @@ -101,8 +101,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: customers } = useQueryGraphStep({ entity: "customer", fields: [ - "orders.*" - ] + "orders.*", + ], }) // customers.orders diff --git a/www/apps/resources/app/commerce-modules/customer/page.mdx b/www/apps/resources/app/commerce-modules/customer/page.mdx index 42d959627eb12..a33942b8561a9 100644 --- a/www/apps/resources/app/commerce-modules/customer/page.mdx +++ b/www/apps/resources/app/commerce-modules/customer/page.mdx @@ -6,96 +6,154 @@ export const metadata = { # {metadata.title} -The Customer Module provides customer-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Customer Module and how to use it in your application. -## How to Use Customer Module's Service +Medusa has customer related features available out-of-the-box through the Customer Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Customer Module. -You can use the Customer Module's main service by resolving from the Medusa container the resource `Modules.CUSTOMER`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## Customer Features -const step1 = createStep("step-1", async (_, { container }) => { - const customerModuleService = container.resolve( - Modules.CUSTOMER - ) +- [Customer Management](./customer-accounts/page.mdx): Store and manage guest and registered customers in your store. +- [Customer Organization](/references/customer/models): Organize customers into groups. This has a lot of benefits and supports many use cases, such as provide discounts for specific customer groups using the [Promotion Module](../promotion/page.mdx). - const customers = await customerModuleService.listCustomers() -}) -``` +--- - - +## How to Use the Customer Module -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -export async function GET(request: MedusaRequest, res: MedusaResponse) { - const customerModuleService = request.scope.resolve( - Modules.CUSTOMER - ) +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - res.json({ - customers: await customerModuleService.listCustomers(), - }) -} -``` - - - +For example: -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" +export const highlights = [ + ["12", "Modules.CUSTOMER", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-customer.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -export default async function subscriberHandler({ container }: SubscriberArgs) { - const customerModuleService = container.resolve( - Modules.CUSTOMER - ) +const createCustomerStep = createStep( + "create-customer", + async ({}, { container }) => { + const customerModuleService = container.resolve(Modules.CUSTOMER) + + const customer = await customerModuleService.createCustomers({ + first_name: "Peter", + last_name: "Hayes", + email: "peter.hayes@example.com", + }) + + return new StepResponse({ customer }, customer.id) + }, + async (customerId, { container }) => { + if (!customerId) { + return + } + const customerModuleService = container.resolve(Modules.CUSTOMER) + + await customerModuleService.deleteCustomers([customerId]) + } +) + +export const createCustomerWorkflow = createWorkflow( + "create-customer", + () => { + const { customer } = createCustomerStep() + + return new WorkflowResponse({ + customer, + }) + } +) +``` + +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: - const customers = await customerModuleService.listCustomers() + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createCustomerWorkflow } from "../../workflows/create-customer" + +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await createCustomerWorkflow(req.scope) + .run() + + res.send(result) } ``` - - ---- - -## Features + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createCustomerWorkflow } from "../workflows/create-customer" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createCustomerWorkflow(container) + .run() + + console.log(result) +} -### Customer Management +export const config: SubscriberConfig = { + event: "user.created", +} +``` -With the Customer Module, store and manage customers. + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createCustomerWorkflow } from "../workflows/create-customer" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createCustomerWorkflow(container) + .run() + + console.log(result) +} -```ts -const customer = await customerModuleService.createCustomers({ - first_name: "Peter", - last_name: "Hayes", - email: "peter.hayes@example.com", -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Customer Organization - -Organize customers into groups. + + -This has a lot of benefits and supports many use cases, such as provide discounts for specific customer groups using the Promotion Module. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -```ts -const customerGroup = await customerModuleService.createCustomerGroups({ - name: "VIP", -}) +--- -await customerModuleService.addCustomerToGroup({ - customer_id: "cus_123", - customer_group_id: customerGroup.id, -}) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/fulfillment/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/fulfillment/links-to-other-modules/page.mdx index 234ac7d107c3e..0f665358fd597 100644 --- a/www/apps/resources/app/commerce-modules/fulfillment/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/fulfillment/links-to-other-modules/page.mdx @@ -49,8 +49,8 @@ To retrieve the return, pass `return.*` in `fields`. const { data: fulfillments } = await query.graph({ entity: "fulfillment", fields: [ - "order.*" - ] + "order.*", + ], }) // fulfillments.order @@ -67,8 +67,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: fulfillments } = useQueryGraphStep({ entity: "fulfillment", fields: [ - "order.*" - ] + "order.*", + ], }) // fulfillments.order @@ -142,8 +142,8 @@ To retrieve the price set of a shipping option with [Query](!docs!/learn/fundame const { data: shippingOptions } = await query.graph({ entity: "shipping_option", fields: [ - "price_set.*" - ] + "price_set.*", + ], }) // shippingOptions.price_set @@ -160,8 +160,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: shippingOptions } = useQueryGraphStep({ entity: "shipping_option", fields: [ - "price_set.*" - ] + "price_set.*", + ], }) // shippingOptions.price_set @@ -245,8 +245,8 @@ To retrieve the stock location of a fulfillment provider, pass `locations.*` in const { data: fulfillmentSets } = await query.graph({ entity: "fulfillment_set", fields: [ - "location.*" - ] + "location.*", + ], }) // fulfillmentSets.location @@ -263,8 +263,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: fulfillmentSets } = useQueryGraphStep({ entity: "fulfillment_set", fields: [ - "location.*" - ] + "location.*", + ], }) // fulfillmentSets.location diff --git a/www/apps/resources/app/commerce-modules/fulfillment/page.mdx b/www/apps/resources/app/commerce-modules/fulfillment/page.mdx index 3984a149ca32f..cfd8c3695ab20 100644 --- a/www/apps/resources/app/commerce-modules/fulfillment/page.mdx +++ b/www/apps/resources/app/commerce-modules/fulfillment/page.mdx @@ -6,162 +6,176 @@ export const metadata = { # {metadata.title} -The Fulfillment Module provides fulfillment-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Fulfillment Module and how to use it in your application. -## How to Use Fulfillment Module's Service +Medusa has fulfillment related features available out-of-the-box through the Fulfillment Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Fulfillment Module. -You can use the Fulfillment Module's main service by resolving from the Medusa container the resource `Modules.FULFILLMENT`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## Fulfillment Features -const step1 = createStep("step-1", async (_, { container }) => { - const fulfillmentModuleService = container.resolve( - Modules.FULFILLMENT - ) +- [Fulfillment Management](./item-fulfillment/page.mdx): Create fulfillments and keep track of their status, items, and more. +- [Integrate Third-Party Fulfillment Providers](./fulfillment-provider/page.mdx): Create third-party fulfillment providers to provide customers with shipping options and fulfill their orders. +- [Restrict By Location and Rules](./shipping-option/page.mdx): Shipping options can be restricted to specific geographical locations. You can also specify custom rules to restrict shipping options. +- [Support Different Fulfillment Forms](./concepts/page.mdx): Support various fulfillment forms, such as shipping or pick up. - const fulfillments = await fulfillmentModuleService.listFulfillments() -}) -``` +--- - - +## How to Use the Fulfillment Module -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. + +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. + +For example: + +export const highlights = [ + ["12", "Modules.FULFILLMENT", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-fulfillment.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" +const createFulfillmentStep = createStep( + "create-fulfillment", + async ({}, { container }) => { + const fulfillmentModuleService = container.resolve(Modules.FULFILLMENT) + + const fulfillment = await fulfillmentModuleService.createFulfillment({ + location_id: "loc_123", + provider_id: "webshipper", + delivery_address: { + country_code: "us", + city: "Strongsville", + address_1: "18290 Royalton Rd", + }, + items: [ + { + title: "Shirt", + sku: "SHIRT", + quantity: 1, + barcode: "123456", + }, + ], + labels: [], + order: {}, + }) + + return new StepResponse({ fulfillment }, fulfillment.id) + }, + async (fulfillmentId, { container }) => { + if (!fulfillmentId) { + return + } + const fulfillmentModuleService = container.resolve(Modules.FULFILLMENT) + + await fulfillmentModuleService.deleteFulfillment(fulfillmentId) + } +) + +export const createFulfillmentWorkflow = createWorkflow( + "create-fulfillment", + () => { + const { fulfillment } = createFulfillmentStep() + + return new WorkflowResponse({ + fulfillment, + }) + } +) +``` + +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: + + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createFulfillmentWorkflow } from "../../workflows/create-fuilfillment" + export async function GET( req: MedusaRequest, res: MedusaResponse -): Promise { - const fulfillmentModuleService = req.scope.resolve( - Modules.FULFILLMENT - ) - - res.json({ - fulfillments: await fulfillmentModuleService.listFulfillments(), - }) +) { + const { result } = await createFulfillmentWorkflow(req.scope) + .run() + + res.send(result) } ``` - - -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" - -export default async function subscriberHandler({ container }: SubscriberArgs) { - const fulfillmentModuleService = container.resolve( - Modules.FULFILLMENT - ) + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createFulfillmentWorkflow } from "../workflows/create-fuilfillment" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createFulfillmentWorkflow(container) + .run() + + console.log(result) +} - const fulfillments = await fulfillmentModuleService.listFulfillments() +export const config: SubscriberConfig = { + event: "user.created", } ``` - - ---- - -## Features - -### Fulfillment Management - -Create fulfillments and keep track of their status, items, and more. + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createFulfillmentWorkflow } from "../workflows/create-fuilfillment" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createFulfillmentWorkflow(container) + .run() + + console.log(result) +} -```ts -const fulfillment = await fulfillmentModuleService.createFulfillment({ - location_id: "loc_123", - provider_id: "webshipper", - delivery_address: { - country_code: "us", - city: "Strongsville", - address_1: "18290 Royalton Rd", - }, - items: [ - { - title: "Shirt", - sku: "SHIRT", - quantity: 1, - barcode: "123456", - }, - ], - labels: [], - order: {}, -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Integrate Third-Party Fulfillment Providers - -Use third-party fulfillment providers to provide customers with shipping options and fulfill their orders. - -```ts -const shippingOption = await fulfillmentModuleService.createShippingOptions({ - // ... - provider_id: "webshipper", -}) -``` + + -### Restrict By Location and Rules - -Shipping options can be restricted to specific geographical locations. You can also specify custom rules to restrict shipping options. - -```ts -const serviceZone = await fulfillmentModuleService.createServiceZones({ - name: "US", - fulfillment_set_id: "fset_123", - geo_zones: [ - { - type: "country", - country_code: "us", - }, - ], -}) - -const shippingOption = await fulfillmentModuleService.createShippingOptions({ - name: "Express Shipping", - // restrict location - service_zone_id: serviceZone.id, - // restrict by custom rules - rules: [ - { - field: "customer_group", - operator: "eq", - value: "vip", - }, - ], - // ... -}) -``` +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -### Support Different Fulfillment Forms +--- -Support various fulfillment forms, such as shipping or pick up. +## Configure Fulfillment Module -```ts -const fulfillmentSets = await fulfillmentModuleService.createFulfillmentSets([ - { - name: "Shipping", - type: "shipping", - }, - { - name: "Pick-up", - type: "pick-up", - }, -]) -``` +The Fulfillment Module accepts options for further configurations. Refer to [this documentation](./module-options/page.mdx) for details on the module's options. --- -## Configure Fulfillment Module - -Refer to [this documentation](./module-options/page.mdx) for details on the module's options. + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/inventory/examples/page.mdx b/www/apps/resources/app/commerce-modules/inventory/examples/page.mdx deleted file mode 100644 index 4877b4caf0f3d..0000000000000 --- a/www/apps/resources/app/commerce-modules/inventory/examples/page.mdx +++ /dev/null @@ -1,526 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Inventory Module`, -} - -# {metadata.title} - -In this document, you’ll find common examples of how you can use the Inventory Module in your application. - - - -You should only use the Inventory Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create an Inventory Item - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - const inventoryItem = await inventoryModuleService.createInventoryItems({ - sku: request.body.sku, - title: request.body.title, - requires_shipping: request.body.requires_shipping, - }) - - res.json({ inventory_item: inventoryItem }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -export async function POST(request: Request) { - const inventoryModuleService = await initializeInventoryModule({}) - const body = await request.json() - - const inventoryItem = await inventoryModuleService.createInventoryItems({ - sku: body.sku, - title: body.title, - requires_shipping: body.requires_shipping, - }) - - return NextResponse.json({ inventory_item: inventoryItem }) -} -``` - - - - ---- - -## List Inventory Items - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - const inventoryItems = await inventoryModuleService.listInventoryItems({}) - - res.json({ inventory_items: inventoryItems }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -export async function GET(request: Request) { - const inventoryModuleService = await initializeInventoryModule({}) - - const inventoryItems = await inventoryModuleService.listInventoryItems({}) - - return NextResponse.json({ inventory_items: inventoryItems }) -} -``` - - - - ---- - -## Retrieve an Inventory Item by its ID - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - const inventoryItem = await inventoryModuleService.retrieveInventoryItem( - request.params.id - ) - - res.json({ inventory_item: inventoryItem }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -type ContextType = { - params: { - id: string - } -} - -export async function GET(request: Request, { params }: ContextType) { - const inventoryModuleService = await initializeInventoryModule({}) - - const inventoryItem = await inventoryModuleService.retrieveInventoryItem( - params.id - ) - - return NextResponse.json({ inventory_item: inventoryItem }) -} -``` - - - - ---- - -## Create an Inventory Level - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - const inventoryLevel = await inventoryModuleService.createInventoryLevels({ - inventory_item_id: request.body.inventory_item_id, - location_id: request.body.location_id, - stocked_quantity: request.body.quantity, - }) - - res.json({ inventory_level: inventoryLevel }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -export async function POST(request: Request) { - const inventoryModuleService = await initializeInventoryModule({}) - const body = await request.json() - - const inventoryLevel = await inventoryModuleService.createInventoryLevels({ - inventory_item_id: body.inventory_item_id, - location_id: body.location_id, - stocked_quantity: body.quantity, - }) - - return NextResponse.json({ inventory_level: inventoryLevel }) -} -``` - - - - ---- - -## Adjust Inventory in Location - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - const inventoryLevel = await inventoryModuleService.adjustInventory( - request.body.inventory_item_id, - request.body.location_id, - request.body.new_quantity - ) - - res.json({ inventory_level: inventoryLevel }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -export async function POST(request: Request) { - const inventoryModuleService = await initializeInventoryModule({}) - const body = await request.json() - - const inventoryLevel = await inventoryModuleService.adjustInventory( - body.inventory_item_id, - body.location_id, - body.new_quantity - ) - - return NextResponse.json({ inventory_level: inventoryLevel }) -} -``` - - - - ---- - -## Confirm Inventory Item Availability - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - res.json({ - is_available: await inventoryModuleService.confirmInventory( - request.body.inventory_item_id, - [request.body.location_id], - request.body.required_quantity - ), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -export async function POST(request: Request) { - const inventoryModuleService = await initializeInventoryModule({}) - const body = await request.json() - - return NextResponse.json({ - is_available: await inventoryModuleService.confirmInventory( - body.inventory_item_id, - [body.location_id], - body.required_quantity - ), - }) -} -``` - - - - ---- - -## Create Reservation Item - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - const reservationItem = await inventoryModuleService.createReservationItems({ - inventory_item_id: request.body.inventory_item_id, - location_id: request.body.location_id, - quantity: request.body.reserved_quantity, - }) - - res.json({ reservation_item: reservationItem }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -export async function POST(request: Request) { - const inventoryModuleService = await initializeInventoryModule({}) - const body = await request.json() - - const reservationItem = await inventoryModuleService.createReservationItems({ - inventory_item_id: body.inventory_item_id, - location_id: body.location_id, - quantity: body.reserved_quantity, - }) - - return NextResponse.json({ - reservation_item: reservationItem, - }) -} -``` - - - - ---- - -## Retrieve Quantity Details - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - const reservedQuantity = - await inventoryModuleService.retrieveReservedQuantity( - request.params.inventory_item_id, - [request.params.location_id] - ) - const stockedQuantity = await inventoryModuleService.retrieveStockedQuantity( - request.params.inventory_item_id, - [request.params.location_id] - ) - const availableQuantity = - await inventoryModuleService.retrieveAvailableQuantity( - request.params.inventory_item_id, - [request.params.location_id] - ) - - res.json({ - reserved_quantity: reservedQuantity, - stocked_quantity: stockedQuantity, - available_quantity: availableQuantity, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -type ContextType = { - params: { - inventory_item_id: string - location_id: string - } -} - -export async function POST(request: Request, { params }: ContextType) { - const inventoryModuleService = await initializeInventoryModule({}) - - const reservedQuantity = - await inventoryModuleService.retrieveReservedQuantity( - params.inventory_item_id, - [params.location_id] - ) - const stockedQuantity = await inventoryModuleService.retrieveStockedQuantity( - params.inventory_item_id, - [params.location_id] - ) - const availableQuantity = - await inventoryModuleService.retrieveAvailableQuantity( - params.inventory_item_id, - [params.location_id] - ) - - return NextResponse.json({ - reserved_quantity: reservedQuantity, - stocked_quantity: stockedQuantity, - available_quantity: availableQuantity, - }) -} -``` - - - - ---- - -## Delete a Reservation - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - await inventoryModuleService.deleteReservationItems([ - request.params.reservation_id, - ]) - - res.status(200) -} -``` - - - - -```ts -import { initialize as initializeInventoryModule } from "@medusajs/medusa/inventory" - -type ContextType = { - params: { - reservation_id: string - } -} - -export async function DELETE(request: Request, { params }: ContextType) { - const inventoryModuleService = await initializeInventoryModule({}) - - await inventoryModuleService.deleteReservationItems([params.reservation_id]) -} -``` - - - - ---- - -## More Examples - -The [Inventory Module's main service reference](/references/inventory-next) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/inventory/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/inventory/links-to-other-modules/page.mdx index 2b8f3134c9173..35bfc0bdc3746 100644 --- a/www/apps/resources/app/commerce-modules/inventory/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/inventory/links-to-other-modules/page.mdx @@ -42,8 +42,8 @@ To retrieve the product variants of an inventory item with [Query](!docs!/learn/ const { data: inventoryItems } = await query.graph({ entity: "inventory_item", fields: [ - "variants.*" - ] + "variants.*", + ], }) // inventoryItems.variants @@ -60,8 +60,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: inventoryItems } = useQueryGraphStep({ entity: "inventory_item", fields: [ - "variants.*" - ] + "variants.*", + ], }) // inventoryItems.variants @@ -131,8 +131,8 @@ To retrieve the stock locations of an inventory level with [Query](!docs!/learn/ const { data: inventoryLevels } = await query.graph({ entity: "inventory_level", fields: [ - "stock_locations.*" - ] + "stock_locations.*", + ], }) // inventoryLevels.stock_locations @@ -149,8 +149,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: inventoryLevels } = useQueryGraphStep({ entity: "inventory_level", fields: [ - "stock_locations.*" - ] + "stock_locations.*", + ], }) // inventoryLevels.stock_locations diff --git a/www/apps/resources/app/commerce-modules/inventory/page.mdx b/www/apps/resources/app/commerce-modules/inventory/page.mdx index 21e0be049d2da..9abb351be9454 100644 --- a/www/apps/resources/app/commerce-modules/inventory/page.mdx +++ b/www/apps/resources/app/commerce-modules/inventory/page.mdx @@ -6,130 +6,156 @@ export const metadata = { # {metadata.title} -The Inventory Module provides inventory-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Inventory Module and how to use it in your application. -## How to Use Inventory Module's Service +Medusa has inventory related features available out-of-the-box through the Inventory Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Inventory Module. -You can use the Inventory Module's main service by resolving from the Medusa container the resource `Modules.INVENTORY`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## Inventory Features -const step1 = createStep("step-1", async (_, { container }) => { - const inventoryModuleService = container.resolve( - Modules.INVENTORY - ) +- [Inventory Items Management](./concepts/page.mdx): Store and manage inventory of any stock-kept item, such as product variants. +- [Inventory Across Locations](./concepts/page.mdx#inventorylevel): Manage inventory levels across different locations, such as warehouses. +- [Reservation Management](./concepts/page.mdx#reservationitem): Reserve quantities of inventory items at specific locations for orders or other purposes. +- [Check Inventory Availability](/references/inventory-next/confirmInventory): Check whether an inventory item has the necessary quantity for purchase. - const inventoryItems = await inventoryModuleService.listInventoryItems({}) -}) -``` +--- - - +## How to Use the Inventory Module -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const inventoryModuleService = request.scope.resolve( - Modules.INVENTORY - ) - - res.json({ - inventory_items: await inventoryModuleService.listInventoryItems({}), - }) -} -``` +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" +export const highlights = [ + ["12", "Modules.INVENTORY", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-inventory-item.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -export default async function subscriberHandler({ container }: SubscriberArgs) { - const inventoryModuleService = container.resolve( - Modules.INVENTORY - ) - - const inventoryItems = await inventoryModuleService.listInventoryItems({}) -} -``` - - - - ---- - -## Features +const createInventoryItemStep = createStep( + "create-inventory-item", + async ({}, { container }) => { + const inventoryModuleService = container.resolve(Modules.INVENTORY) -### Inventory Items Management + const inventoryItem = await inventoryModuleService.createInventoryItems({ + sku: "SHIRT", + title: "Green Medusa Shirt", + requires_shipping: true, + }) -Store and manage inventory of any stock-kept item, such as product variants. + return new StepResponse({ inventoryItem }, inventoryItem.id) + }, + async (inventoryItemId, { container }) => { + if (!inventoryItemId) { + return + } + const inventoryModuleService = container.resolve(Modules.INVENTORY) + + await inventoryModuleService.deleteInventoryItems([inventoryItemId]) + } +) -Inventory items hold details of the underlying stock-kept item, as well as inventory details such as whether the item requires shipping. +export const createInventoryItemWorkflow = createWorkflow( + "create-inventory-item-workflow", + () => { + const { inventoryItem } = createInventoryItemStep() -```ts -const inventoryItem = await inventoryModuleService.createInventoryItems({ - sku: "SHIRT", - title: "Green Medusa Shirt", - requires_shipping: true, -}) + return new WorkflowResponse({ + inventoryItem, + }) + } +) ``` -### Inventory Across Locations +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -Inventory items' quantities are set per locations through inventory levels. + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createInventoryItemWorkflow } from "../../workflows/create-inventory-item" -This gives you more flexibility in managing the quantity of a stock-kept item across different locations, such as different warehouses. +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await createInventoryItemWorkflow(req.scope) + .run() -```ts -const inventoryLevel = await inventoryModuleService.createInventoryLevels([ - { - inventory_item_id: "iitem_123", - location_id: "sloc_123", - stocked_quantity: 20, - }, -]) + res.send(result) +} ``` -### Reservation Management + + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createInventoryItemWorkflow } from "../workflows/create-inventory-item" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createInventoryItemWorkflow(container) + .run() + + console.log(result) +} -Reserve quantities of inventory items at specific locations for orders or other purposes. +export const config: SubscriberConfig = { + event: "user.created", +} +``` -The reserved quantity isn't considered for purchase, but can be deleted to revert the reservation. + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createInventoryItemWorkflow } from "../workflows/create-inventory-item" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createInventoryItemWorkflow(container) + .run() + + console.log(result) +} -```ts -const reservationItem = await inventoryModuleService.createReservationItems([ - { - inventory_item_id: "iitem_123", - location_id: "sloc_123", - quantity: 10, - }, -]) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Check Inventory Availability + + -Check whether an inventory item has the necessary quantity for purchase. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -Any reserved quantity is considered unavailable. +--- -```ts -const isAvailable = await inventoryModuleService.confirmInventory( - inventoryItemId, - [locationId], - neededQuantity -) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/order/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/order/links-to-other-modules/page.mdx index 07c028281bada..2964f1b91f64a 100644 --- a/www/apps/resources/app/commerce-modules/order/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/order/links-to-other-modules/page.mdx @@ -47,8 +47,8 @@ To retrieve the customer of an order with [Query](!docs!/learn/fundamentals/modu const { data: orders } = await query.graph({ entity: "order", fields: [ - "customer.*" - ] + "customer.*", + ], }) // orders.customer @@ -65,8 +65,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: orders } = useQueryGraphStep({ entity: "order", fields: [ - "customer.*" - ] + "customer.*", + ], }) // orders.customer @@ -96,8 +96,8 @@ To retrieve the cart of an order with [Query](!docs!/learn/fundamentals/module-l const { data: orders } = await query.graph({ entity: "order", fields: [ - "cart.*" - ] + "cart.*", + ], }) // orders.cart @@ -114,8 +114,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: orders } = useQueryGraphStep({ entity: "order", fields: [ - "cart.*" - ] + "cart.*", + ], }) // orders.cart @@ -197,8 +197,8 @@ To retrieve the fulfillments of a return, pass `fulfillments.*` in `fields`. const { data: orders } = await query.graph({ entity: "order", fields: [ - "fulfillments.*" - ] + "fulfillments.*", + ], }) // orders.fulfillments @@ -215,8 +215,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: orders } = useQueryGraphStep({ entity: "order", fields: [ - "fulfillments.*" - ] + "fulfillments.*", + ], }) // orders.fulfillments @@ -290,8 +290,8 @@ To retrieve the payment collections of an order, order exchange, or order claim const { data: orders } = await query.graph({ entity: "order", fields: [ - "payment_collections.*" - ] + "payment_collections.*", + ], }) // orders.payment_collections @@ -308,8 +308,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: orders } = useQueryGraphStep({ entity: "order", fields: [ - "payment_collections.*" - ] + "payment_collections.*", + ], }) // orders.payment_collections @@ -388,8 +388,8 @@ To retrieve the product, pass `product.*` in `fields`. const { data: lineItems } = await query.graph({ entity: "order_line_item", fields: [ - "variant.*" - ] + "variant.*", + ], }) // lineItems.variant @@ -406,8 +406,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: lineItems } = useQueryGraphStep({ entity: "order_line_item", fields: [ - "variant.*" - ] + "variant.*", + ], }) // lineItems.variant @@ -435,8 +435,8 @@ To retrieve the promotion applied on an order with [Query](!docs!/learn/fundamen const { data: orders } = await query.graph({ entity: "order", fields: [ - "promotion.*" - ] + "promotion.*", + ], }) // orders.promotion @@ -453,8 +453,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: orders } = useQueryGraphStep({ entity: "order", fields: [ - "promotion.*" - ] + "promotion.*", + ], }) // orders.promotion @@ -524,8 +524,8 @@ To retrieve the region of an order with [Query](!docs!/learn/fundamentals/module const { data: orders } = await query.graph({ entity: "order", fields: [ - "region.*" - ] + "region.*", + ], }) // orders.region @@ -542,8 +542,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: orders } = useQueryGraphStep({ entity: "order", fields: [ - "region.*" - ] + "region.*", + ], }) // orders.region @@ -569,8 +569,8 @@ To retrieve the sales channel of an order with [Query](!docs!/learn/fundamentals const { data: orders } = await query.graph({ entity: "order", fields: [ - "sales_channel.*" - ] + "sales_channel.*", + ], }) // orders.sales_channel @@ -587,8 +587,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: orders } = useQueryGraphStep({ entity: "order", fields: [ - "sales_channel.*" - ] + "sales_channel.*", + ], }) // orders.sales_channel diff --git a/www/apps/resources/app/commerce-modules/order/page.mdx b/www/apps/resources/app/commerce-modules/order/page.mdx index 250cf062f6f2c..6f62b3cd607f1 100644 --- a/www/apps/resources/app/commerce-modules/order/page.mdx +++ b/www/apps/resources/app/commerce-modules/order/page.mdx @@ -6,138 +6,169 @@ export const metadata = { # {metadata.title} -The Order Module provides order-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Order Module and how to use it in your application. -## How to Use Order Module's Service +Medusa has order related features available out-of-the-box through the Order Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Order Module. -You can use the Order Module's main service by resolving from the Medusa container the resource `Modules.ORDER`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## Order Features + +- [Order Management](./concepts/page.mdx): Store and manage your orders to retrieve, create, cancel, and perform other operations. +- Draft Orders: Allow merchants to create orders on behalf of their customers as draft orders that later are transformed to regular orders. +- [Apply Promotion Adjustments](./promotion-adjustments/page.mdx): Apply promotions or discounts to the order's items and shipping methods by adding adjustment lines that are factored into their subtotals. +- [Apply Tax Lines](./tax-lines/page.mdx): Apply tax lines to an order's line items and shipping methods. +- [Returns](./return/page.mdx), [Edits](./edit/page.mdx), [Exchanges](./exchange/page.mdx), and [Claims](./claim/page.mdx): Make [changes](./order-change/page.mdx) to an order to edit, return, or exchange its items, with [version-based control](./order-versioning/page.mdx) over the order's timeline. + +--- + +## How to Use the Order Module + +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. + +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +export const highlights = [ + ["12", "Modules.ORDER", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-draft-order.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const orderModuleService = container.resolve( - Modules.ORDER - ) - const orders = await orderModuleService.listOrders() -}) +const createDraftOrderStep = createStep( + "create-order", + async ({}, { container }) => { + const orderModuleService = container.resolve(Modules.ORDER) + + const draftOrder = await orderModuleService.createOrders({ + currency_code: "usd", + items: [ + { + title: "Shirt", + quantity: 1, + unit_price: 3000, + }, + ], + shipping_methods: [ + { + name: "Express shipping", + amount: 3000, + }, + ], + status: "draft", + }) + + return new StepResponse({ draftOrder }, draftOrder.id) + }, + async (draftOrderId, { container }) => { + if (!draftOrderId) { + return + } + const orderModuleService = container.resolve(Modules.ORDER) + + await orderModuleService.deleteOrders([draftOrderId]) + } +) + +export const createDraftOrderWorkflow = createWorkflow( + "create-draft-order", + () => { + const { draftOrder } = createDraftOrderStep() + + return new WorkflowResponse({ + draftOrder, + }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createDraftOrderWorkflow } from "../../workflows/create-draft-order" export async function GET( req: MedusaRequest, res: MedusaResponse -): Promise { - const orderModuleService = req.scope.resolve( - Modules.ORDER - ) - - res.json({ - orders: await orderModuleService.listOrders(), - }) +) { + const { result } = await createDraftOrderWorkflow(req.scope) + .run() + + res.send(result) } ``` - - -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" - -export default async function subscriberHandler({ container }: SubscriberArgs) { - const orderModuleService = container.resolve( - Modules.ORDER - ) + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createDraftOrderWorkflow } from "../workflows/create-draft-order" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createDraftOrderWorkflow(container) + .run() + + console.log(result) +} - const orders = await orderModuleService.listOrders() +export const config: SubscriberConfig = { + event: "user.created", } ``` - - ---- - -## Features - -### Order Management - -Store and manage your orders to retrieve, create, cancel, and perform other operations. - -```ts -const order = await orderModuleService.createOrders({ - currency_code: "usd", - items: [ - { - title: "Shirt", - quantity: 1, - unit_price: 3000, - }, - ], - shipping_methods: [ - { - name: "Express shipping", - amount: 3000, - }, - ], -}) -``` - -### Draft Orders - -Allow merchants to create orders on behalf of their customers as draft orders that later are transformed to regular orders. + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createDraftOrderWorkflow } from "../workflows/create-draft-order" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createDraftOrderWorkflow(container) + .run() + + console.log(result) +} -```ts -const draftOrder = await orderModuleService.createOrders({ - currency_code: "usd", - // other details... - status: "draft", - is_draft_order: true, -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Apply Promotions - -Apply promotions or discounts to the order's items and shipping methods by adding adjustment lines that are factored into their subtotals. - -```ts -const lineAdjustments = await orderModuleService.createOrderLineItemAdjustments({ - item_id: "cali_123", - code: "50OFF", - amount: 500, -}) - -const shippingAdjustments = - await orderModuleService.createOrderShippingMethodAdjustments({ - shipping_method_id: "casm_123", - code: "FREESHIPPING", - amount: 1000, - }) -``` + + -### Returns, Exchanges, and Claims +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -Return or exchange items, with version-based control over the order's timeline. +--- -```ts -const orderReturn = await orderModuleService.createReturn({ - order_id: "order_123", - items: [{ - id: "orditem_123", - quantity: 1, - }], -}) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/payment/examples/page.mdx b/www/apps/resources/app/commerce-modules/payment/examples/page.mdx deleted file mode 100644 index 89a28b399e033..0000000000000 --- a/www/apps/resources/app/commerce-modules/payment/examples/page.mdx +++ /dev/null @@ -1,359 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Payment Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Payment Module in your application. - - - -You should only use the Payment Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Payment Collection - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const paymentModuleService = req.scope.resolve( - Modules.PAYMENT - ) - - const paymentCollection = await paymentModuleService.createPaymentCollections( - { - region_id: "reg_123", - currency_code: "usd", - amount: 4000, - } - ) - - res.json({ - payment_collection: paymentCollection, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePaymentModule } from "@medusajs/medusa/payment" - -export async function POST(request: Request) { - const paymentModuleService = await initializePaymentModule() - - const paymentCollection = await paymentModuleService.createPaymentCollections( - { - region_id: "reg_123", - currency_code: "usd", - amount: 4000, - } - ) - - return NextResponse.json({ - payment_collection: paymentCollection, - }) -} -``` - - - - ---- - -## Create Payment Session - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const paymentModuleService = req.scope.resolve( - Modules.PAYMENT - ) - - const paymentSession = await paymentModuleService.createPaymentSession( - "pay_col_123", - { - currency_code: "usd", - provider_id: "system", - amount: 4000, - data: {}, - } - ) - - res.json({ - payment_session: paymentSession, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePaymentModule } from "@medusajs/medusa/payment" - -export async function POST(request: Request) { - const paymentModuleService = await initializePaymentModule() - - const paymentSession = await paymentModuleService.createPaymentSession( - "pay_col_123", - { - currency_code: "usd", - provider_id: "system", - amount: 4000, - data: {}, - } - ) - - return NextResponse.json({ - payment_session: paymentSession, - }) -} -``` - - - - ---- - -## List Payment Sessions of Payment Collection - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const paymentModuleService = req.scope.resolve( - Modules.PAYMENT - ) - - const paymentSessions = await paymentModuleService.listPaymentSessions({ - payment_collection_id: ["pay_col_123"], - }) - - res.json({ - payment_sessions: paymentSessions, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePaymentModule } from "@medusajs/medusa/payment" - -export async function POST(request: Request) { - const paymentModuleService = await initializePaymentModule() - - const paymentSessions = await paymentModuleService.listPaymentSessions({ - payment_collection_id: ["pay_col_123"], - }) - - return NextResponse.json({ - payment_sessions: paymentSessions, - }) -} -``` - - - - ---- - -## Authorize Payment Session - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const paymentModuleService = req.scope.resolve( - Modules.PAYMENT - ) - - const payment = await paymentModuleService.authorizePaymentSession( - "payses_123", - {} - ) - - res.json({ - payment, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePaymentModule } from "@medusajs/medusa/payment" - -export async function POST(request: Request) { - const paymentModuleService = await initializePaymentModule() - - const payment = await paymentModuleService.authorizePaymentSession( - "payses_123", - {} - ) - - return NextResponse.json({ - payment, - }) -} -``` - - - - ---- - -## List Payments of Payment Session - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const paymentModuleService = req.scope.resolve( - Modules.PAYMENT - ) - - const payments = await paymentModuleService.listPayments({ - session_id: "payses_123", - }) - - res.json({ - payments, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePaymentModule } from "@medusajs/medusa/payment" - -export async function GET(request: Request) { - const paymentModuleService = await initializePaymentModule() - - const payments = await paymentModuleService.listPayments({ - session_id: "payses_123", - }) - - return NextResponse.json({ - payments, - }) -} -``` - - - - ---- - -## Capture Payment - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const paymentModuleService = req.scope.resolve( - Modules.PAYMENT - ) - - const payment = await paymentModuleService.capturePayment({ - payment_id: "pay_123", - }) - - res.json({ - payment, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePaymentModule } from "@medusajs/medusa/payment" - -export async function POST(request: Request) { - const paymentModuleService = await initializePaymentModule() - - const payment = await paymentModuleService.capturePayment({ - payment_id: "pay_123", - }) - - return NextResponse.json({ - payment, - }) -} -``` - - - - ---- - -## More Examples - -The [Payment Module's main service reference](/references/payment) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/payment/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/payment/links-to-other-modules/page.mdx index 14af06d51b994..9c43ff095df12 100644 --- a/www/apps/resources/app/commerce-modules/payment/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/payment/links-to-other-modules/page.mdx @@ -39,8 +39,8 @@ To retrieve the cart associated with the payment collection with [Query](!docs!/ const { data: paymentCollections } = await query.graph({ entity: "payment_collection", fields: [ - "cart.*" - ] + "cart.*", + ], }) // paymentCollections.cart @@ -57,8 +57,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: paymentCollections } = useQueryGraphStep({ entity: "payment_collection", fields: [ - "cart.*" - ] + "cart.*", + ], }) // paymentCollections.cart @@ -131,8 +131,8 @@ To retrieve the order of a payment collection with [Query](!docs!/learn/fundamen const { data: paymentCollections } = await query.graph({ entity: "payment_collection", fields: [ - "order.*" - ] + "order.*", + ], }) // paymentCollections.order @@ -149,8 +149,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: paymentCollections } = useQueryGraphStep({ entity: "payment_collection", fields: [ - "order.*" - ] + "order.*", + ], }) // paymentCollections.order @@ -224,8 +224,8 @@ To retrieve the regions of a payment provider with [Query](!docs!/learn/fundamen const { data: paymentProviders } = await query.graph({ entity: "payment_provider", fields: [ - "regions.*" - ] + "regions.*", + ], }) // paymentProviders.regions @@ -242,8 +242,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: paymentProviders } = useQueryGraphStep({ entity: "payment_provider", fields: [ - "regions.*" - ] + "regions.*", + ], }) // paymentProviders.regions diff --git a/www/apps/resources/app/commerce-modules/payment/page.mdx b/www/apps/resources/app/commerce-modules/payment/page.mdx index 93865b05adbeb..5ae0b744fe0dd 100644 --- a/www/apps/resources/app/commerce-modules/payment/page.mdx +++ b/www/apps/resources/app/commerce-modules/payment/page.mdx @@ -1,5 +1,4 @@ -import { CodeTabs, CodeTab } from "docs-ui" -import { Table } from "docs-ui" +import { CodeTabs, CodeTab, ChildDocs } from "docs-ui" export const metadata = { title: `Payment Module`, @@ -7,130 +6,170 @@ export const metadata = { # {metadata.title} -The Payment Module provides payment-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Payment Module and how to use it in your application. -## How to Use Payment Module's Service +Medusa has payment related features available out-of-the-box through the Payment Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Payment Module. -You can use the Payment Module's main service by resolving from the Medusa container the resource `Modules.PAYMENT`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## Payment Features + +- [Authorize, Capture, and Refund Payments](./payment/page.mdx): Authorize, capture, and refund payments for a single resource. +- [Payment Collection Management](./payment-collection/page.mdx): Store and manage all payments of a single resources, such as a cart, in payment collections. +- [Integrate Third-Party Payment Providers](./payment-provider/page.mdx): Use payment providers like [Stripe](./payment-provider/stripe/page.mdx) to handle and process payments, or integrate custom payment providers. +- [Handle Webhook Events](./webhook-events/page.mdx): Handle webhook events from third-party providers and process the associated payment. + +--- - - +## How to Use the Payment Module -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. + +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. + +For example: + +export const highlights = [ + ["12", "Modules.PAYMENT", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-payment-collection.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const paymentModuleService = container.resolve( - Modules.PAYMENT - ) +const createPaymentCollectionStep = createStep( + "create-payment-collection", + async ({}, { container }) => { + const paymentModuleService = container.resolve(Modules.PAYMENT) + + const paymentCollection = await paymentModuleService.createPaymentCollections({ + region_id: "reg_123", + currency_code: "usd", + amount: 5000, + }) - const payment_collections = - await paymentModuleService.listPaymentCollections() -}) + return new StepResponse({ paymentCollection }, paymentCollection.id) + }, + async (paymentCollectionId, { container }) => { + if (!paymentCollectionId) { + return + } + const paymentModuleService = container.resolve(Modules.PAYMENT) + + await paymentModuleService.deletePaymentCollections([paymentCollectionId]) + } +) + +export const createPaymentCollectionWorkflow = createWorkflow( + "create-payment-collection", + () => { + const { paymentCollection } = createPaymentCollectionStep() + + return new WorkflowResponse({ + paymentCollection, + }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createPaymentCollectionWorkflow } from "../../workflows/create-payment-collection" export async function GET( req: MedusaRequest, res: MedusaResponse -): Promise { - const paymentModuleService = req.scope.resolve( - Modules.PAYMENT - ) - - res.json({ - payment_collections: await paymentModuleService.listPaymentCollections(), - }) +) { + const { result } = await createPaymentCollectionWorkflow(req.scope) + .run() + + res.send(result) } ``` - - -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" - -export default async function subscriberHandler({ container }: SubscriberArgs) { - const paymentModuleService = container.resolve( - Modules.PAYMENT - ) + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createPaymentCollectionWorkflow } from "../workflows/create-payment-collection" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createPaymentCollectionWorkflow(container) + .run() + + console.log(result) +} - const payment_collections = - await paymentModuleService.listPaymentCollections() +export const config: SubscriberConfig = { + event: "user.created", } ``` - - ---- - -## Features - -### Add Payment Functionalities to Any Resource - -The Payment Module provides payment functionalities that allow you to process payment of any resource, such as a cart. - -All payment processing starts with creating a payment collection, which carries information for authorized, captured, and refunded payments for a single resource. + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createPaymentCollectionWorkflow } from "../workflows/create-payment-collection" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createPaymentCollectionWorkflow(container) + .run() + + console.log(result) +} -```ts -const paymentCollection = await paymentModuleService.createPaymentCollections({ - region_id: "reg_123", - currency_code: "usd", - amount: 5000, -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Authorize, Capture, and Refund Payment + + -Receive and handle payments, including authorizing, capturing, and refunding payment. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -```ts -await paymentModuleService.capturePayment({ - payment_id: "pay_1", -}) -``` +--- -### Integrate Third-Party Payment Providers +## Configure Payment Module -Use payment providers like Stripe to handle and process payments. +The Payment Module accepts options for further configurations. Refer to [this documentation](./module-options/page.mdx) for details on the module's options. -```ts -const payment = await paymentModuleService.createPaymentSession("pay_col_1", { - provider_id: "stripe", - amount: 1000, - currency_code: "usd", - data: { - // necessary data for the payment provider - }, -}) -``` +--- -### Handle Webhook Events +## Providers -The Payment Module allows you to handle webhook events from third-party providers and process the associated payment. +Medusa provides the following payment providers out-of-the-box. You can use them to process payments for orders, returns, and other resources. -```ts -await paymentModuleService.processEvent({ - provider: "stripe", - payload: { - // webhook payload - }, -}) -``` + --- -## Configure Payment Module - -Refer to [this documentation](./module-options/page.mdx) for details on the module's options. + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/pricing/examples/page.mdx b/www/apps/resources/app/commerce-modules/pricing/examples/page.mdx deleted file mode 100644 index 5284571f5f7f2..0000000000000 --- a/www/apps/resources/app/commerce-modules/pricing/examples/page.mdx +++ /dev/null @@ -1,395 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Pricing Module`, -} - -# {metadata.title} - -In this document, you’ll find common examples of how you can use the Pricing Module in your application. - - - -You should only use the Pricing Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Price Set - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const pricingModuleService = request.scope.resolve( - Modules.PRICING - ) - - const priceSet = await pricingModuleService.createPriceSets([ - { - prices: [ - { - currency_code: "eur", - amount: 10, - rules: { - region_id: "reg_123", - }, - }, - ], - }, - ]) - - res.json({ price_set: priceSet }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePricingModule } from "@medusajs/medusa/pricing" - -export async function POST(request: Request) { - const pricingModuleService = await initializePricingModule() - const body = await request.json() - - const priceSet = await pricingModuleService.createPriceSets([ - { - prices: [ - { - currency_code: "eur", - amount: 10, - rules: { - region_id: "reg_123", - }, - }, - ], - }, - ]) - - return NextResponse.json({ price_set: priceSet }) -} -``` - - - - ---- - -## List Price Sets - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const pricingModuleService = request.scope.resolve( - Modules.PRICING - ) - - const priceSets = await pricingModuleService.listPriceSets() - - res.json({ price_sets: priceSets }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePricingModule } from "@medusajs/medusa/pricing" - -export async function GET(request: Request) { - const pricingModuleService = await initializePricingModule() - - const priceSets = await pricingModuleService.listPriceSets() - - return NextResponse.json({ price_sets: priceSets }) -} -``` - - - - ---- - -## Retrieve a Price Set by its ID - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const pricingModuleService = request.scope.resolve( - Modules.PRICING - ) - - const priceSet = await pricingModuleService.retrievePriceSet("pset_123") - - res.json({ price_set: priceSet }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePricingModule } from "@medusajs/medusa/pricing" - -export async function GET(request: Request) { - const pricingModuleService = await initializePricingModule() - - const priceSet = await pricingModuleService.retrievePriceSet("pset_123") - - return NextResponse.json({ price_set: priceSet }) -} -``` - - - - ---- - -## Add Prices with Rules - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const pricingModuleService = request.scope.resolve( - Modules.PRICING - ) - - const priceSet = await pricingModuleService.addPrices({ - priceSetId: "pset_123", - prices: [ - { - amount: 500, - currency_code: "USD", - rules: { - region_id: "reg_123", - }, - }, - ], - }) - - res.json({ price_set: priceSet }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePricingModule } from "@medusajs/medusa/pricing" - -export async function POST(request: Request) { - const pricingModuleService = await initializePricingModule() - const body = await request.json() - - const priceSet = await pricingModuleService.addPrices({ - priceSetId: "pset_123", - prices: [ - { - amount: 500, - currency_code: "USD", - rules: { - region_id: "reg_123", - }, - }, - ], - }) - - return NextResponse.json({ price_set: priceSet }) -} -``` - - - - ---- - -## Create Price List - - - - - ```ts collapsibleLines="1-8" expandButtonLabel="Show Imports" - import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" - import { IPricingModuleService } from "@medusajs/framework/types" - import { PriceListType } from "@medusajs/framework/utils" - import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const pricingModuleService = request.scope.resolve( - Modules.PRICING - ) - - const priceLists = await pricingModuleService.createPriceLists([ - { - title: "My Sale", - description: "This is my sale", - type: PriceListType.SALE, - starts_at: Date.parse("01/10/2023").toString(), - ends_at: Date.parse("31/10/2023").toString(), - rules: { - region_id: ["reg_123", "reg_321"], - }, - prices: [ - { - amount: 400, - currency_code: "EUR", - price_set_id: "pset_124", - }, - ], - }, - ]) - - res.json({ price_lists: priceLists }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" -import { PriceListType } from "@medusajs/framework/utils" - -import { initialize as initializePricingModule } from "@medusajs/medusa/pricing" -import { PriceListType } from "@medusajs/framework/utils" - -export async function POST(request: Request) { - const pricingModuleService = await initializePricingModule() - - const priceLists = await pricingModuleService.createPriceLists([ - { - title: "My Sale", - description: "This is my sale", - type: PriceListType.SALE, - starts_at: Date.parse("01/10/2023").toString(), - ends_at: Date.parse("31/10/2023").toString(), - rules: { - region_id: ["reg_123", "reg_321"], - }, - prices: [ - { - amount: 400, - currency_code: "EUR", - price_set_id: "pset_124", - }, - ], - }, - ]) - - return NextResponse.json({ price_lists: priceLists }) -} -``` - - - - ---- - -## Calculate Prices For a Currency - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const pricingModuleService = request.scope.resolve( - Modules.PRICING - ) - - const price = await pricingModuleService.calculatePrices( - { - id: ["pset_123"], - }, - { - context: { - currency_code: "eur", - }, - } - ) - - res.json({ price }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePricingModule } from "@medusajs/medusa/pricing" - -export async function GET(request: Request) { - const pricingModuleService = await initializePricingModule() - - const price = await pricingModuleService.calculatePrices( - { - id: ["pset_123"], - }, - { - context: { - currency_code: "eur", - }, - } - ) - - return NextResponse.json({ price }) -} -``` - - - - ---- - -## More Examples - -The [Pricing Module's main service reference](/references/pricing) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/pricing/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/pricing/links-to-other-modules/page.mdx index 5fb0e16c403b6..5348688ed4f63 100644 --- a/www/apps/resources/app/commerce-modules/pricing/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/pricing/links-to-other-modules/page.mdx @@ -36,8 +36,8 @@ To retrieve the shipping option of a price set with [Query](!docs!/learn/fundame const { data: priceSets } = await query.graph({ entity: "price_set", fields: [ - "shipping_option.*" - ] + "shipping_option.*", + ], }) // priceSets.shipping_option @@ -54,8 +54,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: priceSets } = useQueryGraphStep({ entity: "price_set", fields: [ - "shipping_option.*" - ] + "shipping_option.*", + ], }) // priceSets.shipping_option @@ -133,8 +133,8 @@ To retrieve the variant of a price set with [Query](!docs!/learn/fundamentals/mo const { data: priceSets } = await query.graph({ entity: "price_set", fields: [ - "variant.*" - ] + "variant.*", + ], }) // priceSets.variant @@ -151,8 +151,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: priceSets } = useQueryGraphStep({ entity: "price_set", fields: [ - "variant.*" - ] + "variant.*", + ], }) // priceSets.variant diff --git a/www/apps/resources/app/commerce-modules/pricing/page.mdx b/www/apps/resources/app/commerce-modules/pricing/page.mdx index 9ef1c8f6114b3..bf10090096d0b 100644 --- a/www/apps/resources/app/commerce-modules/pricing/page.mdx +++ b/www/apps/resources/app/commerce-modules/pricing/page.mdx @@ -6,157 +6,167 @@ export const metadata = { # {metadata.title} -The Pricing Module provides pricing-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Pricing Module and how to use it in your application. -## How to Use Pricing Module's Service +Medusa has pricing related features available out-of-the-box through the Pricing Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Pricing Module. -You can use the Pricing Module's main service by resolving from the Medusa container the resource `Modules.PRICING`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## Pricing Features + +- [Price Management](./concepts/page.mdx): Store and manage prices of a resource, such as a product or a variant. +- [Advanced Rule Engine](./price-rules/page.mdx): Create prices with custom rules to condition prices based on different contexts. +- [Price Lists](./concepts/page.mdx#price-list): Group prices and apply them only in specific conditions with price lists. +- [Price Calculation Strategy](./price-calculation/page.mdx): Retrieve the best price in a given context and for the specified rule values. +- [Tax-Inclusive Pricing](./tax-inclusive-pricing/page.mdx): Calculate prices with taxes included in the price, and Medusa will handle calculating the taxes automatically. + +--- - - +## How to Use the Pricing Module -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. + +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. + +For example: + +export const highlights = [ + ["12", "Modules.PRICING", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-price-set.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const pricingModuleService = container.resolve( - Modules.PRICING - ) +const createPriceSetStep = createStep( + "create-price-set", + async ({}, { container }) => { + const pricingModuleService = container.resolve(Modules.PRICING) + + const priceSet = await pricingModuleService.createPriceSets({ + prices: [ + { + amount: 500, + currency_code: "USD", + }, + { + amount: 400, + currency_code: "EUR", + min_quantity: 0, + max_quantity: 4, + rules: {}, + }, + ], + }) + + return new StepResponse({ priceSet }, priceSet.id) + }, + async (priceSetId, { container }) => { + if (!priceSetId) { + return + } + const pricingModuleService = container.resolve(Modules.PRICING) - const priceSets = await pricingModuleService.listPriceSets() -}) + await pricingModuleService.deletePriceSets([priceSetId]) + } +) + +export const createPriceSetWorkflow = createWorkflow( + "create-price-set", + () => { + const { priceSet } = createPriceSetStep() + + return new WorkflowResponse({ + priceSet, + }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createPriceSetWorkflow } from "../../workflows/create-price-set" export async function GET( - request: MedusaRequest, + req: MedusaRequest, res: MedusaResponse -): Promise { - const pricingModuleService = request.scope.resolve( - Modules.PRICING - ) - - res.json({ - price_sets: await pricingModuleService.listPriceSets(), - }) +) { + const { result } = await createPriceSetWorkflow(req.scope) + .run() + + res.send(result) } ``` - - -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" - -export default async function subscriberHandler({ container }: SubscriberArgs) { - const pricingModuleService = container.resolve( - Modules.PRICING - ) + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createPriceSetWorkflow } from "../workflows/create-price-set" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createPriceSetWorkflow(container) + .run() + + console.log(result) +} - const priceSets = await pricingModuleService.listPriceSets() +export const config: SubscriberConfig = { + event: "user.created", } ``` - - ---- - -## Features - -### Price Management - -Store the prices of a resource and manage them through the main service's methods. - -Prices are grouped in a price set, allowing you to add more than one price for a resource based on different conditions, such as currency code. - -```ts -const priceSet = await pricingModuleService.createPriceSets({ - prices: [ - { - amount: 500, - currency_code: "USD", - }, - { - amount: 400, - currency_code: "EUR", - min_quantity: 0, - max_quantity: 4, - rules: {}, - }, - ], -}) -``` + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createPriceSetWorkflow } from "../workflows/create-price-set" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createPriceSetWorkflow(container) + .run() + + console.log(result) +} -### Advanced Rule Engine - -Create prices with custom rules. This gives you more flexibility in how you condition prices, filter them, and ensure the best prices are retrieved for custom contexts. - -```ts highlights={[["8"]]} -const priceSet = await pricingModuleService.addPrices({ - priceSetId: "pset_123", - prices: [ - { - amount: 500, - currency_code: "EUR", - rules: { - region_id: "reg_123", - }, - }, - ], -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Price Lists - -Group prices and apply them only in specific conditions with price lists. - -You can also use them to override existing prices for specified conditions, or create a sale. - -```ts -const priceList = await pricingModuleService.createPriceLists([ - { - title: "My Sale", - description: "Sale on selected items.", - type: "sale", - starts_at: Date.parse("01/10/2023").toString(), - ends_at: Date.parse("31/10/2023").toString(), - rules: { - region_id: ["reg_123", "reg_321"], - }, - prices: [ - { - amount: 400, - currency_code: "EUR", - price_set_id: "pset_123", - }, - ], - }, -]) -``` + + -### Price Calculation Strategy +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -Retrieve the best price in a given context and for the specified rule values. +--- -```ts -const price = await pricingModuleService.calculatePrices( - { id: ["pset_123"] }, - { - context: { - currency_code: "EUR", - region_id: "reg_123", - }, - } -) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/product/examples/page.mdx b/www/apps/resources/app/commerce-modules/product/examples/page.mdx deleted file mode 100644 index dace573df9095..0000000000000 --- a/www/apps/resources/app/commerce-modules/product/examples/page.mdx +++ /dev/null @@ -1,325 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Product Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Product Module in your application. - - - -You should only use the Product Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create Product - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const productModuleService = request.scope.resolve( - Modules.PRODUCT - ) - - const products = await productModuleService.createProducts([ - { - title: "Medusa Shirt", - options: [ - { - title: "Color", - }, - ], - variants: [ - { - title: "Black Shirt", - options: [ - { - value: "Black", - }, - ], - }, - ], - }, - ]) - - res.json({ products }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeProductModule } from "@medusajs/medusa/product" - -export async function POST(request: Request) { - const productModuleService = await initializeProductModule() - - const products = await productModuleService.createProducts([ - { - title: "Medusa Shirt", - options: [ - { - title: "Color", - }, - ], - variants: [ - { - title: "Black Shirt", - options: [ - { - value: "Black", - }, - ], - }, - ], - }, - ]) - - return NextResponse.json({ products }) -} -``` - - - - ---- - -## List Products - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET(request: MedusaRequest, res: MedusaResponse) { - const productModuleService = request.scope.resolve( - Modules.PRODUCT - ) - - const products = await productModuleService.listProducts() - - res.json({ products }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeProductModule } from "@medusajs/medusa/product" - -export async function GET(request: Request) { - const productModuleService = await initializeProductModule() - - const products = await productModuleService.listProducts() - - return NextResponse.json({ products }) -} -``` - - - - ---- - -## Retrieve a Product by its ID - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET(request: MedusaRequest, res: MedusaResponse) { - const productModuleService = request.scope.resolve( - Modules.PRODUCT - ) - - const product = await productModuleService.retrieveProduct(request.params.id) - - res.json({ product }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeProductModule } from "@medusajs/medusa/product" - -export async function GET( - request: Request, - { params }: { params: Record } -) { - const { id } = params - const productModuleService = await initializeProductModule() - - const product = await productModuleService.retrieveProduct(id) - - return NextResponse.json({ product }) -} -``` - - - - ---- - -## Retrieve a Product by its Handle - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET(request: MedusaRequest, res: MedusaResponse) { - const productModuleService = request.scope.resolve( - Modules.PRODUCT - ) - - const data = await productModuleService.listProducts({ - handle: "shirt", - }) - - res.json({ product: data[0] }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeProductModule } from "@medusajs/medusa/product" - -export async function GET(request: Request) { - const productModuleService = await initializeProductModule() - - const data = await productModuleService.listProducts({ - handle: "shirt", - }) - - return NextResponse.json({ product: data[0] }) -} -``` - - - - ---- - -## Retrieve Categories - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const productModuleService = request.scope.resolve( - Modules.PRODUCT - ) - - const categories = await productModuleService.listProductCategories() - - res.json({ categories }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeProductModule } from "@medusajs/medusa/product" - -export async function GET(request: Request) { - const productModuleService = await initializeProductModule() - - const categories = await productModuleService.listProductCategories() - - return NextResponse.json({ categories }) -} -``` - - - - ---- - -## Retrieve Category by Handle - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST(request: MedusaRequest, res: MedusaResponse) { - const productModuleService = request.scope.resolve( - Modules.PRODUCT - ) - - const data = await productModuleService.listProductCategories({ - handle: request.params.handle, - }) - - res.json({ category: data[0] }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeProductModule } from "@medusajs/medusa/product" - -export async function GET( - request: Request, - { params }: { params: Record } -) { - const { handle } = params - const productModuleService = await initializeProductModule() - - const data = await productModuleService.listProductCategories({ - handle, - }) - - return NextResponse.json({ category: data[0] }) -} -``` - - - - ---- - -## More Examples - -The [Product Module's main service reference](/references/product) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/product/guides/price-with-taxes/page.mdx b/www/apps/resources/app/commerce-modules/product/guides/price-with-taxes/page.mdx index d615be436a614..7e405cabeec15 100644 --- a/www/apps/resources/app/commerce-modules/product/guides/price-with-taxes/page.mdx +++ b/www/apps/resources/app/commerce-modules/product/guides/price-with-taxes/page.mdx @@ -5,6 +5,7 @@ tags: - pricing - query - tax + - server --- export const metadata = { 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 d03f5a6c147e9..afc633b2cd47e 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 @@ -4,6 +4,7 @@ tags: - product - pricing - query + - server --- export const metadata = { diff --git a/www/apps/resources/app/commerce-modules/product/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/product/links-to-other-modules/page.mdx index 04fd9fedbf21d..1e92032bd8aec 100644 --- a/www/apps/resources/app/commerce-modules/product/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/product/links-to-other-modules/page.mdx @@ -50,8 +50,8 @@ To retrieve the line items of a product, pass `line_items.*` in `fields`. const { data: variants } = await query.graph({ entity: "variant", fields: [ - "line_items.*" - ] + "line_items.*", + ], }) // variants.line_items @@ -68,8 +68,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: variants } = useQueryGraphStep({ entity: "variant", fields: [ - "line_items.*" - ] + "line_items.*", + ], }) // variants.line_items @@ -101,8 +101,8 @@ To retrieve the inventory items of a product variant with [Query](!docs!/learn/f const { data: variants } = await query.graph({ entity: "variant", fields: [ - "inventory_items.*" - ] + "inventory_items.*", + ], }) // variants.inventory_items @@ -119,8 +119,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: variants } = useQueryGraphStep({ entity: "variant", fields: [ - "inventory_items.*" - ] + "inventory_items.*", + ], }) // variants.inventory_items @@ -199,8 +199,8 @@ To retrieve a product's order line items, pass `order_items.*` in `fields`. const { data: variants } = await query.graph({ entity: "variant", fields: [ - "order_items.*" - ] + "order_items.*", + ], }) // variants.order_items @@ -217,8 +217,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: variants } = useQueryGraphStep({ entity: "variant", fields: [ - "order_items.*" - ] + "order_items.*", + ], }) // variants.order_items @@ -250,8 +250,8 @@ To retrieve the price set of a variant with [Query](!docs!/learn/fundamentals/mo const { data: variants } = await query.graph({ entity: "variant", fields: [ - "price_set.*" - ] + "price_set.*", + ], }) // variants.price_set @@ -268,8 +268,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: variants } = useQueryGraphStep({ entity: "variant", fields: [ - "price_set.*" - ] + "price_set.*", + ], }) // variants.price_set @@ -343,8 +343,8 @@ To retrieve the sales channels of a product with [Query](!docs!/learn/fundamenta const { data: products } = await query.graph({ entity: "product", fields: [ - "sales_channels.*" - ] + "sales_channels.*", + ], }) // products.sales_channels @@ -361,8 +361,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: products } = useQueryGraphStep({ entity: "product", fields: [ - "sales_channels.*" - ] + "sales_channels.*", + ], }) // products.sales_channels diff --git a/www/apps/resources/app/commerce-modules/product/page.mdx b/www/apps/resources/app/commerce-modules/product/page.mdx index df937a65754ed..45777f4580cd0 100644 --- a/www/apps/resources/app/commerce-modules/product/page.mdx +++ b/www/apps/resources/app/commerce-modules/product/page.mdx @@ -6,114 +6,166 @@ export const metadata = { # {metadata.title} -The Product Module provides product-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Product Module and how to use it in your application. -## How to Use Product Module's Service +Medusa has product related features available out-of-the-box through the Product Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Product Module. -You can use the Product Module's main service by resolving from the Medusa container the resource `Modules.PRODUCT`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## Product Features -const step1 = createStep("step-1", async (_, { container }) => { - const productModuleService = container.resolve( - Modules.PRODUCT - ) +- [Products Management](/references/product/models/Product): Store and manage products. Products have custom options, such as color or size, and each variant in the product sets the value for these options. +- [Product Organization](/references/product/models): The Product Module provides different data models used to organize products, including categories, collections, tags, and more. - const products = await productModuleService.listProducts() -}) -``` +--- - - +## How to Use the Product Module + +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. + +For example: + +export const highlights = [ + ["12", "Modules.PRODUCT", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-product.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -export async function GET(request: MedusaRequest, res: MedusaResponse) { - const productModuleService = request.scope.resolve( - Modules.PRODUCT - ) +const createProductStep = createStep( + "create-product", + async ({}, { container }) => { + const productService = container.resolve(Modules.PRODUCT) + + const product = await productService.createProducts({ + title: "Medusa Shirt", + options: [ + { + title: "Color", + values: ["Black", "White"], + }, + ], + variants: [ + { + title: "Black Shirt", + options: { + Color: "Black", + }, + }, + ], + }) - res.json({ - products: await productModuleService.listProducts(), - }) -} + return new StepResponse({ product }, product.id) + }, + async (productId, { container }) => { + if (!productId) { + return + } + const productService = container.resolve(Modules.PRODUCT) + + await productService.deleteProducts([productId]) + } +) + +export const createProductWorkflow = createWorkflow( + "create-product", + () => { + const { product } = createProductStep() + + return new WorkflowResponse({ + product, + }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createProductWorkflow } from "../../workflows/create-product" + +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await createProductWorkflow(req.scope) + .run() + + res.send(result) +} +``` -export default async function subscriberHandler({ container }: SubscriberArgs) { - const productModuleService = container.resolve( - Modules.PRODUCT - ) + + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createProductWorkflow } from "../workflows/create-product" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createProductWorkflow(container) + .run() + + console.log(result) +} - const products = await productModuleService.listProducts() +export const config: SubscriberConfig = { + event: "user.created", } ``` - - ---- + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createProductWorkflow } from "../workflows/create-product" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createProductWorkflow(container) + .run() + + console.log(result) +} -## Features - -### Products Management - -Store and manage products. Products have custom options, such as color or size, and each variant in the product sets the value for these options. - -```ts -const products = await productService.createProducts([ - { - title: "Medusa Shirt", - options: [ - { - title: "Color", - values: ["Black", "White"], - }, - ], - variants: [ - { - title: "Black Shirt", - options: { - Color: "Black", - }, - }, - ], - }, -]) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Product Organization + + -The Product Module provides different data models used to organize products, including categories, collections, tags, and more. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -```ts -const category = await productService.createProductCategories({ - name: "Shirts", -}) +--- -const products = await productService.updateProducts([ - { - id: product.id, - categories: [ - { - id: category.id, - }, - ], - }, -]) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/promotion/examples/page.mdx b/www/apps/resources/app/commerce-modules/promotion/examples/page.mdx deleted file mode 100644 index bdbdde6ff103f..0000000000000 --- a/www/apps/resources/app/commerce-modules/promotion/examples/page.mdx +++ /dev/null @@ -1,261 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Promotion Module`, -} - -# {metadata.title} - -In this document, you’ll find common examples of how you can use the Promotion Module in your application. - - - -You should only use the Promotion Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Promotion - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const promotionModuleService = request.scope.resolve( - Modules.PROMOTION - ) - - const promotion = await promotionModuleService.createPromotions({ - code: "10%OFF", - type: "standard", - application_method: { - type: "percentage", - target_type: "order", - value: "10", - currency_code: "usd", - }, - }) - - res.json({ promotion }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePromotionModule } from "@medusajs/medusa/promotion" - -export async function POST(request: Request) { - const promotionModuleService = await initializePromotionModule() - const body = await request.json() - - const promotion = await promotionModuleService.createPromotions({ - code: "10%OFF", - type: "standard", - application_method: { - type: "percentage", - target_type: "order", - value: "10", - currency_code: "usd", - }, - }) - - return NextResponse.json({ promotion }) -} -``` - - - - ---- - -## Create a Campaign - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const promotionModuleService = request.scope.resolve( - Modules.PROMOTION - ) - - const campaign = await promotionModuleService.createCampaigns({ - name: "Summer Discounts", - campaign_identifier: "G-123445", - starts_at: new Date("2024-05-02"), - ends_at: new Date("2024-07-20"), - }) - - res.json({ campaign }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePromotionModule } from "@medusajs/medusa/promotion" - -export async function POST(request: Request) { - const promotionModuleService = await initializePromotionModule() - const body = await request.json() - - const campaign = await promotionModuleService.createCampaigns({ - name: "Summer Discounts", - campaign_identifier: "G-123445", - starts_at: new Date("2024-05-02"), - ends_at: new Date("2024-07-20"), - }) - - return NextResponse.json({ campaign }) -} -``` - - - - ---- - -## Create a Promotion with Flexible Rules - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const promotionModuleService = request.scope.resolve( - Modules.PROMOTION - ) - - const promotion = await promotionModuleService.createPromotions({ - code: "10%OFF", - type: "standard", - application_method: { - type: "percentage", - target_type: "order", - value: "10", - currency_code: "usd", - }, - rules: [ - { - attribute: "customer_group_id", - operator: "eq", - values: ["VIP"], - }, - ], - }) - - res.json({ promotion }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePromotionModule } from "@medusajs/medusa/promotion" - -export async function POST(request: Request) { - const promotionModuleService = await initializePromotionModule() - - const promotion = await promotionModuleService.createPromotions({ - code: "10%OFF", - type: "standard", - application_method: { - type: "percentage", - target_type: "order", - value: "10", - currency_code: "usd", - }, - rules: [ - { - attribute: "customer_group_id", - operator: "eq", - values: ["VIP"], - }, - ], - }) - - return NextResponse.json({ promotion }) -} -``` - - - - ---- - -## List Promotions - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const promotionModuleService = request.scope.resolve( - Modules.PROMOTION - ) - - res.json({ - promotions: await promotionModuleService.listPromotions(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializePromotionModule } from "@medusajs/medusa/promotion" - -export async function GET(request: Request) { - const promotionModuleService = await initializePromotionModule() - - return NextResponse.json({ - promotions: await promotionModuleService.listPromotions(), - }) -} -``` - - - - ---- - -## More Examples - -The [Promotion Module's main service reference](/references/promotion) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/promotion/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/promotion/links-to-other-modules/page.mdx index 356a3f9134f67..6b73eec158760 100644 --- a/www/apps/resources/app/commerce-modules/promotion/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/promotion/links-to-other-modules/page.mdx @@ -49,8 +49,8 @@ To retrieve the line item adjustments of a promotion, pass `line_item_adjustment const { data: promotions } = await query.graph({ entity: "promotion", fields: [ - "carts.*" - ] + "carts.*", + ], }) // promotions.carts @@ -67,8 +67,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: promotions } = useQueryGraphStep({ entity: "promotion", fields: [ - "carts.*" - ] + "carts.*", + ], }) // promotions.carts @@ -140,8 +140,8 @@ To retrieve the orders a promotion is applied on with [Query](!docs!/learn/funda const { data: promotions } = await query.graph({ entity: "promotion", fields: [ - "orders.*" - ] + "orders.*", + ], }) // promotions.orders @@ -158,8 +158,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: promotions } = useQueryGraphStep({ entity: "promotion", fields: [ - "orders.*" - ] + "orders.*", + ], }) // promotions.orders diff --git a/www/apps/resources/app/commerce-modules/promotion/page.mdx b/www/apps/resources/app/commerce-modules/promotion/page.mdx index 0539c524dcf8a..947659e9581f2 100644 --- a/www/apps/resources/app/commerce-modules/promotion/page.mdx +++ b/www/apps/resources/app/commerce-modules/promotion/page.mdx @@ -6,130 +6,161 @@ export const metadata = { # {metadata.title} -The Promotion Module provides promotion-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Promotion Module and how to use it in your application. -## How to Use the Promotion Module's Service +Medusa has promotion related features available out-of-the-box through the Promotion Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Promotion Module. -You can use the Promotion Module's main service by resolving from the Medusa container the resource `Modules.PROMOTION`. + -For example: +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +## Promotion Features -const step1 = createStep("step-1", async (_, { container }) => { - const promotionModuleService = container.resolve( - Modules.PROMOTION - ) +- [Discount Functionalities](./concepts/page.mdx): A promotion discounts an amount or percentage of a cart's items, shipping methods, or the entire order. +- [Flexible Promotion Rules](./concepts/page.mdx#flexible-rules): A promotion has rules that restricts when the promotion is applied. +- [Campaign Management](./campaign/page.mdx): A campaign combines promotions under the same conditions, such as start and end dates, and budget configurations. +- [Apply Promotion on Carts and Orders](./actions/page.mdx): Apply promotions on carts and orders to discount items, shipping methods, or the entire order. - const promotions = await promotionModuleService.listPromotions() -}) -``` +--- - - +## How to Use the Promotion Module -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const promotionModuleService = request.scope.resolve( - Modules.PROMOTION - ) - - res.json({ - promotions: await promotionModuleService.listPromotions(), - }) -} -``` +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" +export const highlights = [ + ["12", "Modules.PROMOTION", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-promotion.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -export default async function subscriberHandler({ container }: SubscriberArgs) { - const promotionModuleService = container.resolve( - Modules.PROMOTION - ) - - const promotions = await promotionModuleService.listPromotions() -} +const createPromotionStep = createStep( + "create-promotion", + async ({}, { container }) => { + const promotionModuleService = container.resolve(Modules.PROMOTION) + + const promotion = await promotionModuleService.createPromotions({ + code: "10%OFF", + type: "standard", + application_method: { + type: "percentage", + target_type: "order", + value: 10, + currency_code: "usd", + }, + }) + + return new StepResponse({ promotion }, promotion.id) + }, + async (promotionId, { container }) => { + if (!promotionId) { + return + } + const promotionModuleService = container.resolve(Modules.PROMOTION) + + await promotionModuleService.deletePromotions(promotionId) + } +) + +export const createPromotionWorkflow = createWorkflow( + "create-promotion", + () => { + const { promotion } = createPromotionStep() + + return new WorkflowResponse({ + promotion, + }) + } +) ``` - - - ---- +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -## Features - -### Discount Functionalities - -A promotion discounts an amount or percentage of a cart's items, shipping methods, or the entire order. + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createPromotionWorkflow } from "../../workflows/create-cart" -The Promotion Module allows you to store and manage promotions. +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await createPromotionWorkflow(req.scope) + .run() -```ts -const promotion = await promotionModuleService.createPromotions({ - code: "10%OFF", - type: "standard", - application_method: { - type: "percentage", - target_type: "order", - value: "10", - currency_code: "usd", - }, -}) + res.send(result) +} ``` -### Flexible Promotion Rules + + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createPromotionWorkflow } from "../workflows/create-cart" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createPromotionWorkflow(container) + .run() + + console.log(result) +} -A promotion has rules that restricts when it's applied. +export const config: SubscriberConfig = { + event: "user.created", +} +``` -For example, you can create a promotion that's only applied to VIP customers. + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createPromotionWorkflow } from "../workflows/create-cart" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createPromotionWorkflow(container) + .run() + + console.log(result) +} -```ts -const promotion = await promotionModuleService.createPromotions({ - code: "10%OFF", - type: "standard", - application_method: { - type: "percentage", - target_type: "order", - value: "10", - currency_code: "usd", - }, - rules: [ - { - attribute: "customer_group_id", - operator: "eq", - values: ["VIP"], - }, - ], -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Campaign Management + + -A campaign combines promotions under the same conditions, such as start and end dates. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -A campaign can also have an identifier for tracking purposes, such as tracking through tools like Google Analytics. +--- -```ts -const campaign = await promotionModuleService.createCampaigns({ - name: "Summer Discounts", - campaign_identifier: "G-123445", - starts_at: new Date("2024-05-02"), - ends_at: new Date("2024-07-20"), -}) -``` + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/region/examples/page.mdx b/www/apps/resources/app/commerce-modules/region/examples/page.mdx deleted file mode 100644 index 09b9d6b055057..0000000000000 --- a/www/apps/resources/app/commerce-modules/region/examples/page.mdx +++ /dev/null @@ -1,256 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Region Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Region Module in your application. - - - -You should only use the Region Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Region - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const regionModuleService = req.scope.resolve( - Modules.REGION - ) - - const region = await regionModuleService.createRegions({ - name: "Europe", - currency_code: "eur", - }) - - res.json({ - region, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeRegionModule } from "@medusajs/medusa/region" - -export async function POST(request: Request) { - const regionModuleService = await initializeRegionModule() - - const region = await regionModuleService.createRegions({ - name: "Europe", - currency_code: "eur", - }) - - res.json({ - region, - }) -} -``` - - - - ---- - -## List Regions - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const regionModuleService = req.scope.resolve( - Modules.REGION - ) - - res.json({ - regions: await regionModuleService.listRegions(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeRegionModule } from "@medusajs/medusa/region" - -export async function GET(request: Request) { - const regionModuleService = await initializeRegionModule() - - return NextResponse.json({ - regions: await regionModuleService.listRegions(), - }) -} -``` - - - - ---- - -## Retrieve a Region by its ID - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const regionModuleService = req.scope.resolve( - Modules.REGION - ) - - const region = await regionModuleService.retrieveRegion("reg_123") - - res.json({ region }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeRegionModule } from "@medusajs/medusa/region" - -export async function GET(request: Request) { - const regionModuleService = await initializeRegionModule() - - const region = await regionModuleService.retrieveRegion("reg_123") - - return NextResponse.json({ region }) -} -``` - - - - ---- - -## Update a Region - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const regionModuleService = req.scope.resolve( - Modules.REGION - ) - - const region = await regionModuleService.updateRegions("reg_123", { - automatic_taxes: false, - }) - - res.json({ region }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeRegionModule } from "@medusajs/medusa/region" - -export async function POST(request: Request) { - const regionModuleService = await initializeRegionModule() - - const region = await regionModuleService.updateRegions("reg_123", { - automatic_taxes: false, - }) - - return NextResponse.json({ region }) -} -``` - - - - ---- - -## Delete a Region - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const regionModuleService = req.scope.resolve( - Modules.REGION - ) - - await regionModuleService.deleteRegions("reg_123") - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeRegionModule } from "@medusajs/medusa/region" - -export async function DELETE(request: Request) { - const regionModuleService = await initializeRegionModule() - - await regionModuleService.deleteRegions("reg_123") -} -``` - - - - ---- - -## More Examples - -The [Region Module's main service reference](/references/region) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/region/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/region/links-to-other-modules/page.mdx index 08881435999fd..1d7183799bb00 100644 --- a/www/apps/resources/app/commerce-modules/region/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/region/links-to-other-modules/page.mdx @@ -39,8 +39,8 @@ To retrieve the carts of a region with [Query](!docs!/learn/fundamentals/module- const { data: regions } = await query.graph({ entity: "region", fields: [ - "carts.*" - ] + "carts.*", + ], }) // regions.carts @@ -57,8 +57,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: regions } = useQueryGraphStep({ entity: "region", fields: [ - "carts.*" - ] + "carts.*", + ], }) // regions.carts @@ -84,8 +84,8 @@ To retrieve the orders of a region with [Query](!docs!/learn/fundamentals/module const { data: regions } = await query.graph({ entity: "region", fields: [ - "orders.*" - ] + "orders.*", + ], }) // regions.orders @@ -102,8 +102,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: regions } = useQueryGraphStep({ entity: "region", fields: [ - "orders.*" - ] + "orders.*", + ], }) // regions.orders @@ -133,8 +133,8 @@ To retrieve the payment providers of a region with [Query](!docs!/learn/fundamen const { data: regions } = await query.graph({ entity: "region", fields: [ - "payment_providers.*" - ] + "payment_providers.*", + ], }) // regions.payment_providers @@ -151,8 +151,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: regions } = useQueryGraphStep({ entity: "region", fields: [ - "payment_providers.*" - ] + "payment_providers.*", + ], }) // regions.payment_providers diff --git a/www/apps/resources/app/commerce-modules/region/page.mdx b/www/apps/resources/app/commerce-modules/region/page.mdx index 9c6ebe902b17f..8d7ccc275021a 100644 --- a/www/apps/resources/app/commerce-modules/region/page.mdx +++ b/www/apps/resources/app/commerce-modules/region/page.mdx @@ -6,125 +6,156 @@ export const metadata = { # {metadata.title} -The Region Module provides region-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Region Module and how to use it in your application. + +Medusa has region related features available out-of-the-box through the Region Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Region Module. + + + +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +--- + +## Region Features + +- [Region Management](/references/region/models/Region): Manage regions in your store. You can create regions with different currencies and settings. +- [Multi-Currency Support](/references/region/models/Region): Each region has a currency. You can support multiple currencies in your store by creating multiple regions. +- [Different Settings Per Region](/references/region/models/Region): Each region has its own settings, such as what countries belong to a region or its tax settings. + +--- ## How to Use Region Module's Service -You can use the Region Module's main service by resolving from the Medusa container the resource `Modules.REGION`. +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -For example: +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +export const highlights = [ + ["12", "Modules.REGION", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-region.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const regionModuleService = container.resolve( - Modules.REGION - ) +const createRegionStep = createStep( + "create-region", + async ({}, { container }) => { + const regionModuleService = container.resolve(Modules.REGION) + + const region = await regionModuleService.createRegions({ + name: "Europe", + currency_code: "eur", + }) - const regions = await regionModuleService.listRegions() -}) + return new StepResponse({ region }, region.id) + }, + async (regionId, { container }) => { + if (!regionId) { + return + } + const regionModuleService = container.resolve(Modules.REGION) + + await regionModuleService.deleteRegions([regionId]) + } +) + +export const createRegionWorkflow = createWorkflow( + "create-region", + () => { + const { region } = createRegionStep() + + return new WorkflowResponse({ + region, + }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createRegionWorkflow } from "../../workflows/create-region" export async function GET( req: MedusaRequest, res: MedusaResponse -): Promise { - const regionModuleService = req.scope.resolve( - Modules.REGION - ) - - res.json({ - regions: await regionModuleService.listRegions(), - }) +) { + const { result } = await createRegionWorkflow(req.scope) + .run() + + res.send(result) } ``` - + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createRegionWorkflow } from "../workflows/create-region" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createRegionWorkflow(container) + .run() + + console.log(result) +} -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" +export const config: SubscriberConfig = { + event: "user.created", +} +``` -export default async function subscriberHandler({ container }: SubscriberArgs) { - const regionModuleService = container.resolve( - Modules.REGION - ) + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createRegionWorkflow } from "../workflows/create-region" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createRegionWorkflow(container) + .run() + + console.log(result) +} - const regions = await regionModuleService.listRegions() +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, } ``` ---- - -## What is a Region? - -A region represents the area you sell products in. Each region can cover multiple countries, but uses a single currency. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). --- -## Features - -### Region Management - -You can manage your regions to create, update, retrieve, or delete them. - -```ts -const region = await regionModuleService.createRegions({ - name: "Europe", - currency_code: "eur", -}) -``` - -### Multi-Currency Support - -As each region has a currency, you can support multiple currencies in your store by creating multiple regions. - -```ts -const regions = await regionModuleService.createRegions([ - { - name: "Europe", - currency_code: "eur", - }, - { - name: "United States of America", - currency_code: "usd", - }, -]) -``` - -### Different Settings Per Region - -Each region has its own settings, such as what countries belong to a region or its tax settings. Each region has different tax rates, payment providers, and more provided by other commerce modules. - -```ts -const regions = await regionModuleService.createRegions([ - { - name: "Europe", - currency_code: "eur", - countries: ["dk", "de", "fr", "it", "pt"], - automatic_taxes: true, - }, - { - name: "United States of America", - currency_code: "usd", - countries: ["us"], - payment_providers: ["stripe"], - }, -]) -``` + diff --git a/www/apps/resources/app/commerce-modules/sales-channel/examples/page.mdx b/www/apps/resources/app/commerce-modules/sales-channel/examples/page.mdx deleted file mode 100644 index f32b492bcda07..0000000000000 --- a/www/apps/resources/app/commerce-modules/sales-channel/examples/page.mdx +++ /dev/null @@ -1,257 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Sales Channel Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Sales Channel Module in your application. - - - -You should only use the Sales Channel Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Sales Channel - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const salesChannelModuleService = - request.scope.resolve(Modules.SALES_CHANNEL) - - const salesChannel = await salesChannelModuleService.createSalesChannels({ - name: "B2B", - }) - - res.json({ - sales_channel: salesChannel, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeSalesChannelModule } from "@medusajs/medusa/sales-channel" - -export async function POST(request: Request) { - const salesChannelModuleService = await initializeSalesChannelModule() - - const salesChannel = await salesChannelModuleService.createSalesChannels({ - name: "B2B", - }) - - return NextResponse.json({ sales_channel: salesChannel }) -} -``` - - - - ---- - -## List Sales Channels - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const salesChannelModuleService = - request.scope.resolve(Modules.SALES_CHANNEL) - - res.json({ - sales_channels: salesChannelModuleService.listSalesChannels(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeSalesChannelModule } from "@medusajs/medusa/sales-channel" - -export async function GET(request: Request) { - const salesChannelModuleService = await initializeSalesChannelModule() - - const salesChannels = await salesChannelModuleService.listSalesChannels() - - return NextResponse.json({ sales_channels: salesChannels }) -} -``` - - - - ---- - -## Retrieve a Sales Channel by its ID - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const salesChannelModuleService = - request.scope.resolve(Modules.SALES_CHANNEL) - - const salesChannel = await salesChannelModuleService.retrieveSalesChannel( - "sc_123" - ) - - res.json({ - sales_channel: salesChannel, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeSalesChannelModule } from "@medusajs/medusa/sales-channel" - -export async function GET(request: Request) { - const salesChannelModuleService = await initializeSalesChannelModule() - - const salesChannel = await salesChannelModuleService.retrieveSalesChannel( - "sc_123" - ) - - return NextResponse.json({ sales_channel: salesChannel }) -} -``` - - - - ---- - -## Update a Sales Channel - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const salesChannelModuleService = - request.scope.resolve(Modules.SALES_CHANNEL) - - const salesChannel = await salesChannelModuleService.updateSalesChannels({ - id: "sc_123", - description: "Sales channel for B2B customers", - }) - - res.json({ - sales_channel: salesChannel, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeSalesChannelModule } from "@medusajs/medusa/sales-channel" - -export async function POST(request: Request) { - const salesChannelModuleService = await initializeSalesChannelModule() - - const salesChannel = await salesChannelModuleService.updateSalesChannels({ - id: "sc_123", - description: "Sales channel for B2B customers", - }) - - return NextResponse.json({ sales_channel: salesChannel }) -} -``` - - - - ---- - -## Delete a Sales Channel - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const salesChannelModuleService = - request.scope.resolve(Modules.SALES_CHANNEL) - - await salesChannelModuleService.deleteSalesChannels("sc_123") - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeSalesChannelModule } from "@medusajs/medusa/sales-channel" - -export async function DELETE(request: Request) { - const salesChannelModuleService = await initializeSalesChannelModule() - - await salesChannelModuleService.deleteSalesChannels("sc_123") -} -``` - - - - ---- - -## More Examples - -The [Sales Channel Module's main service reference](/references/sales-channel) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/sales-channel/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/sales-channel/links-to-other-modules/page.mdx index fb68fb6608c40..23e46d578b8c2 100644 --- a/www/apps/resources/app/commerce-modules/sales-channel/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/sales-channel/links-to-other-modules/page.mdx @@ -45,8 +45,8 @@ To retrieve the API keys associated with a sales channel with [Query](!docs!/lea const { data: salesChannels } = await query.graph({ entity: "sales_channel", fields: [ - "publishable_api_keys.*" - ] + "publishable_api_keys.*", + ], }) // salesChannels.publishable_api_keys @@ -63,8 +63,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: salesChannels } = useQueryGraphStep({ entity: "sales_channel", fields: [ - "publishable_api_keys.*" - ] + "publishable_api_keys.*", + ], }) // salesChannels.publishable_api_keys @@ -134,8 +134,8 @@ To retrieve the carts of a sales channel with [Query](!docs!/learn/fundamentals/ const { data: salesChannels } = await query.graph({ entity: "sales_channel", fields: [ - "carts.*" - ] + "carts.*", + ], }) // salesChannels.carts @@ -152,8 +152,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: salesChannels } = useQueryGraphStep({ entity: "sales_channel", fields: [ - "carts.*" - ] + "carts.*", + ], }) // salesChannels.carts @@ -179,8 +179,8 @@ To retrieve the orders of a sales channel with [Query](!docs!/learn/fundamentals const { data: salesChannels } = await query.graph({ entity: "sales_channel", fields: [ - "orders.*" - ] + "orders.*", + ], }) // salesChannels.orders @@ -197,8 +197,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: salesChannels } = useQueryGraphStep({ entity: "sales_channel", fields: [ - "orders.*" - ] + "orders.*", + ], }) // salesChannels.orders @@ -228,8 +228,8 @@ To retrieve the products of a sales channel with [Query](!docs!/learn/fundamenta const { data: salesChannels } = await query.graph({ entity: "sales_channel", fields: [ - "products.*" - ] + "products.*", + ], }) // salesChannels.products @@ -246,8 +246,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: salesChannels } = useQueryGraphStep({ entity: "sales_channel", fields: [ - "products.*" - ] + "products.*", + ], }) // salesChannels.products @@ -321,8 +321,8 @@ To retrieve the stock locations of a sales channel with [Query](!docs!/learn/fun const { data: salesChannels } = await query.graph({ entity: "sales_channel", fields: [ - "stock_locations.*" - ] + "stock_locations.*", + ], }) // salesChannels.stock_locations @@ -339,8 +339,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: salesChannels } = useQueryGraphStep({ entity: "sales_channel", fields: [ - "stock_locations.*" - ] + "stock_locations.*", + ], }) // salesChannels.stock_locations diff --git a/www/apps/resources/app/commerce-modules/sales-channel/page.mdx b/www/apps/resources/app/commerce-modules/sales-channel/page.mdx index ba84f12dff45a..f144d01b4325b 100644 --- a/www/apps/resources/app/commerce-modules/sales-channel/page.mdx +++ b/www/apps/resources/app/commerce-modules/sales-channel/page.mdx @@ -6,106 +6,173 @@ export const metadata = { # {metadata.title} -The Sales Channel Module provides sales-channel-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Sales Channel Module and how to use it in your application. -## How to Use Sales Channel Module's Service - -You can use the Sales Channel Module's main service by resolving from the Medusa container the resource `Modules.SALES_CHANNEL`. - -For example: +Medusa has sales channel related features available out-of-the-box through the Sales Channel Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Sales Channel Module. - - + -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" -import { Modules } from "@medusajs/framework/utils" +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). -const step1 = createStep("step-1", async (_, { container }) => { - const salesChannelModuleService = - container.resolve(Modules.SALES_CHANNEL) + - const salesChannels = await salesChannelModuleService.listSalesChannels() -}) -``` +## What's a Sales Channel? - - +A sales channel indicates an online or offline channel that you sell products on. -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" +Some use case examples for using a sales channel: -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const salesChannelModuleService = - request.scope.resolve(Modules.SALES_CHANNEL) +- Implement a B2B Ecommerce Store. +- Specify different products for each channel you sell in. +- Support omnichannel in your ecommerce store. - res.json({ - sales_channels: await salesChannelModuleService.listSalesChannels(), - }) -} -``` +--- - - +## Sales Channel Features -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" +- [Sales Channel Management](/references/sales-channel/models/SalesChannel): Manage sales channels in your store. Each sales channel has different meta information such as name or description, allowing you to easily differentiate between sales channels. +- [Product Availability](./links-to-other-modules/page.mdx): Medusa uses the Product and Sales Channel modules to allow merchants to specify a product's availability per sales channel. +- [Cart and Order Scoping](./links-to-other-modules/page.mdx): Carts, available through the Cart Module, are scoped to a sales channel. Paired with the product availability feature, you benefit from more features like allowing only products available in sales channel in a cart. +- [Inventory Availability Per Sales Channel](./links-to-other-modules/page.mdx): Medusa links sales channels to stock locations, allowing you to retrieve available inventory of products based on the specified sales channel. -export default async function subscriberHandler({ container }: SubscriberArgs) { - const salesChannelModuleService = - container.resolve(Modules.SALES_CHANNEL) +--- - const salesChannels = await salesChannelModuleService.listSalesChannels() -} -``` +## How to Use Sales Channel Module's Service - - +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. ---- +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. -## What's a Sales Channel? +For example: -A sales channel indicates an online or offline channel that you sell products on. +export const highlights = [ + ["12", "Modules.SALES_CHANNEL", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-sales-channel.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" +import { Modules } from "@medusajs/framework/utils" -Some use case examples for using a sales channel: +const createSalesChannelStep = createStep( + "create-sales-channel", + async ({}, { container }) => { + const salesChannelModuleService = container.resolve(Modules.SALES_CHANNEL) + + const salesChannels = await salesChannelModuleService.createSalesChannels([ + { + name: "B2B", + }, + { + name: "Mobile App", + }, + ]) + + return new StepResponse({ salesChannels }, salesChannels.map((sc) => sc.id)) + }, + async (salesChannelIds, { container }) => { + if (!salesChannelIds) { + return + } + const salesChannelModuleService = container.resolve(Modules.SALES_CHANNEL) + + await salesChannelModuleService.deleteSalesChannels( + salesChannelIds + ) + } +) + +export const createSalesChannelWorkflow = createWorkflow( + "create-sales-channel", + () => { + const { salesChannels } = createSalesChannelStep() + + return new WorkflowResponse({ + salesChannels, + }) + } +) +``` -- Implement a B2B Ecommerce Store. -- Specify different products for each channel you sell in. -- Support omnichannel in your ecommerce store. +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: ---- + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createSalesChannelWorkflow } from "../../workflows/create-sales-channel" -## Features +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { result } = await createSalesChannelWorkflow(req.scope) + .run() -### Sales Channel Management + res.send(result) +} +``` -Manage sales channels in your store. Each sales channel has different meta information such as name or description, allowing you to easily differentiate between sales channels. + + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createSalesChannelWorkflow } from "../workflows/create-sales-channel" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createSalesChannelWorkflow(container) + .run() + + console.log(result) +} -```ts -const salesChannels = await salesChannelModuleService.createSalesChannels([ - { - name: "B2B", - }, - { - name: "Mobile App", - }, -]) +export const config: SubscriberConfig = { + event: "user.created", +} ``` -### Product Availability + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createSalesChannelWorkflow } from "../workflows/create-sales-channel" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createSalesChannelWorkflow(container) + .run() + + console.log(result) +} -Medusa uses the Product and Sales Channel modules to allow merchants to specify a product's availability per sales channel. +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} +``` -For example, B2B customers viewing products only see products in the B2B sales channel. + + -### Cart and Order Scoping +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -Carts, available through the Cart Module, are scoped to a sales channel. Paired with the product availability feature, you benefit from more features like allowing only products available in sales channel in a cart. +--- -Orders are also scoped to a sales channel due to the relation between the Sales Channel and Order modules. + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/stock-location/examples/page.mdx b/www/apps/resources/app/commerce-modules/stock-location/examples/page.mdx deleted file mode 100644 index e530c4f797ad2..0000000000000 --- a/www/apps/resources/app/commerce-modules/stock-location/examples/page.mdx +++ /dev/null @@ -1,219 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Stock Location Module`, -} - -# {metadata.title} - -In this document, you’ll find common examples of how you can use the Stock Location Module in your application. - - - -You should only use the Stock Location Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Stock Location - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const stockLocationModuleService = - request.scope.resolve(Modules.STOCK_LOCATION) - - const stockLocation = await stockLocationModuleService.createStockLocations({ - name: "Warehouse 1", - }) - - res.json({ - stock_location: stockLocation, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStockLocationModule } from "@medusajs/medusa/stock-location" - -export async function POST(request: Request) { - const stockLocationModuleService = await initializeStockLocationModule({}) - - const stockLocation = await stockLocationModuleService.createStockLocations({ - name: "Warehouse 1", - }) - - return NextResponse.json({ stock_location: stockLocation }) -} -``` - - - - ---- - -## List Stock Locations - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const stockLocationModuleService = - request.scope.resolve(Modules.STOCK_LOCATION) - - res.json({ - stock_locations: await stockLocationModuleService.listStockLocations({}), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStockLocationModule } from "@medusajs/medusa/stock-location" - -export async function GET(request: Request) { - const stockLocationModuleService = await initializeStockLocationModule({}) - - return NextResponse.json({ - stock_locations: await stockLocationModuleService.listStockLocations({}), - }) -} -``` - - - - ---- - -## Add Address to Stock Location - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const stockLocationModuleService = - request.scope.resolve(Modules.STOCK_LOCATION) - - const stockLocation = await stockLocationModuleService.updateStockLocations({ - id: "sloc_123", - address: { - country_code: "US", - city: "New York City", - address_1: "52 Stone St", - postal_code: "10004", - }, - }) - - res.json({ - stock_location: stockLocation, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStockLocationModule } from "@medusajs/medusa/stock-location" - -export async function POST(request: Request) { - const stockLocationModuleService = await initializeStockLocationModule({}) - - const stockLocation = await stockLocationModuleService.updateStockLocations({ - id: "sloc_123", - address: { - country_code: "us", - city: "New York City", - address_1: "52 Stone St", - postal_code: "10004", - }, - }) - - return NextResponse.json({ - stock_location: stockLocation, - }) -} -``` - - - - ---- - -## Delete a Stock Location - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const stockLocationModuleService = - request.scope.resolve(Modules.STOCK_LOCATION) - - await stockLocationModuleService.deleteStockLocations("sloc_123") - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStockLocationModule } from "@medusajs/medusa/stock-location" - -export async function DELETE(request: Request) { - const stockLocationModuleService = await initializeStockLocationModule({}) - - await stockLocationModuleService.deleteStockLocations("sloc_123") -} -``` - - - - ---- - -## More Examples - -The [Stock Location Module's main service reference](/references/stock-location) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/stock-location/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/stock-location/links-to-other-modules/page.mdx index 1845c552476b5..2c617a959fab9 100644 --- a/www/apps/resources/app/commerce-modules/stock-location/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/stock-location/links-to-other-modules/page.mdx @@ -54,8 +54,8 @@ To retrieve the fulfillment providers, pass `fulfillment_providers.*` in `fields const { data: stockLocations } = await query.graph({ entity: "stock_location", fields: [ - "fulfillment_sets.*" - ] + "fulfillment_sets.*", + ], }) // stockLocations.fulfillment_sets @@ -72,8 +72,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: stockLocations } = useQueryGraphStep({ entity: "stock_location", fields: [ - "fulfillment_sets.*" - ] + "fulfillment_sets.*", + ], }) // stockLocations.fulfillment_sets @@ -143,8 +143,8 @@ To retrieve the inventory levels of a stock location with [Query](!docs!/learn/f const { data: stockLocations } = await query.graph({ entity: "stock_location", fields: [ - "inventory_levels.*" - ] + "inventory_levels.*", + ], }) // stockLocations.inventory_levels @@ -161,8 +161,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: stockLocations } = useQueryGraphStep({ entity: "stock_location", fields: [ - "inventory_levels.*" - ] + "inventory_levels.*", + ], }) // stockLocations.inventory_levels @@ -192,8 +192,8 @@ To retrieve the sales channels of a stock location with [Query](!docs!/learn/fun const { data: stockLocations } = await query.graph({ entity: "stock_location", fields: [ - "sales_channels.*" - ] + "sales_channels.*", + ], }) // stockLocations.sales_channels @@ -210,8 +210,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: stockLocations } = useQueryGraphStep({ entity: "stock_location", fields: [ - "sales_channels.*" - ] + "sales_channels.*", + ], }) // stockLocations.sales_channels diff --git a/www/apps/resources/app/commerce-modules/stock-location/page.mdx b/www/apps/resources/app/commerce-modules/stock-location/page.mdx index 1b07e039108d9..ca17c0c0e58e4 100644 --- a/www/apps/resources/app/commerce-modules/stock-location/page.mdx +++ b/www/apps/resources/app/commerce-modules/stock-location/page.mdx @@ -6,95 +6,150 @@ export const metadata = { # {metadata.title} -The Stock Location Module provides stock-location-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Stock Location Module and how to use it in your application. + +Medusa has stock location related features available out-of-the-box through the Stock Location Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Stock Location Module. + + + +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## Stock Location Features + +- [Stock Location Management](/references/stock-location-next/models): Store and manage stock locations. Medusa links stock locations with data models of other modules that require a location, such as the [Inventory Module's InventoryLevel](./links-to-other-modules/page.mdx). +- [Address Management](/references/stock-location-next/models/StockLocationAddress): Manage the address of each stock location. + +--- ## How to Use Stock Location Module's Service -You can use the Stock Location Module's main service by resolving from the Medusa container the resource `Modules.STOCK_LOCATION`. +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -For example: +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +export const highlights = [ + ["12", "Modules.STOCK_LOCATION", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-stock-location.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const stockLocationModuleService = container.resolve( - Modules.STOCK_LOCATION - ) +const createStockLocationStep = createStep( + "create-stock-location", + async ({}, { container }) => { + const stockLocationModuleService = container.resolve(Modules.STOCK_LOCATION) - const stockLocations = await stockLocationModuleService.listStockLocations({}) -}) + const stockLocation = await stockLocationModuleService.createStockLocations({ + name: "Warehouse 1", + }) + + return new StepResponse({ stockLocation }, stockLocation.id) + }, + async (stockLocationId, { container }) => { + if (!stockLocationId) { + return + } + const stockLocationModuleService = container.resolve(Modules.STOCK_LOCATION) + + await stockLocationModuleService.deleteStockLocations([stockLocationId]) + } +) + +export const createStockLocationWorkflow = createWorkflow( + "create-stock-location", + () => { + const { stockLocation } = createStockLocationStep() + + return new WorkflowResponse({ stockLocation }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createStockLocationWorkflow } from "../../workflows/create-stock-location" export async function GET( - request: MedusaRequest, + req: MedusaRequest, res: MedusaResponse -): Promise { - const stockLocationModuleService = - request.scope.resolve(Modules.STOCK_LOCATION) +) { + const { result } = await createStockLocationWorkflow(req.scope) + .run() - res.json({ - stock_locations: await stockLocationModuleService.listStockLocations({}), - }) + res.send(result) } ``` - + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createStockLocationWorkflow } from "../workflows/create-stock-location" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createStockLocationWorkflow(container) + .run() + + console.log(result) +} -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" +export const config: SubscriberConfig = { + event: "user.created", +} +``` -export default async function subscriberHandler({ container }: SubscriberArgs) { - const stockLocationModuleService = container.resolve( - Modules.STOCK_LOCATION - ) + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createStockLocationWorkflow } from "../workflows/create-stock-location" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createStockLocationWorkflow(container) + .run() + + console.log(result) +} - const stockLocations = await stockLocationModuleService.listStockLocations({}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, } ``` ---- - -## Features +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -### Stock Location Management - -Store and manage stock locations. Stock locations are associated with data models of other modules that require a location, such as the [Inventory Module's InventoryLevel](../inventory/concepts/page.mdx#inventory-level). - -```ts -const stockLocation = await stockLocationModuleService.createStockLocations({ - name: "Warehouse 1", -}) -``` - -### Address Management - -Manage the address of each stock location. +--- -```ts -const stockLocation = await stockLocationModuleService.updateStockLocations({ - id: "sloc_123", - address: { - country_code: "us", - city: "New York City", - address_1: "52 Stone St", - postal_code: "10004", - }, -}) -``` + diff --git a/www/apps/resources/app/commerce-modules/store/examples/page.mdx b/www/apps/resources/app/commerce-modules/store/examples/page.mdx deleted file mode 100644 index 29eb615e28c02..0000000000000 --- a/www/apps/resources/app/commerce-modules/store/examples/page.mdx +++ /dev/null @@ -1,272 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Store Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Store Module in your application. - - - -You should only use the Store Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Store - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const storeModuleService = request.scope.resolve( - Modules.STORE - ) - - const store = await storeModuleService.createStores({ - name: "My Store", - supported_currencies: [ - { - currency_code: "usd", - is_default: true, - }, - ], - }) - - res.json({ - store, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStoreModule } from "@medusajs/medusa/store" - -export async function POST(request: Request) { - const storeModuleService = await initializeStoreModule() - - const store = await storeModuleService.createStores({ - name: "My Store", - supported_currencies: [ - { - currency_code: "usd", - is_default: true, - }, - ], - }) - - res.json({ - store, - }) -} -``` - - - - ---- - -## List Stores - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const storeModuleService = request.scope.resolve( - Modules.STORE - ) - - res.json({ - stores: await storeModuleService.listStores(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStoreModule } from "@medusajs/medusa/store" - -export async function GET(request: Request) { - const storeModuleService = await initializeStoreModule() - - const salesChannels = await storeModuleService.listStores() - - return NextResponse.json({ - stores: await storeModuleService.list(), - }) -} -``` - - - - ---- - -## Retrieve a Store by its ID - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const storeModuleService = request.scope.resolve( - Modules.STORE - ) - - const store = await storeModuleService.retrieveStore("store_123") - - res.json({ - store, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStoreModule } from "@medusajs/medusa/store" - -export async function GET(request: Request, { params }: ContextType) { - const storeModuleService = await initializeStoreModule() - - const store = await storeModuleService.retrieveStore("store_123") - - return NextResponse.json({ store }) -} -``` - - - - ---- - -## Update a Store - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const storeModuleService = request.scope.resolve( - Modules.STORE - ) - - const store = await storeModuleService.updateStores("store_123", { - name: "Change Store", - }) - - res.json({ - store, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStoreModule } from "@medusajs/medusa/store" - -export async function POST(request: Request, { params }: ContextType) { - const storeModuleService = await initializeStoreModule() - - const store = await storeModuleService.updateStores("store_123", { - name: "Change Store", - }) - - return NextResponse.json({ store }) -} -``` - - - - ---- - -## Delete a Store - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - request: MedusaRequest, - res: MedusaResponse -): Promise { - const storeModuleService = request.scope.resolve( - Modules.STORE - ) - - await storeModuleService.deleteStores("store_123") - - res.status(200) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeStoreModule } from "@medusajs/medusa/store" - -export async function DELETE(request: Request, { params }: ContextType) { - const storeModuleService = await initializeStoreModule() - - await storeModuleService.deleteStores("store_123") -} -``` - - - - ---- - -## More Examples - -The [Store Module's main service reference](/references/store) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/store/links-to-other-modules/page.mdx b/www/apps/resources/app/commerce-modules/store/links-to-other-modules/page.mdx index a9710b966b2d5..10132231b342b 100644 --- a/www/apps/resources/app/commerce-modules/store/links-to-other-modules/page.mdx +++ b/www/apps/resources/app/commerce-modules/store/links-to-other-modules/page.mdx @@ -39,8 +39,8 @@ To retrieve the details of a store's currencies with [Query](!docs!/learn/fundam const { data: stores } = await query.graph({ entity: "store", fields: [ - "supported_currencies.currency.*" - ] + "supported_currencies.currency.*", + ], }) // stores.supported_currencies @@ -57,8 +57,8 @@ import { useQueryGraphStep } from "@medusajs/medusa/core-flows" const { data: stores } = useQueryGraphStep({ entity: "store", fields: [ - "supported_currencies.currency.*" - ] + "supported_currencies.currency.*", + ], }) // stores.supported_currencies diff --git a/www/apps/resources/app/commerce-modules/store/page.mdx b/www/apps/resources/app/commerce-modules/store/page.mdx index 55936301a9cfa..94edf8071c18c 100644 --- a/www/apps/resources/app/commerce-modules/store/page.mdx +++ b/www/apps/resources/app/commerce-modules/store/page.mdx @@ -6,98 +6,154 @@ export const metadata = { # {metadata.title} -The Store Module provides store-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Store Module and how to use it in your application. + +Medusa has store related features available out-of-the-box through the Store Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Store Module. + + + +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## Store Features + +- [Store Management](/references/store/models/Store): Create and manage stores in your application. +- [Multi-Tenancy Support](/references/store/models/Store): Create multiple stores, each having its own configurations. + +--- ## How to Use Store Module's Service -You can use the Store Module's main service by resolving from the Medusa container the resource `Modules.STORE`. +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -For example: +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +export const highlights = [ + ["12", "Modules.STORE", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-store.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const storeModuleService: IStoreModuleService = container.resolve( - Modules.STORE - ) +const createStoreStep = createStep( + "create-store", + async ({}, { container }) => { + const storeModuleService = container.resolve(Modules.STORE) + + const store = await storeModuleService.createStores({ + name: "My Store", + supported_currencies: [{ + currency_code: "usd", + is_default: true, + }], + }) - const stores = await storeModuleService.listStores() -}) + return new StepResponse({ store }, store.id) + }, + async (storeId, { container }) => { + if(!storeId) { + return + } + const storeModuleService = container.resolve(Modules.STORE) + + await storeModuleService.deleteStores([storeId]) + } +) + +export const createStoreWorkflow = createWorkflow( + "create-store", + () => { + const { store } = createStoreStep() + + return new WorkflowResponse({ store }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createStoreWorkflow } from "../../workflows/create-store" export async function GET( - request: MedusaRequest, + req: MedusaRequest, res: MedusaResponse -): Promise { - const storeModuleService: IStoreModuleService = request.scope.resolve( - Modules.STORE - ) - - res.json({ - stores: await storeModuleService.listStores(), - }) +) { + const { result } = await createStoreWorkflow(req.scope) + .run() + + res.send(result) } ``` - + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createStoreWorkflow } from "../workflows/create-store" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createStoreWorkflow(container) + .run() + + console.log(result) +} -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" +export const config: SubscriberConfig = { + event: "user.created", +} +``` -export default async function subscriberHandler({ container }: SubscriberArgs) { - const storeModuleService: IStoreModuleService = container.resolve( - Modules.STORE - ) + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createStoreWorkflow } from "../workflows/create-store" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createStoreWorkflow(container) + .run() + + console.log(result) +} - const stores = await storeModuleService.listStores() +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, } ``` ---- - -## Features - -### Store Management +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -A store holds the main configurations of your commerce store, such as supported currencies, default region and sales channel, and more. - -```ts -const store = await storeModuleService.createStores({ - name: "My Store", - supported_currency_codes: ["usd"], -}) -``` - -### Multi-Tenancy Support - -You can create multiple stores, each having its own configurations. +--- -```ts -const stores = await storeModuleService.createStores([ - { - name: "USA Store", - supported_currency_codes: ["usd"], - }, - { - name: "Europe Store", - supported_currency_codes: ["eur"], - }, -]) -``` + diff --git a/www/apps/resources/app/commerce-modules/tax/examples/page.mdx b/www/apps/resources/app/commerce-modules/tax/examples/page.mdx deleted file mode 100644 index 3a68baa07256b..0000000000000 --- a/www/apps/resources/app/commerce-modules/tax/examples/page.mdx +++ /dev/null @@ -1,344 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the Tax Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the Tax Module in your application. - - - -You should only use the Tax Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a Tax Region - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const taxModuleService = req.scope.resolve( - Modules.TAX - ) - - const taxRegion = await taxModuleService.createTaxRegions({ - country_code: "us", - default_tax_rate: { - rate: 10, - name: "Default rate", - }, - }) - - res.json({ - tax_region: taxRegion, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeTaxModule } from "@medusajs/medusa/tax" - -export async function POST(request: Request) { - const taxModuleService = await initializeTaxModule() - - const taxRegion = await taxModuleService.createTaxRegions({ - country_code: "us", - default_tax_rate: { - rate: 10, - name: "Default rate", - }, - }) - - return NextResponse.json({ - tax_region: taxRegion, - }) -} -``` - - - - ---- - -## List Tax Regions - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const taxModuleService = req.scope.resolve( - Modules.TAX - ) - - res.json({ - tax_regions: await taxModuleService.listTaxRegions(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeTaxModule } from "@medusajs/medusa/tax" - -export async function GET(request: Request) { - const taxModuleService = await initializeTaxModule() - - return NextResponse.json({ - tax_regions: await taxModuleService.listTaxRegions(), - }) -} -``` - - - - ---- - -## Create Tax Rate with Rules - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const taxModuleService = req.scope.resolve( - Modules.TAX - ) - - const taxRate = await taxModuleService.createTaxRates({ - tax_region_id: "txreg_123", - name: "Custom rate", - rate: 15, - rules: [ - { - reference: "product_type", - reference_id: "ptyp_1", - }, - { - reference: "product", - reference_id: "prod_123", - }, - ], - }) - - res.json({ - tax_rate: taxRate, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeTaxModule } from "@medusajs/medusa/tax" - -export async function POST(request: Request) { - const taxModuleService = await initializeTaxModule() - - const taxRate = await taxModuleService.createTaxRates({ - tax_region_id: "txreg_123", - name: "Custom rate", - rate: 15, - rules: [ - { - reference: "product_type", - reference_id: "ptyp_1", - }, - { - reference: "product", - reference_id: "prod_123", - }, - ], - }) - - return NextResponse.json({ - tax_rate: taxRate, - }) -} -``` - - - - ---- - -## List Tax Rates - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const taxModuleService = req.scope.resolve( - Modules.TAX - ) - - res.json({ - tax_rates: await taxModuleService.listTaxRates(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeTaxModule } from "@medusajs/medusa/tax" - -export async function GET(request: Request) { - const taxModuleService = await initializeTaxModule() - - return NextResponse.json({ - tax_rates: await taxModuleService.listTaxRates(), - }) -} -``` - - - - ---- - -## Get Tax Lines - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const taxModuleService = req.scope.resolve( - Modules.TAX - ) - - const taxLines = await taxModuleService.getTaxLines( - [ - { - id: "cali_123", - product_id: "prod_123", - unit_price: 1000, - }, - { - id: "casm_123", - shipping_option_id: "so_123", - unit_price: 2000, - }, - ], - { - address: { - country_code: "us", - postal_code: "123456", - }, - customer: { - id: "cus_123", - email: "user@example.com", - customer_groups: ["VIP"], - }, - } - ) - - res.json({ - tax_lines: taxLines, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeTaxModule } from "@medusajs/medusa/tax" - -export async function GET(request: Request) { - const taxModuleService = await initializeTaxModule() - - const taxLines = await taxModuleService.getTaxLines( - [ - { - id: "cali_123", - product_id: "prod_123", - unit_price: 1000, - }, - { - id: "casm_123", - shipping_option_id: "so_123", - unit_price: 2000, - }, - ], - { - address: { - country_code: "us", - postal_code: "123456", - }, - customer: { - id: "cus_123", - email: "user@example.com", - customer_groups: ["VIP"], - }, - } - ) - - return NextResponse.json({ - tax_lines: taxLines, - }) -} -``` - - - - ---- - -## More Examples - -The [Tax Module's main service reference](/references/tax) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/tax/page.mdx b/www/apps/resources/app/commerce-modules/tax/page.mdx index 615e7f5b1e002..3e8f85dc0a906 100644 --- a/www/apps/resources/app/commerce-modules/tax/page.mdx +++ b/www/apps/resources/app/commerce-modules/tax/page.mdx @@ -6,142 +6,157 @@ export const metadata = { # {metadata.title} -The Tax Module provides tax-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the Tax Module and how to use it in your application. + +Medusa has tax related features available out-of-the-box through the Tax Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this Tax Module. + + + +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## Tax Features + +- [Tax Settings Per Region](./tax-region/page.mdx): Set different tax settings for each tax region. +- [Tax Rates and Rules](./tax-rates-and-rules/page.mdx): Manage each region's default tax rates and override them with conditioned tax rates. +- [Retrieve Tax Lines for carts and orders](./tax-calculation-with-provider/page.mdx): Calculate and retrieve the tax lines of a cart or order's line items and shipping methods with tax providers. + +--- ## How to Use Tax Module's Service -You can use the Tax Module's main service by resolving from the Medusa container the resource `Modules.TAX`. +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -For example: +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +export const highlights = [ + ["12", "Modules.TAX", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-tax-region.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const taxModuleService = container.resolve( - Modules.TAX - ) +const createTaxRegionStep = createStep( + "create-tax-region", + async ({}, { container }) => { + const taxModuleService = container.resolve(Modules.TAX) - const taxRegions = await taxModuleService.listTaxRegions() -}) + const taxRegion = await taxModuleService.createTaxRegions({ + country_code: "us", + }) + + return new StepResponse({ taxRegion }, taxRegion.id) + }, + async (taxRegionId, { container }) => { + if (!taxRegionId) { + return + } + const taxModuleService = container.resolve(Modules.TAX) + + await taxModuleService.deleteTaxRegions([taxRegionId]) + } +) + +export const createTaxRegionWorkflow = createWorkflow( + "create-tax-region", + () => { + const { taxRegion } = createTaxRegionStep() + + return new WorkflowResponse({ taxRegion }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createTaxRegionWorkflow } from "../../workflows/create-tax-region" export async function GET( req: MedusaRequest, res: MedusaResponse -): Promise { - const taxModuleService = req.scope.resolve( - Modules.TAX - ) - - res.json({ - tax_regions: await taxModuleService.listTaxRegions(), - }) +) { + const { result } = await createTaxRegionWorkflow(req.scope) + .run() + + res.send(result) } ``` - - -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" - -export default async function subscriberHandler({ container }: SubscriberArgs) { - const taxModuleService = container.resolve( - Modules.TAX - ) + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createTaxRegionWorkflow } from "../workflows/create-tax-region" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createTaxRegionWorkflow(container) + .run() + + console.log(result) +} - const taxRegions = await taxModuleService.listTaxRegions() +export const config: SubscriberConfig = { + event: "user.created", } ``` - - ---- - -## Features - -### Tax Settings Per Region - -Set different tax settings for each tax region. + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createTaxRegionWorkflow } from "../workflows/create-tax-region" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createTaxRegionWorkflow(container) + .run() + + console.log(result) +} -```ts -const taxRegion = await taxModuleService.createTaxRegions({ - country_code: "us", -}) +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, +} ``` -### Tax Rates and Rules + + -Manage each region's default tax rates and override them with conditioned tax rates. +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -```ts -const taxRates = await taxModuleService.createTaxRates([ - { - tax_region_id: "txreg_123", - name: "Default tax rate", - is_default: true, - rate: 10, - }, - { - tax_region_id: "txreg_123", - name: "Shirt product type", - is_default: false, - rate: 15, - rules: [ - { - reference: "product_type", - reference_id: "ptyp_1", - }, - ], - }, -]) -``` +--- -### Retrieve Cart's Tax Lines - -Calculate and retrieve the tax lines of a cart's line items and shipping methods with tax providers. - -```ts -const taxLines = await taxModuleService.getTaxLines( - [ - { - id: "cali_123", - product_id: "prod_123", - unit_price: 1000, - quantity: 1, - }, - { - id: "casm_123", - shipping_option_id: "so_123", - unit_price: 2000, - }, - ], - { - address: { - country_code: "us", - }, - } -) -``` +## Configure Tax Module -You can use different tax providers for each region to handle tax-line retrieval differently. +The Tax Module accepts options for further configurations. Refer to [this documentation](./module-options/page.mdx) for details on the module's options. --- -## Configure Tax Module - -Refer to [this documentation](./module-options/page.mdx) for details on the module's options. + \ No newline at end of file diff --git a/www/apps/resources/app/commerce-modules/user/examples/page.mdx b/www/apps/resources/app/commerce-modules/user/examples/page.mdx deleted file mode 100644 index 4cc7c3b573485..0000000000000 --- a/www/apps/resources/app/commerce-modules/user/examples/page.mdx +++ /dev/null @@ -1,384 +0,0 @@ -import { CodeTabs, CodeTab } from "docs-ui" - -export const metadata = { - title: `Examples of the User Module`, -} - -# {metadata.title} - -In this guide, you’ll find common examples of how you can use the User Module in your application. - - - -You should only use the User Module's main service when implementing complex customizations. For common cases, check out [available workflows instead](../../../medusa-workflows-reference/page.mdx). - - - -## Create a User - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - const user = await userModuleService.createUsers({ - email: "user@example.com", - first_name: "John", - last_name: "Smith", - }) - - res.json({ user }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeUserModule } from "@medusajs/medusa/user" - -export async function POST(request: Request) { - const userModuleService = await initializeUserModule() - - const user = await userModuleService.createUsers({ - email: "user@example.com", - first_name: "John", - last_name: "Smith", - }) - - return NextResponse.json({ - user, - }) -} -``` - - - - ---- - -## List Users - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function GET( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - res.json({ - users: await userModuleService.listUsers(), - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeUserModule } from "@medusajs/medusa/user" - -export async function GET(request: Request) { - const userModuleService = await initializeUserModule() - - return NextResponse.json({ - users: await userModuleService.listUsers(), - }) -} -``` - - - - ---- - -## Update a User - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - const user = await userModuleService.updateUsers({ - id: "user_123", - last_name: "Smith", - }) - - res.json({ user }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeUserModule } from "@medusajs/medusa/user" - -export async function POST(request: Request) { - const userModuleService = await initializeUserModule() - - const user = await userModuleService.updateUsers({ - id: "user_123", - last_name: "Smith", - }) - - return NextResponse.json({ - user, - }) -} -``` - - - - ---- - -## Delete a User - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function DELETE( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - await userModuleService.deleteUsers(["user_123"]) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeUserModule } from "@medusajs/medusa/user" - -export async function DELETE(request: Request) { - const userModuleService = await initializeUserModule() - - await userModuleService.deleteUsers(["user_123"]) -} -``` - - - - ---- - -## Invite User - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - const invite = await userModuleService.createInvites({ - email: "user2@example.com", - }) - - res.json({ - invite, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeUserModule } from "@medusajs/medusa/user" - -export async function POST(request: Request, { params }: ContextType) { - const userModuleService = await initializeUserModule() - - const invite = await userModuleService.createInvites({ - email: "user2@example.com", - }) - - return NextResponse.json({ - invite, - }) -} -``` - - - - ---- - -## Accept Invite - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - const invite = await userModuleService.validateInviteToken("secret_123") - - const user = await userModuleService.createUsers({ - email: invite.email, - metadata: invite.metadata, - }) - - await userModuleService.updateInvites({ - id: invite.id, - accepted: true, - }) - - res.json({ - user, - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeUserModule } from "@medusajs/medusa/user" - -export async function POST(request: Request, { params }: ContextType) { - const userModuleService = await initializeUserModule() - - const invite = await userModuleService.validateInviteToken("secret_123") - - const user = await userModuleService.createUsers({ - email: invite.email, - metadata: invite.metadata, - }) - - await userModuleService.updateInvites({ - id: invite.id, - accepted: true, - }) - - return NextResponse.json({ - user, - }) -} -``` - - - - ---- - -## Refresh Invite - - - - -```ts -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" - -export async function POST( - req: MedusaRequest, - res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - const invites = await userModuleService.refreshInviteTokens(["invite_123"]) - - res.json({ - invite: invites[0], - }) -} -``` - - - - -```ts -import { NextResponse } from "next/server" - -import { initialize as initializeUserModule } from "@medusajs/medusa/user" - -export async function POST(request: Request, { params }: ContextType) { - const userModuleService = await initializeUserModule() - - const invites = await userModuleService.refreshInviteTokens(["invite_123"]) - - return NextResponse.json({ - invite: invites[0], - }) -} -``` - - - - ---- - -## More Examples - -The [User Module's main service reference](/references/user) provides a reference to all the methods available for use with examples for each. diff --git a/www/apps/resources/app/commerce-modules/user/page.mdx b/www/apps/resources/app/commerce-modules/user/page.mdx index bdbb39bfecd6f..d563e51fd56e7 100644 --- a/www/apps/resources/app/commerce-modules/user/page.mdx +++ b/www/apps/resources/app/commerce-modules/user/page.mdx @@ -6,101 +6,160 @@ export const metadata = { # {metadata.title} -The User Module provides user-related features in your Medusa and Node.js applications. +In this section of the documentation, you will find resources to learn more about the User Module and how to use it in your application. + +Medusa has user related features available out-of-the-box through the User Module. A [module](!docs!/learn/fundamentals/modules) is a standalone package that provides features for a single domain. Each of Medusa's commerce features are placed in commerce modules, such as this User Module. + + + +Learn more about why modules are isolated in [this documentation](!docs!/learn/fundamentals/modules/isolation). + + + +## User Features + +- [User Management](./user-creation-flows/page.mdx): Store and manage users in your store. +- [Invite Users](./user-creation-flows/page.mdx#invite-users): Invite users to join your store and manage those invites. + +--- ## How to Use User Module's Service -You can use the User Module's main service by resolving from the Medusa container the resource `Modules.USER`. +In your Medusa application, you build flows around commerce modules. A flow is built as a [Workflow](!docs!/learn/fundamentals/workflows), which is a special function composed of a series of steps that guarantees data consistency and reliable roll-back mechanism. -For example: +You can build custom workflows and steps. You can also re-use Medusa's workflows and steps, which are provided by the `@medusajs/medusa/core-flows` package. - - +For example: -```ts title="src/workflows/hello-world/step1.ts" -import { createStep } from "@medusajs/framework/workflows-sdk" +export const highlights = [ + ["12", "Modules.USER", "Resolve the module in a step."] +] + +```ts title="src/workflows/create-user.ts" highlights={highlights} +import { + createWorkflow, + WorkflowResponse, + createStep, + StepResponse, +} from "@medusajs/framework/workflows-sdk" import { Modules } from "@medusajs/framework/utils" -const step1 = createStep("step-1", async (_, { container }) => { - const userModuleService = container.resolve( - Modules.USER - ) - - const users = await userModuleService.listUsers() -}) +const createUserStep = createStep( + "create-user", + async ({}, { container }) => { + const userModuleService = container.resolve(Modules.USER) + + const user = await userModuleService.createUsers({ + email: "user@example.com", + first_name: "John", + last_name: "Smith", + }) + + return new StepResponse({ user }, user.id) + }, + async (userId, { container }) => { + if (!userId) { + return + } + const userModuleService = container.resolve(Modules.USER) + + await userModuleService.deleteUsers([userId]) + } +) + +export const createUserWorkflow = createWorkflow( + "create-user", + () => { + const { user } = createUserStep() + + return new WorkflowResponse({ + user, + }) + } +) ``` - - +You can then execute the workflow in your custom API routes, scheduled jobs, or subscribers: -```ts title="src/api/store/custom/route.ts" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { Modules } from "@medusajs/framework/utils" + + + +```ts title="src/api/workflow/route.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import type { + MedusaRequest, + MedusaResponse, +} from "@medusajs/framework/http" +import { createUserWorkflow } from "../../workflows/create-user" export async function GET( req: MedusaRequest, res: MedusaResponse -): Promise { - const userModuleService = req.scope.resolve( - Modules.USER - ) - - res.json({ - users: await userModuleService.listUsers(), - }) +) { + const { result } = await createUserWorkflow(req.scope) + .run() + + res.send(result) } ``` - + + +```ts title="src/subscribers/user-created.ts" highlights={[["11"], ["12"]]} collapsibleLines="1-6" expandButtonLabel="Show Imports" +import { + type SubscriberConfig, + type SubscriberArgs, +} from "@medusajs/framework" +import { createUserWorkflow } from "../workflows/create-user" + +export default async function handleUserCreated({ + event: { data }, + container, +}: SubscriberArgs<{ id: string }>) { + const { result } = await createUserWorkflow(container) + .run() + + console.log(result) +} -```ts title="src/subscribers/custom-handler.ts" -import { SubscriberArgs } from "@medusajs/framework" -import { Modules } from "@medusajs/framework/utils" +export const config: SubscriberConfig = { + event: "user.created", +} +``` -export default async function subscriberHandler({ container }: SubscriberArgs) { - const userModuleService = container.resolve( - Modules.USER - ) + + + +```ts title="src/jobs/run-daily.ts" highlights={[["7"], ["8"]]} +import { MedusaContainer } from "@medusajs/framework/types" +import { createUserWorkflow } from "../workflows/create-user" + +export default async function myCustomJob( + container: MedusaContainer +) { + const { result } = await createUserWorkflow(container) + .run() + + console.log(result) +} - const users = await userModuleService.listUsers() +export const config = { + name: "run-once-a-day", + schedule: `0 0 * * *`, } ``` ---- - -## Features - -### User Management - -Manage and store your users through Create, Read, Update, and Delete (CRUD) operations: +Learn more about workflows in [this documentation](!docs!/learn/fundamentals/workflows). -```ts -const user = await userModuleService.createUsers({ - email: "user@example.com", - first_name: "John", - last_name: "Smith", -}) -``` - -### Invite Users - -Invite users to join your store and manage those invites, with expiry and revalidation features. +--- -```ts -const invite = await userModuleService.createInvites({ - email: "user2@example.com", -}) +## Configure User Module -// refresh token later -await userModuleService.refreshInviteTokens([invite.id]) -``` +The User Module accepts options for further configurations. Refer to [this documentation](./module-options/page.mdx) for details on the module's options. --- -## Configure User Module - -Refer to [this documentation](./module-options/page.mdx) for details on the module's options. + \ No newline at end of file diff --git a/www/apps/resources/app/nextjs-starter/guides/customize-stripe/page.mdx b/www/apps/resources/app/nextjs-starter/guides/customize-stripe/page.mdx index 97aea7900d6ec..7fcca61066ce1 100644 --- a/www/apps/resources/app/nextjs-starter/guides/customize-stripe/page.mdx +++ b/www/apps/resources/app/nextjs-starter/guides/customize-stripe/page.mdx @@ -1,3 +1,9 @@ +--- +tags: + - storefront + - payment +--- + import { Prerequisites } from "docs-ui" export const ogImage = "https://res.cloudinary.com/dza7lstvk/image/upload/v1734007558/Medusa%20Resources/integrations-stripe_qfnwtf.jpg" diff --git a/www/apps/resources/app/storefront-development/publishable-api-keys/page.mdx b/www/apps/resources/app/storefront-development/publishable-api-keys/page.mdx index 58085b425afce..38fe011c02fb7 100644 --- a/www/apps/resources/app/storefront-development/publishable-api-keys/page.mdx +++ b/www/apps/resources/app/storefront-development/publishable-api-keys/page.mdx @@ -3,6 +3,7 @@ tags: - publishable api key - api key - storefront + - sales channel --- export const metadata = { diff --git a/www/apps/resources/components/CommerceModuleSections/index.tsx b/www/apps/resources/components/CommerceModuleSections/index.tsx new file mode 100644 index 0000000000000..461d5e29ea719 --- /dev/null +++ b/www/apps/resources/components/CommerceModuleSections/index.tsx @@ -0,0 +1,95 @@ +"use client" + +import { H2, Hr, useChildDocs } from "docs-ui" +import React, { useMemo } from "react" + +type CommerceModuleSectionsProps = { + name: string +} + +export const CommerceModuleSections = ({ + name, +}: CommerceModuleSectionsProps) => { + const components: (JSX.Element | JSX.Element[])[] = [] + const { items: workflowItems, component: workflowsComponent } = useChildDocs({ + showItems: ["Workflows"], + titleLevel: 3, + itemsPerRow: 2, + }) + const { items: stepItems, component: stepsComponent } = useChildDocs({ + showItems: ["Steps"], + titleLevel: 3, + itemsPerRow: 2, + }) + + const hideWorkflowsSection = useMemo(() => { + return !workflowItems?.default.length && !stepItems?.default.length + }, [workflowItems, stepItems]) + + const { items: serverGuideItems, component: serverGuidesComponent } = + useChildDocs({ + showItems: ["Server Guides"], + itemsPerRow: 2, + }) + if (serverGuideItems?.default.length) { + components.push(serverGuidesComponent) + } + const { items: storefrontGuideItems, component: storefrontGuidesComponent } = + useChildDocs({ + showItems: ["Storefront Guides"], + itemsPerRow: 2, + }) + if (storefrontGuideItems?.default.length) { + components.push(storefrontGuidesComponent) + } + const { items: adminGuideItems, component: adminGuidesComponent } = + useChildDocs({ + showItems: ["Admin Guides"], + itemsPerRow: 2, + }) + if (adminGuideItems?.default.length) { + components.push(adminGuidesComponent) + } + const { items: userGuideItems, component: userGuidesComponent } = + useChildDocs({ + showItems: ["User Guides"], + itemsPerRow: 2, + }) + if (userGuideItems?.default.length) { + components.push(userGuidesComponent) + } + const { items: referenceItems, component: referencesComponent } = + useChildDocs({ + showItems: ["References"], + itemsPerRow: 2, + }) + if (referenceItems?.default.length) { + components.push(referencesComponent) + } + + return ( + <> + {!hideWorkflowsSection && ( + <> +

Medusa Workflows and Steps

+

+ Medusa provides the following workflows and steps that use the{" "} + {name} Module. You can use these workflows and steps in your + customizations: +

+ {workflowsComponent} + {stepsComponent} + + )} + + {components.map((component, i) => ( + + <> + {i !== 0 || !hideWorkflowsSection ?
: null} + {component} + +
+ ))} + + ) +} diff --git a/www/apps/resources/components/MDXComponents/index.tsx b/www/apps/resources/components/MDXComponents/index.tsx index 03d07a1cc69db..2da3e8888189c 100644 --- a/www/apps/resources/components/MDXComponents/index.tsx +++ b/www/apps/resources/components/MDXComponents/index.tsx @@ -5,12 +5,14 @@ import { TypeList, WorkflowDiagram, } from "docs-ui" +import { CommerceModuleSections } from "../CommerceModuleSections" const MDXComponents: MDXComponentsType = { ...UiMdxComponents, a: Link, TypeList, WorkflowDiagram, + CommerceModuleSections, } export default MDXComponents diff --git a/www/apps/resources/generated/edit-dates.mjs b/www/apps/resources/generated/edit-dates.mjs index fa08c24c1c7dd..a1d907577b574 100644 --- a/www/apps/resources/generated/edit-dates.mjs +++ b/www/apps/resources/generated/edit-dates.mjs @@ -4,23 +4,20 @@ export const generatedEditDates = { "app/commerce-modules/auth/authentication-route/page.mdx": "2024-09-05T12:06:38.155Z", "app/commerce-modules/auth/examples/page.mdx": "2024-10-15T15:02:13.794Z", "app/commerce-modules/auth/module-options/page.mdx": "2024-10-15T12:52:08.930Z", - "app/commerce-modules/auth/page.mdx": "2024-12-09T14:46:55.446Z", + "app/commerce-modules/auth/page.mdx": "2024-12-25T15:40:37.154Z", "app/commerce-modules/cart/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/cart/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/cart/concepts/page.mdx": "2024-10-08T07:49:03.737Z", - "app/commerce-modules/cart/examples/page.mdx": "2024-10-15T14:59:11.331Z", "app/commerce-modules/cart/promotions/page.mdx": "2024-10-08T07:54:31.120Z", "app/commerce-modules/cart/tax-lines/page.mdx": "2024-10-08T07:57:19.168Z", - "app/commerce-modules/cart/page.mdx": "2024-12-09T14:47:07.204Z", + "app/commerce-modules/cart/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/currency/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/currency/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/currency/examples/page.mdx": "2024-10-15T14:59:18.466Z", - "app/commerce-modules/currency/page.mdx": "2024-12-09T14:47:12.300Z", + "app/commerce-modules/currency/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/customer/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/customer/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/customer/customer-accounts/page.mdx": "2024-10-08T12:20:44.769Z", - "app/commerce-modules/customer/examples/page.mdx": "2024-10-15T14:59:26.644Z", - "app/commerce-modules/customer/page.mdx": "2024-12-09T14:47:17.248Z", + "app/commerce-modules/customer/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/fulfillment/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/fulfillment/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/fulfillment/concepts/page.mdx": "2024-06-19T13:02:16+00:00", @@ -28,13 +25,12 @@ export const generatedEditDates = { "app/commerce-modules/fulfillment/item-fulfillment/page.mdx": "2024-10-08T14:38:15.496Z", "app/commerce-modules/fulfillment/module-options/page.mdx": "2024-10-15T12:51:56.118Z", "app/commerce-modules/fulfillment/shipping-option/page.mdx": "2024-10-08T14:36:02.660Z", - "app/commerce-modules/fulfillment/page.mdx": "2024-12-09T14:47:23.482Z", + "app/commerce-modules/fulfillment/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/inventory/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/inventory/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/inventory/concepts/page.mdx": "2024-10-08T15:11:27.634Z", - "app/commerce-modules/inventory/examples/page.mdx": "2024-10-15T14:59:45.389Z", "app/commerce-modules/inventory/inventory-in-flows/page.mdx": "2024-10-08T15:14:07.327Z", - "app/commerce-modules/inventory/page.mdx": "2024-12-09T14:47:28.150Z", + "app/commerce-modules/inventory/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/order/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/order/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/order/claim/page.mdx": "2024-10-09T10:11:12.090Z", @@ -45,10 +41,9 @@ export const generatedEditDates = { "app/commerce-modules/order/return/page.mdx": "2024-10-09T10:19:40.731Z", "app/commerce-modules/order/tax-lines/page.mdx": "2024-10-09T10:22:49.335Z", "app/commerce-modules/order/transactions/page.mdx": "2024-10-09T10:23:36.485Z", - "app/commerce-modules/order/page.mdx": "2024-12-09T14:47:32.415Z", + "app/commerce-modules/order/page.mdx": "2024-12-25T15:55:02.851Z", "app/commerce-modules/payment/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/payment/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/payment/examples/page.mdx": "2024-10-15T14:59:55.208Z", "app/commerce-modules/payment/module-options/page.mdx": "2024-10-15T12:51:40.574Z", "app/commerce-modules/payment/payment/page.mdx": "2024-10-09T10:59:08.463Z", "app/commerce-modules/payment/payment-collection/page.mdx": "2024-10-09T10:56:49.510Z", @@ -57,61 +52,52 @@ export const generatedEditDates = { "app/commerce-modules/payment/payment-provider/page.mdx": "2024-10-09T11:07:27.269Z", "app/commerce-modules/payment/payment-session/page.mdx": "2024-10-09T10:58:00.960Z", "app/commerce-modules/payment/webhook-events/page.mdx": "2024-11-19T11:45:02.167Z", - "app/commerce-modules/payment/page.mdx": "2024-12-09T14:47:57.842Z", + "app/commerce-modules/payment/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/pricing/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/pricing/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/pricing/concepts/page.mdx": "2024-10-09T13:37:25.678Z", - "app/commerce-modules/pricing/examples/page.mdx": "2024-12-09T13:04:57.713Z", "app/commerce-modules/pricing/price-calculation/page.mdx": "2024-10-09T13:43:14.038Z", "app/commerce-modules/pricing/price-rules/page.mdx": "2024-10-09T13:38:47.112Z", "app/commerce-modules/pricing/tax-inclusive-pricing/page.mdx": "2024-10-09T13:48:23.261Z", - "app/commerce-modules/pricing/page.mdx": "2024-12-09T14:48:02.172Z", + "app/commerce-modules/pricing/page.mdx": "2024-12-25T15:55:02.851Z", "app/commerce-modules/product/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/product/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/product/examples/page.mdx": "2024-10-09T13:59:32.887Z", - "app/commerce-modules/product/guides/price/page.mdx": "2024-12-19T16:37:40.491Z", - "app/commerce-modules/product/guides/price-with-taxes/page.mdx": "2024-12-19T16:37:48.597Z", - "app/commerce-modules/product/page.mdx": "2024-12-09T14:48:26.091Z", + "app/commerce-modules/product/guides/price/page.mdx": "2024-12-25T15:10:37.730Z", + "app/commerce-modules/product/guides/price-with-taxes/page.mdx": "2024-12-25T15:10:40.879Z", + "app/commerce-modules/product/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/promotion/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/promotion/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/promotion/actions/page.mdx": "2024-10-09T14:49:01.645Z", "app/commerce-modules/promotion/application-method/page.mdx": "2024-06-26T07:55:59+00:00", "app/commerce-modules/promotion/campaign/page.mdx": "2024-05-29T11:08:06+00:00", "app/commerce-modules/promotion/concepts/page.mdx": "2024-10-09T14:50:50.255Z", - "app/commerce-modules/promotion/examples/page.mdx": "2024-10-09T14:46:47.191Z", - "app/commerce-modules/promotion/page.mdx": "2024-12-09T14:48:30.816Z", + "app/commerce-modules/promotion/page.mdx": "2024-12-25T15:55:02.850Z", "app/commerce-modules/region/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/region/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/region/examples/page.mdx": "2024-10-15T15:00:24.388Z", - "app/commerce-modules/region/page.mdx": "2024-12-09T14:48:34.729Z", + "app/commerce-modules/region/page.mdx": "2024-12-25T15:55:02.851Z", "app/commerce-modules/sales-channel/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/sales-channel/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/sales-channel/examples/page.mdx": "2024-10-15T15:00:33.322Z", "app/commerce-modules/sales-channel/publishable-api-keys/page.mdx": "2024-10-15T14:21:38.353Z", - "app/commerce-modules/sales-channel/page.mdx": "2024-12-09T14:48:38.646Z", + "app/commerce-modules/sales-channel/page.mdx": "2024-12-25T15:55:17.802Z", "app/commerce-modules/stock-location/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/stock-location/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/stock-location/concepts/page.mdx": "2024-10-15T14:32:21.875Z", - "app/commerce-modules/stock-location/examples/page.mdx": "2024-10-15T15:00:41.265Z", - "app/commerce-modules/stock-location/page.mdx": "2024-12-09T14:48:42.516Z", + "app/commerce-modules/stock-location/page.mdx": "2024-12-25T16:09:26.781Z", "app/commerce-modules/store/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/store/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/store/examples/page.mdx": "2024-10-15T15:00:47.283Z", - "app/commerce-modules/store/page.mdx": "2024-12-09T14:48:46.363Z", + "app/commerce-modules/store/page.mdx": "2024-12-25T16:09:12.124Z", "app/commerce-modules/tax/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/tax/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/tax/examples/page.mdx": "2024-10-15T15:00:52.899Z", "app/commerce-modules/tax/module-options/page.mdx": "2024-10-15T14:35:46.117Z", "app/commerce-modules/tax/tax-calculation-with-provider/page.mdx": "2024-10-15T14:43:00.700Z", "app/commerce-modules/tax/tax-rates-and-rules/page.mdx": "2024-10-15T14:38:06.889Z", "app/commerce-modules/tax/tax-region/page.mdx": "2024-10-15T14:36:47.028Z", - "app/commerce-modules/tax/page.mdx": "2024-12-09T14:48:50.327Z", + "app/commerce-modules/tax/page.mdx": "2024-12-25T16:22:51.953Z", "app/commerce-modules/user/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/user/_events/page.mdx": "2024-07-03T19:27:13+03:00", - "app/commerce-modules/user/examples/page.mdx": "2024-10-15T15:00:59.626Z", "app/commerce-modules/user/module-options/page.mdx": "2024-09-30T08:43:53.171Z", "app/commerce-modules/user/user-creation-flows/page.mdx": "2024-10-15T14:51:37.311Z", - "app/commerce-modules/user/page.mdx": "2024-12-09T14:48:54.225Z", + "app/commerce-modules/user/page.mdx": "2024-12-25T16:24:26.837Z", "app/commerce-modules/page.mdx": "2024-12-23T14:38:21.064Z", "app/contribution-guidelines/docs/page.mdx": "2024-12-12T11:06:12.250Z", "app/create-medusa-app/page.mdx": "2024-08-05T11:10:55+03:00", @@ -209,11 +195,10 @@ export const generatedEditDates = { "app/commerce-modules/auth/auth-flows/page.mdx": "2024-09-05T08:50:11.671Z", "app/commerce-modules/auth/_events/page.mdx": "2024-07-03T19:27:13+03:00", "app/commerce-modules/auth/auth-identity-and-actor-types/page.mdx": "2024-12-09T13:04:01.129Z", - "app/commerce-modules/api-key/page.mdx": "2024-12-09T14:47:01.509Z", - "app/commerce-modules/auth/create-actor-type/page.mdx": "2024-12-09T15:32:07.594Z", + "app/commerce-modules/api-key/page.mdx": "2024-12-25T15:55:02.846Z", + "app/commerce-modules/auth/create-actor-type/page.mdx": "2024-12-25T13:26:27.176Z", "app/architectural-modules/page.mdx": "2024-12-11T10:33:53.064Z", "app/architectural-modules/workflow-engine/redis/page.mdx": "2024-10-15T12:50:59.507Z", - "app/commerce-modules/api-key/examples/page.mdx": "2024-10-15T14:58:58.994Z", "app/architectural-modules/notification/sendgrid/page.mdx": "2024-10-15T12:51:25.569Z", "app/commerce-modules/api-key/concepts/page.mdx": "2024-10-07T13:59:37.529Z", "app/architectural-modules/workflow-engine/page.mdx": "2024-05-28T13:25:03+03:00", @@ -886,7 +871,7 @@ export const generatedEditDates = { "references/auth/IAuthModuleService/methods/auth.IAuthModuleService.authenticate/page.mdx": "2024-12-10T14:54:57.312Z", "references/auth/IAuthModuleService/methods/auth.IAuthModuleService.validateCallback/page.mdx": "2024-12-10T14:54:57.318Z", "references/auth/interfaces/auth.AuthenticationResponse/page.mdx": "2024-12-09T13:21:36.233Z", - "references/auth_provider/classes/auth_provider.AbstractAuthModuleProvider/page.mdx": "2024-12-09T13:21:36.205Z", + "references/auth_provider/classes/auth_provider.AbstractAuthModuleProvider/page.mdx": "2024-12-25T13:27:05.376Z", "references/core_flows/Invite/Workflows_Invite/functions/core_flows.Invite.Workflows_Invite.refreshInviteTokensWorkflow/page.mdx": "2024-12-25T08:43:13.811Z", "references/types/CommonTypes/types/types.CommonTypes.BatchMethodResponse/page.mdx": "2024-12-09T13:21:32.849Z", "references/types/HttpTypes/interfaces/types.HttpTypes.AdminAddReturnShipping/page.mdx": "2024-12-09T13:21:34.545Z", @@ -986,7 +971,7 @@ export const generatedEditDates = { "references/order/IOrderModuleService/methods/order.IOrderModuleService.updateOrderChangeActions/page.mdx": "2024-12-23T12:30:30.337Z", "references/types/ModulesSdkTypes/types/types.ModulesSdkTypes.RemoteQueryFunction/page.mdx": "2024-12-23T12:30:29.466Z", "references/types/types.CommonTypes/page.mdx": "2024-11-25T17:49:25.351Z", - "app/storefront-development/publishable-api-keys/page.mdx": "2024-12-19T16:35:56.322Z", + "app/storefront-development/publishable-api-keys/page.mdx": "2024-12-25T16:00:18.474Z", "references/api_key/types/api_key.ExpandScalar/page.mdx": "2024-09-17T00:10:59.563Z", "references/api_key/types/api_key.FilterQuery/page.mdx": "2024-11-27T16:33:40.706Z", "references/api_key/types/api_key.FilterValue/page.mdx": "2024-09-17T00:10:59.571Z", @@ -2146,12 +2131,12 @@ export const generatedEditDates = { "app/admin-components/layouts/single-column/page.mdx": "2024-10-07T11:16:06.435Z", "app/admin-components/layouts/two-column/page.mdx": "2024-10-07T11:16:10.092Z", "app/admin-components/components/forms/page.mdx": "2024-10-09T12:48:04.229Z", - "app/commerce-modules/auth/reset-password/page.mdx": "2024-11-27T13:33:55.940Z", + "app/commerce-modules/auth/reset-password/page.mdx": "2024-12-25T13:26:32.595Z", "app/storefront-development/customers/reset-password/page.mdx": "2024-12-19T16:32:00.724Z", "app/commerce-modules/api-key/links-to-other-modules/page.mdx": "2024-12-24T14:36:06.109Z", - "app/commerce-modules/cart/extend/page.mdx": "2024-12-11T09:05:37.041Z", + "app/commerce-modules/cart/extend/page.mdx": "2024-12-25T12:48:59.149Z", "app/commerce-modules/cart/links-to-other-modules/page.mdx": "2024-12-24T14:46:49.847Z", - "app/commerce-modules/customer/extend/page.mdx": "2024-12-16T14:11:47.517Z", + "app/commerce-modules/customer/extend/page.mdx": "2024-12-25T15:54:37.789Z", "app/commerce-modules/fulfillment/links-to-other-modules/page.mdx": "2024-12-24T14:49:54.535Z", "app/commerce-modules/inventory/links-to-other-modules/page.mdx": "2024-12-24T14:50:25.574Z", "app/commerce-modules/pricing/links-to-other-modules/page.mdx": "2024-12-24T14:53:39.198Z", @@ -5632,7 +5617,7 @@ export const generatedEditDates = { "app/recipes/commerce-automation/restock-notification/page.mdx": "2024-12-11T08:47:27.471Z", "app/troubleshooting/workflow-errors/page.mdx": "2024-12-11T08:44:36.598Z", "app/integrations/guides/shipstation/page.mdx": "2024-12-23T07:48:47.719Z", - "app/nextjs-starter/guides/customize-stripe/page.mdx": "2024-12-12T12:46:33.999Z", + "app/nextjs-starter/guides/customize-stripe/page.mdx": "2024-12-25T14:48:55.877Z", "references/core_flows/Cart/Workflows_Cart/functions/core_flows.Cart.Workflows_Cart.listShippingOptionsForCartWithPricingWorkflow/page.mdx": "2024-12-25T08:43:13.451Z", "references/core_flows/Cart/Workflows_Cart/variables/core_flows.Cart.Workflows_Cart.listShippingOptionsForCartWithPricingWorkflowId/page.mdx": "2024-12-17T16:57:22.044Z", "references/core_flows/Fulfillment/Steps_Fulfillment/functions/core_flows.Fulfillment.Steps_Fulfillment.calculateShippingOptionsPricesStep/page.mdx": "2024-12-25T08:43:13.630Z", diff --git a/www/apps/resources/generated/files-map.mjs b/www/apps/resources/generated/files-map.mjs index 840f7219eb4db..f925a51426636 100644 --- a/www/apps/resources/generated/files-map.mjs +++ b/www/apps/resources/generated/files-map.mjs @@ -127,10 +127,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/api-key/concepts/page.mdx", "pathname": "/commerce-modules/api-key/concepts" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/api-key/examples/page.mdx", - "pathname": "/commerce-modules/api-key/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/api-key/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/api-key/links-to-other-modules" @@ -179,10 +175,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/auth/events/page.mdx", "pathname": "/commerce-modules/auth/events" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/auth/examples/page.mdx", - "pathname": "/commerce-modules/auth/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/auth/module-options/page.mdx", "pathname": "/commerce-modules/auth/module-options" @@ -203,10 +195,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/cart/events/page.mdx", "pathname": "/commerce-modules/cart/events" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/cart/examples/page.mdx", - "pathname": "/commerce-modules/cart/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/cart/extend/page.mdx", "pathname": "/commerce-modules/cart/extend" @@ -227,10 +215,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/cart/tax-lines/page.mdx", "pathname": "/commerce-modules/cart/tax-lines" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/currency/examples/page.mdx", - "pathname": "/commerce-modules/currency/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/currency/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/currency/links-to-other-modules" @@ -251,10 +235,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/customer/events/page.mdx", "pathname": "/commerce-modules/customer/events" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/customer/examples/page.mdx", - "pathname": "/commerce-modules/customer/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/customer/extend/page.mdx", "pathname": "/commerce-modules/customer/extend" @@ -307,10 +287,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/inventory/concepts/page.mdx", "pathname": "/commerce-modules/inventory/concepts" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/inventory/examples/page.mdx", - "pathname": "/commerce-modules/inventory/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/inventory/inventory-in-flows/page.mdx", "pathname": "/commerce-modules/inventory/inventory-in-flows" @@ -383,10 +359,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/page.mdx", "pathname": "/commerce-modules" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/payment/examples/page.mdx", - "pathname": "/commerce-modules/payment/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/payment/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/payment/links-to-other-modules" @@ -435,10 +407,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/pricing/concepts/page.mdx", "pathname": "/commerce-modules/pricing/concepts" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/pricing/examples/page.mdx", - "pathname": "/commerce-modules/pricing/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/pricing/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/pricing/links-to-other-modules" @@ -467,10 +435,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/product/events/page.mdx", "pathname": "/commerce-modules/product/events" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/product/examples/page.mdx", - "pathname": "/commerce-modules/product/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/product/extend/page.mdx", "pathname": "/commerce-modules/product/extend" @@ -511,10 +475,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/promotion/concepts/page.mdx", "pathname": "/commerce-modules/promotion/concepts" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/promotion/examples/page.mdx", - "pathname": "/commerce-modules/promotion/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/promotion/extend/page.mdx", "pathname": "/commerce-modules/promotion/extend" @@ -535,10 +495,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/region/events/page.mdx", "pathname": "/commerce-modules/region/events" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/region/examples/page.mdx", - "pathname": "/commerce-modules/region/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/region/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/region/links-to-other-modules" @@ -555,10 +511,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/sales-channel/events/page.mdx", "pathname": "/commerce-modules/sales-channel/events" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/sales-channel/examples/page.mdx", - "pathname": "/commerce-modules/sales-channel/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/sales-channel/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/sales-channel/links-to-other-modules" @@ -579,10 +531,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/stock-location/concepts/page.mdx", "pathname": "/commerce-modules/stock-location/concepts" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/stock-location/examples/page.mdx", - "pathname": "/commerce-modules/stock-location/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/stock-location/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/stock-location/links-to-other-modules" @@ -595,10 +543,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/store/admin-widget-zones/page.mdx", "pathname": "/commerce-modules/store/admin-widget-zones" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/store/examples/page.mdx", - "pathname": "/commerce-modules/store/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/store/links-to-other-modules/page.mdx", "pathname": "/commerce-modules/store/links-to-other-modules" @@ -611,10 +555,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/tax/admin-widget-zones/page.mdx", "pathname": "/commerce-modules/tax/admin-widget-zones" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/tax/examples/page.mdx", - "pathname": "/commerce-modules/tax/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/tax/module-options/page.mdx", "pathname": "/commerce-modules/tax/module-options" @@ -643,10 +583,6 @@ export const filesMap = [ "filePath": "/www/apps/resources/app/commerce-modules/user/events/page.mdx", "pathname": "/commerce-modules/user/events" }, - { - "filePath": "/www/apps/resources/app/commerce-modules/user/examples/page.mdx", - "pathname": "/commerce-modules/user/examples" - }, { "filePath": "/www/apps/resources/app/commerce-modules/user/module-options/page.mdx", "pathname": "/commerce-modules/user/module-options" diff --git a/www/apps/resources/generated/sidebar.mjs b/www/apps/resources/generated/sidebar.mjs index 1c6b6b6a9d27a..63d27ae864a44 100644 --- a/www/apps/resources/generated/sidebar.mjs +++ b/www/apps/resources/generated/sidebar.mjs @@ -192,18 +192,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/api-key/examples", - "title": "Examples", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -226,8 +222,114 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", + "title": "Storefront Guides", + "initialOpen": false, + "autogenerate_tags": "storefront+apiKey", + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Use a Publishable API Key in the Storefront", + "path": "/storefront-development/publishable-api-keys", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "initialOpen": false, + "autogenerate_tags": "workflow+apiKey", + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createApiKeysWorkflow", + "path": "/references/medusa-workflows/createApiKeysWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteApiKeysWorkflow", + "path": "/references/medusa-workflows/deleteApiKeysWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "revokeApiKeysWorkflow", + "path": "/references/medusa-workflows/revokeApiKeysWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateApiKeysWorkflow", + "path": "/references/medusa-workflows/updateApiKeysWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "initialOpen": false, + "autogenerate_tags": "step+apiKey", + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createApiKeysStep", + "path": "/references/medusa-workflows/steps/createApiKeysStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteApiKeysStep", + "path": "/references/medusa-workflows/steps/deleteApiKeysStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "revokeApiKeysStep", + "path": "/references/medusa-workflows/steps/revokeApiKeysStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateApiKeysStep", + "path": "/references/medusa-workflows/steps/updateApiKeysStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -387,18 +489,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/auth/examples", - "title": "Examples", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -437,8 +535,11 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Guides", + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+auth", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, @@ -469,8 +570,138 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+auth", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Log-out Customer in Storefront", + "path": "/storefront-development/customers/log-out", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Login Customer in Storefront", + "path": "/storefront-development/customers/login", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Register Customer in Storefront", + "path": "/storefront-development/customers/register", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Reset Customer Password in Storefront", + "path": "/storefront-development/customers/reset-password", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Customer in Storefront", + "path": "/storefront-development/customers/retrieve", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Third-Party or Social Login in Storefront", + "path": "/storefront-development/customers/third-party-login", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+auth", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCustomerAccountWorkflow", + "path": "/references/medusa-workflows/createCustomerAccountWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeCustomerAccountWorkflow", + "path": "/references/medusa-workflows/removeCustomerAccountWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "acceptInviteWorkflow", + "path": "/references/medusa-workflows/acceptInviteWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createUserAccountWorkflow", + "path": "/references/medusa-workflows/createUserAccountWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeUserAccountWorkflow", + "path": "/references/medusa-workflows/removeUserAccountWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+auth", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "setAuthAppMetadataStep", + "path": "/references/medusa-workflows/steps/setAuthAppMetadataStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", "title": "Providers", + "initialOpen": false, "children": [ { "loaded": true, @@ -501,8 +732,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -716,26 +948,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/cart/examples", - "title": "Examples", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/cart/extend", - "title": "Extend Module", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -774,76 +994,401 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "References", + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+cart", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/cart/events", - "title": "Events Reference", + "path": "/commerce-modules/cart/extend", + "title": "Extend Module", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+cart", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Create Cart Context in Storefront", + "path": "/storefront-development/cart/context", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/cart", - "title": "Main Service Reference", - "isChildSidebar": true, - "childSidebarTitle": "Cart Module's Main Service Reference", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Methods", - "autogenerate_path": "/references/cart/ICartModuleService/methods", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/cart/addLineItemAdjustments", - "title": "addLineItemAdjustments", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/cart/addLineItemTaxLines", - "title": "addLineItemTaxLines", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/cart/addLineItems", - "title": "addLineItems", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/cart/addShippingMethodAdjustments", - "title": "addShippingMethodAdjustments", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/cart/addShippingMethodTaxLines", - "title": "addShippingMethodTaxLines", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, + "type": "ref", + "title": "Create Cart in Storefront", + "path": "/storefront-development/cart/create", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Manage Cart's Items in Storefront", + "path": "/storefront-development/cart/manage-items", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Cart in Storefront", + "path": "/storefront-development/cart/retrieve", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Update Cart in Storefront", + "path": "/storefront-development/cart/update", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 2: Enter Address", + "path": "/storefront-development/checkout/address", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 5: Complete Cart", + "path": "/storefront-development/checkout/complete-cart", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 1: Enter Email", + "path": "/storefront-development/checkout/email", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 4: Choose Payment Provider", + "path": "/storefront-development/checkout/payment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Payment with Stripe in React Storefront", + "path": "/storefront-development/checkout/payment/stripe", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 3: Choose Shipping Method", + "path": "/storefront-development/checkout/shipping", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+cart", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addShippingMethodToCartWorkflow", + "path": "/references/medusa-workflows/addShippingMethodToCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addToCartWorkflow", + "path": "/references/medusa-workflows/addToCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "transferCartCustomerWorkflow", + "path": "/references/medusa-workflows/transferCartCustomerWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCartPromotionsWorkflow", + "path": "/references/medusa-workflows/updateCartPromotionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCartWorkflow", + "path": "/references/medusa-workflows/updateCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateLineItemInCartWorkflow", + "path": "/references/medusa-workflows/updateLineItemInCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateTaxLinesWorkflow", + "path": "/references/medusa-workflows/updateTaxLinesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteLineItemsWorkflow", + "path": "/references/medusa-workflows/deleteLineItemsWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+cart", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addShippingMethodToCartStep", + "path": "/references/medusa-workflows/steps/addShippingMethodToCartStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartsStep", + "path": "/references/medusa-workflows/steps/createCartsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createLineItemAdjustmentsStep", + "path": "/references/medusa-workflows/steps/createLineItemAdjustmentsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createLineItemsStep", + "path": "/references/medusa-workflows/steps/createLineItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createShippingMethodAdjustmentsStep", + "path": "/references/medusa-workflows/steps/createShippingMethodAdjustmentsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "getLineItemActionsStep", + "path": "/references/medusa-workflows/steps/getLineItemActionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeLineItemAdjustmentsStep", + "path": "/references/medusa-workflows/steps/removeLineItemAdjustmentsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeShippingMethodAdjustmentsStep", + "path": "/references/medusa-workflows/steps/removeShippingMethodAdjustmentsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeShippingMethodFromCartStep", + "path": "/references/medusa-workflows/steps/removeShippingMethodFromCartStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "setTaxLinesForItemsStep", + "path": "/references/medusa-workflows/steps/setTaxLinesForItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCartsStep", + "path": "/references/medusa-workflows/steps/updateCartsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateLineItemsStep", + "path": "/references/medusa-workflows/steps/updateLineItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteLineItemsStep", + "path": "/references/medusa-workflows/steps/deleteLineItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateLineItemsStepWithSelector", + "path": "/references/medusa-workflows/steps/updateLineItemsStepWithSelector", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "References", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/cart/events", + "title": "Events Reference", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/cart", + "title": "Main Service Reference", + "isChildSidebar": true, + "childSidebarTitle": "Cart Module's Main Service Reference", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Methods", + "autogenerate_path": "/references/cart/ICartModuleService/methods", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/cart/addLineItemAdjustments", + "title": "addLineItemAdjustments", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/cart/addLineItemTaxLines", + "title": "addLineItemTaxLines", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/cart/addLineItems", + "title": "addLineItems", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/cart/addShippingMethodAdjustments", + "title": "addShippingMethodAdjustments", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/cart/addShippingMethodTaxLines", + "title": "addShippingMethodTaxLines", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, "type": "link", "path": "/references/cart/addShippingMethods", "title": "addShippingMethods", @@ -1317,18 +1862,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/currency/examples", - "title": "Examples", - "children": [] - }, - { + "type": "separator" + }, + { "loaded": true, "isPathHref": true, "type": "sub-category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -1345,6 +1886,7 @@ export const generatedSidebar = [ "isPathHref": true, "type": "sub-category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -1353,7 +1895,7 @@ export const generatedSidebar = [ "path": "/references/currency", "title": "Main Service Reference", "isChildSidebar": true, - "childSidebarTitle": "Cart Module's Main Service Reference", + "childSidebarTitle": "Currency Module's Main Service Reference", "children": [ { "loaded": true, @@ -1438,26 +1980,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/customer/examples", - "title": "Examples", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/customer/extend", - "title": "Extend Module", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -1480,360 +2010,272 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "References", + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+customer", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/customer/events", - "title": "Events Reference", + "path": "/commerce-modules/customer/extend", + "title": "Extend Module", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+customer", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Manage Customer Addresses in Storefront", + "path": "/storefront-development/customers/addresses", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/customer/admin-widget-zones", - "title": "Admin Widget Zones", + "type": "ref", + "title": "Customer Context in Storefront", + "path": "/storefront-development/customers/context", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/customer", - "title": "Main Service Reference", - "isChildSidebar": true, - "childSidebarTitle": "Customer Module's Main Service Reference", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Methods", - "autogenerate_path": "/references/customer/ICustomerModuleService/methods", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/addCustomerToGroup", - "title": "addCustomerToGroup", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/createCustomerAddresses", - "title": "createCustomerAddresses", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/createCustomerGroups", - "title": "createCustomerGroups", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/createCustomers", - "title": "createCustomers", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/deleteCustomerAddresses", - "title": "deleteCustomerAddresses", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/deleteCustomerGroups", - "title": "deleteCustomerGroups", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/deleteCustomers", - "title": "deleteCustomers", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/listAndCountCustomerAddresses", - "title": "listAndCountCustomerAddresses", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/listAndCountCustomerGroups", - "title": "listAndCountCustomerGroups", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/listAndCountCustomers", - "title": "listAndCountCustomers", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/listCustomerAddresses", - "title": "listCustomerAddresses", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/listCustomerGroupCustomers", - "title": "listCustomerGroupCustomers", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/listCustomerGroups", - "title": "listCustomerGroups", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/listCustomers", - "title": "listCustomers", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/removeCustomerFromGroup", - "title": "removeCustomerFromGroup", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/restoreCustomerGroups", - "title": "restoreCustomerGroups", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/restoreCustomers", - "title": "restoreCustomers", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/retrieveCustomer", - "title": "retrieveCustomer", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/retrieveCustomerGroup", - "title": "retrieveCustomerGroup", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/softDeleteCustomerGroups", - "title": "softDeleteCustomerGroups", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/softDeleteCustomers", - "title": "softDeleteCustomers", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/updateCustomerAddresses", - "title": "updateCustomerAddresses", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/updateCustomerGroups", - "title": "updateCustomerGroups", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/updateCustomers", - "title": "updateCustomers", - "children": [] - } - ] - } - ] + "type": "ref", + "title": "Log-out Customer in Storefront", + "path": "/storefront-development/customers/log-out", + "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/customer/models", - "title": "Data Models Reference", - "isChildSidebar": true, - "childSidebarTitle": "Customer Module Data Models Reference", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Data Models", - "autogenerate_path": "/references/customer_models/variables", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/models/Customer", - "title": "Customer", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/models/CustomerAddress", - "title": "CustomerAddress", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/models/CustomerGroup", - "title": "CustomerGroup", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/customer/models/CustomerGroupCustomer", - "title": "CustomerGroupCustomer", - "children": [] - } - ] - } - ] + "type": "ref", + "title": "Login Customer in Storefront", + "path": "/storefront-development/customers/login", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Edit Customer Profile in Storefront", + "path": "/storefront-development/customers/profile", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Register Customer in Storefront", + "path": "/storefront-development/customers/register", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Reset Customer Password in Storefront", + "path": "/storefront-development/customers/reset-password", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Customer in Storefront", + "path": "/storefront-development/customers/retrieve", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Third-Party or Social Login in Storefront", + "path": "/storefront-development/customers/third-party-login", + "children": [] } ] - } - ] - }, - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Fulfillment Module", - "isChildSidebar": true, - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/fulfillment", - "title": "Overview", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/fulfillment/module-options", - "title": "Module Options", - "children": [] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+customer", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/fulfillment/concepts", - "title": "Fulfillment Concepts", + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/fulfillment/fulfillment-provider", - "title": "Fulfillment Provider", + "type": "ref", + "title": "updateCartWorkflow", + "path": "/references/medusa-workflows/updateCartWorkflow", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/fulfillment/shipping-option", - "title": "Shipping Option", + "type": "ref", + "title": "createCustomerAccountWorkflow", + "path": "/references/medusa-workflows/createCustomerAccountWorkflow", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/fulfillment/item-fulfillment", - "title": "Item Fulfillment", + "type": "ref", + "title": "createCustomerAddressesWorkflow", + "path": "/references/medusa-workflows/createCustomerAddressesWorkflow", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/fulfillment/links-to-other-modules", - "title": "Links to Other Modules", + "type": "ref", + "title": "createCustomersWorkflow", + "path": "/references/medusa-workflows/createCustomersWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCustomerAddressesWorkflow", + "path": "/references/medusa-workflows/deleteCustomerAddressesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCustomersWorkflow", + "path": "/references/medusa-workflows/deleteCustomersWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeCustomerAccountWorkflow", + "path": "/references/medusa-workflows/removeCustomerAccountWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCustomerAddressesWorkflow", + "path": "/references/medusa-workflows/updateCustomerAddressesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCustomersWorkflow", + "path": "/references/medusa-workflows/updateCustomersWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCustomerGroupsWorkflow", + "path": "/references/medusa-workflows/createCustomerGroupsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCustomerGroupsWorkflow", + "path": "/references/medusa-workflows/deleteCustomerGroupsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "linkCustomerGroupsToCustomerWorkflow", + "path": "/references/medusa-workflows/linkCustomerGroupsToCustomerWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "linkCustomersToCustomerGroupWorkflow", + "path": "/references/medusa-workflows/linkCustomersToCustomerGroupWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCustomerGroupsWorkflow", + "path": "/references/medusa-workflows/updateCustomerGroupsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addOrderLineItemsWorkflow", + "path": "/references/medusa-workflows/addOrderLineItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderWorkflow", + "path": "/references/medusa-workflows/createOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderClaimAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderEditAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderExchangeAddNewItemWorkflow", "children": [] } ] @@ -1841,23 +2283,122 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Guides", + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+customer", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/provider", - "title": "Create Fulfillment Provider Module", + "type": "ref", + "title": "findOrCreateCustomerStep", + "path": "/references/medusa-workflows/steps/findOrCreateCustomerStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/integrations/guides/shipstation", - "title": "Integrate ShipStation", + "type": "ref", + "title": "createCustomerAddressesStep", + "path": "/references/medusa-workflows/steps/createCustomerAddressesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCustomersStep", + "path": "/references/medusa-workflows/steps/createCustomersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCustomerAddressesStep", + "path": "/references/medusa-workflows/steps/deleteCustomerAddressesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCustomersStep", + "path": "/references/medusa-workflows/steps/deleteCustomersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "maybeUnsetDefaultBillingAddressesStep", + "path": "/references/medusa-workflows/steps/maybeUnsetDefaultBillingAddressesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "maybeUnsetDefaultShippingAddressesStep", + "path": "/references/medusa-workflows/steps/maybeUnsetDefaultShippingAddressesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCustomerAddressesStep", + "path": "/references/medusa-workflows/steps/updateCustomerAddressesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCustomersStep", + "path": "/references/medusa-workflows/steps/updateCustomersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCustomerGroupsStep", + "path": "/references/medusa-workflows/steps/createCustomerGroupsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCustomerGroupStep", + "path": "/references/medusa-workflows/steps/deleteCustomerGroupStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "linkCustomerGroupsToCustomerStep", + "path": "/references/medusa-workflows/steps/linkCustomerGroupsToCustomerStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "linkCustomersToCustomerGroupStep", + "path": "/references/medusa-workflows/steps/linkCustomersToCustomerGroupStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCustomerGroupsStep", + "path": "/references/medusa-workflows/steps/updateCustomerGroupsStep", "children": [] } ] @@ -1865,14 +2406,23 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/fulfillment/admin-widget-zones", + "path": "/commerce-modules/customer/events", + "title": "Events Reference", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/customer/admin-widget-zones", "title": "Admin Widget Zones", "children": [] }, @@ -1880,685 +2430,260 @@ export const generatedSidebar = [ "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment", + "path": "/references/customer", "title": "Main Service Reference", "isChildSidebar": true, - "childSidebarTitle": "Fulfillment Module's Main Service Reference", + "childSidebarTitle": "Customer Module's Main Service Reference", "children": [ { "loaded": true, "isPathHref": true, "type": "category", "title": "Methods", - "autogenerate_path": "/references/fulfillment/IFulfillmentModuleService/methods", + "autogenerate_path": "/references/customer/ICustomerModuleService/methods", "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/calculateShippingOptionsPrices", - "title": "calculateShippingOptionsPrices", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/cancelFulfillment", - "title": "cancelFulfillment", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createFulfillment", - "title": "createFulfillment", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createFulfillmentSets", - "title": "createFulfillmentSets", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createGeoZones", - "title": "createGeoZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createReturnFulfillment", - "title": "createReturnFulfillment", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createServiceZones", - "title": "createServiceZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createShippingOptionRules", - "title": "createShippingOptionRules", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createShippingOptions", - "title": "createShippingOptions", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/createShippingProfiles", - "title": "createShippingProfiles", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/deleteFulfillment", - "title": "deleteFulfillment", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/deleteFulfillmentSets", - "title": "deleteFulfillmentSets", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/deleteGeoZones", - "title": "deleteGeoZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/deleteServiceZones", - "title": "deleteServiceZones", + "path": "/references/customer/addCustomerToGroup", + "title": "addCustomerToGroup", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/deleteShippingOptionRules", - "title": "deleteShippingOptionRules", + "path": "/references/customer/createCustomerAddresses", + "title": "createCustomerAddresses", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/deleteShippingOptionTypes", - "title": "deleteShippingOptionTypes", + "path": "/references/customer/createCustomerGroups", + "title": "createCustomerGroups", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/deleteShippingOptions", - "title": "deleteShippingOptions", + "path": "/references/customer/createCustomers", + "title": "createCustomers", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/deleteShippingProfiles", - "title": "deleteShippingProfiles", + "path": "/references/customer/deleteCustomerAddresses", + "title": "deleteCustomerAddresses", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountFulfillmentSets", - "title": "listAndCountFulfillmentSets", + "path": "/references/customer/deleteCustomerGroups", + "title": "deleteCustomerGroups", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountFulfillments", - "title": "listAndCountFulfillments", + "path": "/references/customer/deleteCustomers", + "title": "deleteCustomers", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountGeoZones", - "title": "listAndCountGeoZones", + "path": "/references/customer/listAndCountCustomerAddresses", + "title": "listAndCountCustomerAddresses", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountServiceZones", - "title": "listAndCountServiceZones", + "path": "/references/customer/listAndCountCustomerGroups", + "title": "listAndCountCustomerGroups", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountShippingOptionRules", - "title": "listAndCountShippingOptionRules", + "path": "/references/customer/listAndCountCustomers", + "title": "listAndCountCustomers", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountShippingOptionTypes", - "title": "listAndCountShippingOptionTypes", + "path": "/references/customer/listCustomerAddresses", + "title": "listCustomerAddresses", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountShippingOptions", - "title": "listAndCountShippingOptions", + "path": "/references/customer/listCustomerGroupCustomers", + "title": "listCustomerGroupCustomers", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listAndCountShippingProfiles", - "title": "listAndCountShippingProfiles", + "path": "/references/customer/listCustomerGroups", + "title": "listCustomerGroups", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listFulfillmentProviders", - "title": "listFulfillmentProviders", + "path": "/references/customer/listCustomers", + "title": "listCustomers", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listFulfillmentSets", - "title": "listFulfillmentSets", + "path": "/references/customer/removeCustomerFromGroup", + "title": "removeCustomerFromGroup", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listFulfillments", - "title": "listFulfillments", + "path": "/references/customer/restoreCustomerGroups", + "title": "restoreCustomerGroups", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listGeoZones", - "title": "listGeoZones", + "path": "/references/customer/restoreCustomers", + "title": "restoreCustomers", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listServiceZones", - "title": "listServiceZones", + "path": "/references/customer/retrieveCustomer", + "title": "retrieveCustomer", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listShippingOptionRules", - "title": "listShippingOptionRules", + "path": "/references/customer/retrieveCustomerGroup", + "title": "retrieveCustomerGroup", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listShippingOptionTypes", - "title": "listShippingOptionTypes", + "path": "/references/customer/softDeleteCustomerGroups", + "title": "softDeleteCustomerGroups", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listShippingOptions", - "title": "listShippingOptions", + "path": "/references/customer/softDeleteCustomers", + "title": "softDeleteCustomers", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listShippingOptionsForContext", - "title": "listShippingOptionsForContext", + "path": "/references/customer/updateCustomerAddresses", + "title": "updateCustomerAddresses", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/listShippingProfiles", - "title": "listShippingProfiles", + "path": "/references/customer/updateCustomerGroups", + "title": "updateCustomerGroups", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/restoreFulfillmentSets", - "title": "restoreFulfillmentSets", + "path": "/references/customer/updateCustomers", + "title": "updateCustomers", "children": [] - }, + } + ] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/customer/models", + "title": "Data Models Reference", + "isChildSidebar": true, + "childSidebarTitle": "Customer Module Data Models Reference", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Data Models", + "autogenerate_path": "/references/customer_models/variables", + "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/restoreGeoZones", - "title": "restoreGeoZones", + "path": "/references/customer/models/Customer", + "title": "Customer", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/restoreServiceZones", - "title": "restoreServiceZones", + "path": "/references/customer/models/CustomerAddress", + "title": "CustomerAddress", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/restoreShippingOptions", - "title": "restoreShippingOptions", + "path": "/references/customer/models/CustomerGroup", + "title": "CustomerGroup", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/references/fulfillment/restoreShippingProfiles", - "title": "restoreShippingProfiles", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveFulfillment", - "title": "retrieveFulfillment", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveFulfillmentOptions", - "title": "retrieveFulfillmentOptions", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveFulfillmentSet", - "title": "retrieveFulfillmentSet", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveGeoZone", - "title": "retrieveGeoZone", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveServiceZone", - "title": "retrieveServiceZone", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveShippingOption", - "title": "retrieveShippingOption", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveShippingOptionRule", - "title": "retrieveShippingOptionRule", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveShippingOptionType", - "title": "retrieveShippingOptionType", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/retrieveShippingProfile", - "title": "retrieveShippingProfile", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/softDeleteFulfillmentSets", - "title": "softDeleteFulfillmentSets", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/softDeleteGeoZones", - "title": "softDeleteGeoZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/softDeleteServiceZones", - "title": "softDeleteServiceZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/softDeleteShippingOptions", - "title": "softDeleteShippingOptions", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/softDeleteShippingProfiles", - "title": "softDeleteShippingProfiles", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/updateFulfillment", - "title": "updateFulfillment", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/updateFulfillmentSets", - "title": "updateFulfillmentSets", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/updateGeoZones", - "title": "updateGeoZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/updateServiceZones", - "title": "updateServiceZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/updateShippingOptionRules", - "title": "updateShippingOptionRules", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/updateShippingOptions", - "title": "updateShippingOptions", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/updateShippingProfiles", - "title": "updateShippingProfiles", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/upsertServiceZones", - "title": "upsertServiceZones", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/upsertShippingOptions", - "title": "upsertShippingOptions", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/upsertShippingProfiles", - "title": "upsertShippingProfiles", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/validateFulfillmentData", - "title": "validateFulfillmentData", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/validateFulfillmentOption", - "title": "validateFulfillmentOption", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/validateShippingOption", - "title": "validateShippingOption", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/validateShippingOptionsForPriceCalculation", - "title": "validateShippingOptionsForPriceCalculation", - "children": [] - } - ] - } - ] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models", - "title": "Data Models Reference", - "isChildSidebar": true, - "childSidebarTitle": "Fulfillment Module Data Models Reference", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Data Models", - "hasTitleStyling": true, - "autogenerate_path": "/references/fulfillment_models/variables", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/Fulfillment", - "title": "Fulfillment", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/FulfillmentAddress", - "title": "FulfillmentAddress", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/FulfillmentItem", - "title": "FulfillmentItem", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/FulfillmentLabel", - "title": "FulfillmentLabel", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/FulfillmentProvider", - "title": "FulfillmentProvider", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/FulfillmentSet", - "title": "FulfillmentSet", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/GeoZone", - "title": "GeoZone", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/ServiceZone", - "title": "ServiceZone", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/ShippingOption", - "title": "ShippingOption", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/ShippingOptionRule", - "title": "ShippingOptionRule", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/ShippingOptionType", - "title": "ShippingOptionType", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/fulfillment/models/ShippingProfile", - "title": "ShippingProfile", + "path": "/references/customer/models/CustomerGroupCustomer", + "title": "CustomerGroupCustomer", "children": [] } ] @@ -2573,14 +2698,14 @@ export const generatedSidebar = [ "loaded": true, "isPathHref": true, "type": "category", - "title": "Inventory Module", + "title": "Fulfillment Module", "isChildSidebar": true, "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/inventory", + "path": "/commerce-modules/fulfillment", "title": "Overview", "children": [] }, @@ -2588,38 +2713,58 @@ export const generatedSidebar = [ "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/inventory/examples", - "title": "Examples", + "path": "/commerce-modules/fulfillment/module-options", + "title": "Module Options", "children": [] }, + { + "type": "separator" + }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/inventory/concepts", - "title": "Inventory Concepts", + "path": "/commerce-modules/fulfillment/concepts", + "title": "Fulfillment Concepts", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/inventory/inventory-in-flows", - "title": "Inventory in Flows", + "path": "/commerce-modules/fulfillment/fulfillment-provider", + "title": "Fulfillment Provider", "children": [] }, { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/inventory/links-to-other-modules", - "title": "Links to Modules", + "path": "/commerce-modules/fulfillment/shipping-option", + "title": "Shipping Option", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/fulfillment/item-fulfillment", + "title": "Item Fulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/fulfillment/links-to-other-modules", + "title": "Links to Other Modules", "children": [] } ] @@ -2627,148 +2772,1753 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "References", + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+fulfillment", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, "type": "link", - "path": "/commerce-modules/inventory/admin-widget-zones", - "title": "Admin Widget Zones", + "path": "/references/fulfillment/provider", + "title": "Create Fulfillment Provider Module", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/inventory-next", - "title": "Main Service Reference", - "isChildSidebar": true, - "childSidebarTitle": "Inventory Module's Main Service Reference", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Methods", - "autogenerate_path": "/references/inventory_next/IInventoryService/methods", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/adjustInventory", - "title": "adjustInventory", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/confirmInventory", - "title": "confirmInventory", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/createInventoryItems", - "title": "createInventoryItems", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/createInventoryLevels", - "title": "createInventoryLevels", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/createReservationItems", - "title": "createReservationItems", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/deleteInventoryItemLevelByLocationId", - "title": "deleteInventoryItemLevelByLocationId", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/deleteInventoryItems", - "title": "deleteInventoryItems", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/deleteInventoryLevel", - "title": "deleteInventoryLevel", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/deleteInventoryLevels", - "title": "deleteInventoryLevels", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/deleteReservationItemByLocationId", - "title": "deleteReservationItemByLocationId", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/deleteReservationItems", - "title": "deleteReservationItems", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/deleteReservationItemsByLineItem", - "title": "deleteReservationItemsByLineItem", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/listAndCountInventoryItems", - "title": "listAndCountInventoryItems", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/listAndCountInventoryLevels", - "title": "listAndCountInventoryLevels", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, + "type": "ref", + "path": "/integrations/guides/shipstation", + "title": "Integrate ShipStation", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+fulfillment", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 3: Choose Shipping Method", + "path": "/storefront-development/checkout/shipping", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+fulfillment", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addShippingMethodToCartWorkflow", + "path": "/references/medusa-workflows/addShippingMethodToCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "listShippingOptionsForCartWithPricingWorkflow", + "path": "/references/medusa-workflows/listShippingOptionsForCartWithPricingWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchShippingOptionRulesWorkflow", + "path": "/references/medusa-workflows/batchShippingOptionRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "calculateShippingOptionsPricesWorkflow", + "path": "/references/medusa-workflows/calculateShippingOptionsPricesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelFulfillmentWorkflow", + "path": "/references/medusa-workflows/cancelFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createFulfillmentWorkflow", + "path": "/references/medusa-workflows/createFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReturnFulfillmentWorkflow", + "path": "/references/medusa-workflows/createReturnFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createServiceZonesWorkflow", + "path": "/references/medusa-workflows/createServiceZonesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createShipmentWorkflow", + "path": "/references/medusa-workflows/createShipmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createShippingOptionsWorkflow", + "path": "/references/medusa-workflows/createShippingOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createShippingProfilesWorkflow", + "path": "/references/medusa-workflows/createShippingProfilesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteFulfillmentSetsWorkflow", + "path": "/references/medusa-workflows/deleteFulfillmentSetsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteServiceZonesWorkflow", + "path": "/references/medusa-workflows/deleteServiceZonesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteShippingOptionsWorkflow", + "path": "/references/medusa-workflows/deleteShippingOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "markFulfillmentAsDeliveredWorkflow", + "path": "/references/medusa-workflows/markFulfillmentAsDeliveredWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateFulfillmentWorkflow", + "path": "/references/medusa-workflows/updateFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateShippingOptionsWorkflow", + "path": "/references/medusa-workflows/updateShippingOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateShippingProfilesWorkflow", + "path": "/references/medusa-workflows/updateShippingProfilesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderFulfillmentWorkflow", + "path": "/references/medusa-workflows/cancelOrderFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmClaimRequestWorkflow", + "path": "/references/medusa-workflows/confirmClaimRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmExchangeRequestWorkflow", + "path": "/references/medusa-workflows/confirmExchangeRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmReturnRequestWorkflow", + "path": "/references/medusa-workflows/confirmReturnRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createAndCompleteReturnOrderWorkflow", + "path": "/references/medusa-workflows/createAndCompleteReturnOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderFulfillmentWorkflow", + "path": "/references/medusa-workflows/createOrderFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderShipmentWorkflow", + "path": "/references/medusa-workflows/createOrderShipmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "markOrderFulfillmentAsDeliveredWorkflow", + "path": "/references/medusa-workflows/markOrderFulfillmentAsDeliveredWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteShippingProfileWorkflow", + "path": "/references/medusa-workflows/deleteShippingProfileWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createLocationFulfillmentSetWorkflow", + "path": "/references/medusa-workflows/createLocationFulfillmentSetWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+fulfillment", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "validateCartShippingOptionsStep", + "path": "/references/medusa-workflows/steps/validateCartShippingOptionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "calculateShippingOptionsPricesStep", + "path": "/references/medusa-workflows/steps/calculateShippingOptionsPricesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelFulfillmentStep", + "path": "/references/medusa-workflows/steps/cancelFulfillmentStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createFulfillmentSets", + "path": "/references/medusa-workflows/steps/createFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createFulfillmentStep", + "path": "/references/medusa-workflows/steps/createFulfillmentStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReturnFulfillmentStep", + "path": "/references/medusa-workflows/steps/createReturnFulfillmentStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createServiceZonesStep", + "path": "/references/medusa-workflows/steps/createServiceZonesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createShippingOptionRulesStep", + "path": "/references/medusa-workflows/steps/createShippingOptionRulesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createShippingProfilesStep", + "path": "/references/medusa-workflows/steps/createShippingProfilesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteFulfillmentSetsStep", + "path": "/references/medusa-workflows/steps/deleteFulfillmentSetsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteServiceZonesStep", + "path": "/references/medusa-workflows/steps/deleteServiceZonesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteShippingOptionRulesStep", + "path": "/references/medusa-workflows/steps/deleteShippingOptionRulesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteShippingOptionsStep", + "path": "/references/medusa-workflows/steps/deleteShippingOptionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateFulfillmentStep", + "path": "/references/medusa-workflows/steps/updateFulfillmentStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateShippingProfilesStep", + "path": "/references/medusa-workflows/steps/updateShippingProfilesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "upsertShippingOptionsStep", + "path": "/references/medusa-workflows/steps/upsertShippingOptionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "validateShipmentStep", + "path": "/references/medusa-workflows/steps/validateShipmentStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteShippingProfilesStep", + "path": "/references/medusa-workflows/steps/deleteShippingProfilesStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "References", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/fulfillment/admin-widget-zones", + "title": "Admin Widget Zones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment", + "title": "Main Service Reference", + "isChildSidebar": true, + "childSidebarTitle": "Fulfillment Module's Main Service Reference", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Methods", + "autogenerate_path": "/references/fulfillment/IFulfillmentModuleService/methods", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/calculateShippingOptionsPrices", + "title": "calculateShippingOptionsPrices", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/cancelFulfillment", + "title": "cancelFulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createFulfillment", + "title": "createFulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createFulfillmentSets", + "title": "createFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createGeoZones", + "title": "createGeoZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createReturnFulfillment", + "title": "createReturnFulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createServiceZones", + "title": "createServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createShippingOptionRules", + "title": "createShippingOptionRules", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createShippingOptions", + "title": "createShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/createShippingProfiles", + "title": "createShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteFulfillment", + "title": "deleteFulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteFulfillmentSets", + "title": "deleteFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteGeoZones", + "title": "deleteGeoZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteServiceZones", + "title": "deleteServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteShippingOptionRules", + "title": "deleteShippingOptionRules", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteShippingOptionTypes", + "title": "deleteShippingOptionTypes", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteShippingOptions", + "title": "deleteShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/deleteShippingProfiles", + "title": "deleteShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountFulfillmentSets", + "title": "listAndCountFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountFulfillments", + "title": "listAndCountFulfillments", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountGeoZones", + "title": "listAndCountGeoZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountServiceZones", + "title": "listAndCountServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountShippingOptionRules", + "title": "listAndCountShippingOptionRules", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountShippingOptionTypes", + "title": "listAndCountShippingOptionTypes", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountShippingOptions", + "title": "listAndCountShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listAndCountShippingProfiles", + "title": "listAndCountShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listFulfillmentProviders", + "title": "listFulfillmentProviders", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listFulfillmentSets", + "title": "listFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listFulfillments", + "title": "listFulfillments", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listGeoZones", + "title": "listGeoZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listServiceZones", + "title": "listServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listShippingOptionRules", + "title": "listShippingOptionRules", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listShippingOptionTypes", + "title": "listShippingOptionTypes", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listShippingOptions", + "title": "listShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listShippingOptionsForContext", + "title": "listShippingOptionsForContext", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/listShippingProfiles", + "title": "listShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/restoreFulfillmentSets", + "title": "restoreFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/restoreGeoZones", + "title": "restoreGeoZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/restoreServiceZones", + "title": "restoreServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/restoreShippingOptions", + "title": "restoreShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/restoreShippingProfiles", + "title": "restoreShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveFulfillment", + "title": "retrieveFulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveFulfillmentOptions", + "title": "retrieveFulfillmentOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveFulfillmentSet", + "title": "retrieveFulfillmentSet", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveGeoZone", + "title": "retrieveGeoZone", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveServiceZone", + "title": "retrieveServiceZone", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveShippingOption", + "title": "retrieveShippingOption", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveShippingOptionRule", + "title": "retrieveShippingOptionRule", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveShippingOptionType", + "title": "retrieveShippingOptionType", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/retrieveShippingProfile", + "title": "retrieveShippingProfile", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/softDeleteFulfillmentSets", + "title": "softDeleteFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/softDeleteGeoZones", + "title": "softDeleteGeoZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/softDeleteServiceZones", + "title": "softDeleteServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/softDeleteShippingOptions", + "title": "softDeleteShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/softDeleteShippingProfiles", + "title": "softDeleteShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/updateFulfillment", + "title": "updateFulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/updateFulfillmentSets", + "title": "updateFulfillmentSets", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/updateGeoZones", + "title": "updateGeoZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/updateServiceZones", + "title": "updateServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/updateShippingOptionRules", + "title": "updateShippingOptionRules", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/updateShippingOptions", + "title": "updateShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/updateShippingProfiles", + "title": "updateShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/upsertServiceZones", + "title": "upsertServiceZones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/upsertShippingOptions", + "title": "upsertShippingOptions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/upsertShippingProfiles", + "title": "upsertShippingProfiles", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/validateFulfillmentData", + "title": "validateFulfillmentData", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/validateFulfillmentOption", + "title": "validateFulfillmentOption", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/validateShippingOption", + "title": "validateShippingOption", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/validateShippingOptionsForPriceCalculation", + "title": "validateShippingOptionsForPriceCalculation", + "children": [] + } + ] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models", + "title": "Data Models Reference", + "isChildSidebar": true, + "childSidebarTitle": "Fulfillment Module Data Models Reference", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Data Models", + "hasTitleStyling": true, + "autogenerate_path": "/references/fulfillment_models/variables", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/Fulfillment", + "title": "Fulfillment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/FulfillmentAddress", + "title": "FulfillmentAddress", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/FulfillmentItem", + "title": "FulfillmentItem", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/FulfillmentLabel", + "title": "FulfillmentLabel", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/FulfillmentProvider", + "title": "FulfillmentProvider", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/FulfillmentSet", + "title": "FulfillmentSet", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/GeoZone", + "title": "GeoZone", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/ServiceZone", + "title": "ServiceZone", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/ShippingOption", + "title": "ShippingOption", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/ShippingOptionRule", + "title": "ShippingOptionRule", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/ShippingOptionType", + "title": "ShippingOptionType", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/fulfillment/models/ShippingProfile", + "title": "ShippingProfile", + "children": [] + } + ] + } + ] + } + ] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Inventory Module", + "isChildSidebar": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/inventory", + "title": "Overview", + "children": [] + }, + { + "type": "separator" + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/inventory/concepts", + "title": "Inventory Concepts", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/inventory/inventory-in-flows", + "title": "Inventory in Flows", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/inventory/links-to-other-modules", + "title": "Links to Modules", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+inventory", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Product Variant's Inventory in Storefront", + "path": "/storefront-development/products/inventory", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+inventory", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addToCartWorkflow", + "path": "/references/medusa-workflows/addToCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmVariantInventoryWorkflow", + "path": "/references/medusa-workflows/confirmVariantInventoryWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateLineItemInCartWorkflow", + "path": "/references/medusa-workflows/updateLineItemInCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "bulkCreateDeleteLevelsWorkflow", + "path": "/references/medusa-workflows/bulkCreateDeleteLevelsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createInventoryItemsWorkflow", + "path": "/references/medusa-workflows/createInventoryItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createInventoryLevelsWorkflow", + "path": "/references/medusa-workflows/createInventoryLevelsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteInventoryItemWorkflow", + "path": "/references/medusa-workflows/deleteInventoryItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateInventoryItemsWorkflow", + "path": "/references/medusa-workflows/updateInventoryItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateInventoryLevelsWorkflow", + "path": "/references/medusa-workflows/updateInventoryLevelsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addOrderLineItemsWorkflow", + "path": "/references/medusa-workflows/addOrderLineItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderClaimWorkflow", + "path": "/references/medusa-workflows/cancelOrderClaimWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderExchangeWorkflow", + "path": "/references/medusa-workflows/cancelOrderExchangeWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderFulfillmentWorkflow", + "path": "/references/medusa-workflows/cancelOrderFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderWorkflow", + "path": "/references/medusa-workflows/cancelOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmClaimRequestWorkflow", + "path": "/references/medusa-workflows/confirmClaimRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmExchangeRequestWorkflow", + "path": "/references/medusa-workflows/confirmExchangeRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmOrderEditRequestWorkflow", + "path": "/references/medusa-workflows/confirmOrderEditRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmReturnReceiveWorkflow", + "path": "/references/medusa-workflows/confirmReturnReceiveWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderFulfillmentWorkflow", + "path": "/references/medusa-workflows/createOrderFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderWorkflow", + "path": "/references/medusa-workflows/createOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderClaimAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderEditAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderExchangeAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchProductVariantsWorkflow", + "path": "/references/medusa-workflows/batchProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchProductsWorkflow", + "path": "/references/medusa-workflows/batchProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductVariantsWorkflow", + "path": "/references/medusa-workflows/createProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductsWorkflow", + "path": "/references/medusa-workflows/createProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductVariantsWorkflow", + "path": "/references/medusa-workflows/deleteProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductsWorkflow", + "path": "/references/medusa-workflows/deleteProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReservationsWorkflow", + "path": "/references/medusa-workflows/createReservationsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteReservationsByLineItemsWorkflow", + "path": "/references/medusa-workflows/deleteReservationsByLineItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteReservationsWorkflow", + "path": "/references/medusa-workflows/deleteReservationsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateReservationsWorkflow", + "path": "/references/medusa-workflows/updateReservationsWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+inventory", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmInventoryStep", + "path": "/references/medusa-workflows/steps/confirmInventoryStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "reserveInventoryStep", + "path": "/references/medusa-workflows/steps/reserveInventoryStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "adjustInventoryLevelsStep", + "path": "/references/medusa-workflows/steps/adjustInventoryLevelsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createInventoryItemsStep", + "path": "/references/medusa-workflows/steps/createInventoryItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createInventoryLevelsStep", + "path": "/references/medusa-workflows/steps/createInventoryLevelsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteInventoryItemStep", + "path": "/references/medusa-workflows/steps/deleteInventoryItemStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateInventoryItemsStep", + "path": "/references/medusa-workflows/steps/updateInventoryItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateInventoryLevelsStep", + "path": "/references/medusa-workflows/steps/updateInventoryLevelsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReservationsStep", + "path": "/references/medusa-workflows/steps/createReservationsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteReservationsByLineItemsStep", + "path": "/references/medusa-workflows/steps/deleteReservationsByLineItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteReservationsStep", + "path": "/references/medusa-workflows/steps/deleteReservationsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateReservationsStep", + "path": "/references/medusa-workflows/steps/updateReservationsStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "References", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/inventory/admin-widget-zones", + "title": "Admin Widget Zones", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next", + "title": "Main Service Reference", + "isChildSidebar": true, + "childSidebarTitle": "Inventory Module's Main Service Reference", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Methods", + "autogenerate_path": "/references/inventory_next/IInventoryService/methods", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/adjustInventory", + "title": "adjustInventory", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/confirmInventory", + "title": "confirmInventory", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/createInventoryItems", + "title": "createInventoryItems", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/createInventoryLevels", + "title": "createInventoryLevels", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/createReservationItems", + "title": "createReservationItems", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/deleteInventoryItemLevelByLocationId", + "title": "deleteInventoryItemLevelByLocationId", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/deleteInventoryItems", + "title": "deleteInventoryItems", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/deleteInventoryLevel", + "title": "deleteInventoryLevel", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/deleteInventoryLevels", + "title": "deleteInventoryLevels", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/deleteReservationItemByLocationId", + "title": "deleteReservationItemByLocationId", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/deleteReservationItems", + "title": "deleteReservationItems", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/deleteReservationItemsByLineItem", + "title": "deleteReservationItemsByLineItem", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/listAndCountInventoryItems", + "title": "listAndCountInventoryItems", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/listAndCountInventoryLevels", + "title": "listAndCountInventoryLevels", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, "type": "link", "path": "/references/inventory-next/listAndCountReservationItems", "title": "listAndCountReservationItems", @@ -2941,158 +4691,1179 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/models", - "title": "Data Models Reference", - "isChildSidebar": true, - "childSidebarTitle": "Inventory Module Data Models Reference", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Data Models", - "autogenerate_path": "/references/inventory_next_models/variables", - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/models/InventoryItem", - "title": "InventoryItem", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/models/InventoryLevel", - "title": "InventoryLevel", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/references/inventory-next/models/ReservationItem", - "title": "ReservationItem", - "children": [] - } - ] - } - ] + "type": "link", + "path": "/references/inventory-next/models", + "title": "Data Models Reference", + "isChildSidebar": true, + "childSidebarTitle": "Inventory Module Data Models Reference", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Data Models", + "autogenerate_path": "/references/inventory_next_models/variables", + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/models/InventoryItem", + "title": "InventoryItem", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/models/InventoryLevel", + "title": "InventoryLevel", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/inventory-next/models/ReservationItem", + "title": "ReservationItem", + "children": [] + } + ] + } + ] + } + ] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Order Module", + "isChildSidebar": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order", + "title": "Overview", + "children": [] + }, + { + "type": "separator" + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/concepts", + "title": "Order Concepts", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/promotion-adjustments", + "title": "Promotions Adjustments", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/tax-lines", + "title": "Tax Lines", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/transactions", + "title": "Transactions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/order-versioning", + "title": "Order Versioning", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/return", + "title": "Return", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/exchange", + "title": "Exchange", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/claim", + "title": "Claim", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/edit", + "title": "Order Edit", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/order-change", + "title": "Order Change", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/order/links-to-other-modules", + "title": "Links to Other Modules", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+order", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 5: Complete Cart", + "path": "/storefront-development/checkout/complete-cart", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+order", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "acceptOrderTransferWorkflow", + "path": "/references/medusa-workflows/acceptOrderTransferWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addOrderLineItemsWorkflow", + "path": "/references/medusa-workflows/addOrderLineItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "archiveOrderWorkflow", + "path": "/references/medusa-workflows/archiveOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "beginClaimOrderWorkflow", + "path": "/references/medusa-workflows/beginClaimOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "beginExchangeOrderWorkflow", + "path": "/references/medusa-workflows/beginExchangeOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "beginOrderEditOrderWorkflow", + "path": "/references/medusa-workflows/beginOrderEditOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "beginReceiveReturnWorkflow", + "path": "/references/medusa-workflows/beginReceiveReturnWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "beginReturnOrderWorkflow", + "path": "/references/medusa-workflows/beginReturnOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelBeginOrderClaimWorkflow", + "path": "/references/medusa-workflows/cancelBeginOrderClaimWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelBeginOrderEditWorkflow", + "path": "/references/medusa-workflows/cancelBeginOrderEditWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelBeginOrderExchangeWorkflow", + "path": "/references/medusa-workflows/cancelBeginOrderExchangeWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderChangeWorkflow", + "path": "/references/medusa-workflows/cancelOrderChangeWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderClaimWorkflow", + "path": "/references/medusa-workflows/cancelOrderClaimWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderExchangeWorkflow", + "path": "/references/medusa-workflows/cancelOrderExchangeWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderFulfillmentWorkflow", + "path": "/references/medusa-workflows/cancelOrderFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderTransferRequestWorkflow", + "path": "/references/medusa-workflows/cancelOrderTransferRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderWorkflow", + "path": "/references/medusa-workflows/cancelOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelReturnReceiveWorkflow", + "path": "/references/medusa-workflows/cancelReturnReceiveWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelReturnRequestWorkflow", + "path": "/references/medusa-workflows/cancelReturnRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelReturnWorkflow", + "path": "/references/medusa-workflows/cancelReturnWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "completeOrderWorkflow", + "path": "/references/medusa-workflows/completeOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmClaimRequestWorkflow", + "path": "/references/medusa-workflows/confirmClaimRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmExchangeRequestWorkflow", + "path": "/references/medusa-workflows/confirmExchangeRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmOrderEditRequestWorkflow", + "path": "/references/medusa-workflows/confirmOrderEditRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmReturnReceiveWorkflow", + "path": "/references/medusa-workflows/confirmReturnReceiveWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "confirmReturnRequestWorkflow", + "path": "/references/medusa-workflows/confirmReturnRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createAndCompleteReturnOrderWorkflow", + "path": "/references/medusa-workflows/createAndCompleteReturnOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createClaimShippingMethodWorkflow", + "path": "/references/medusa-workflows/createClaimShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createExchangeShippingMethodWorkflow", + "path": "/references/medusa-workflows/createExchangeShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderChangeWorkflow", + "path": "/references/medusa-workflows/createOrderChangeWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderEditShippingMethodWorkflow", + "path": "/references/medusa-workflows/createOrderEditShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderFulfillmentWorkflow", + "path": "/references/medusa-workflows/createOrderFulfillmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderShipmentWorkflow", + "path": "/references/medusa-workflows/createOrderShipmentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderWorkflow", + "path": "/references/medusa-workflows/createOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReturnShippingMethodWorkflow", + "path": "/references/medusa-workflows/createReturnShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "declineOrderChangeWorkflow", + "path": "/references/medusa-workflows/declineOrderChangeWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "declineOrderTransferRequestWorkflow", + "path": "/references/medusa-workflows/declineOrderTransferRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteOrderChangeActionsWorkflow", + "path": "/references/medusa-workflows/deleteOrderChangeActionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteOrderChangeWorkflow", + "path": "/references/medusa-workflows/deleteOrderChangeWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "dismissItemReturnRequestWorkflow", + "path": "/references/medusa-workflows/dismissItemReturnRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "markPaymentCollectionAsPaid", + "path": "/references/medusa-workflows/markPaymentCollectionAsPaid", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderClaimAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimItemWorkflow", + "path": "/references/medusa-workflows/orderClaimItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimRequestItemReturnWorkflow", + "path": "/references/medusa-workflows/orderClaimRequestItemReturnWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderEditAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditUpdateItemQuantityWorkflow", + "path": "/references/medusa-workflows/orderEditUpdateItemQuantityWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderExchangeAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeRequestItemReturnWorkflow", + "path": "/references/medusa-workflows/orderExchangeRequestItemReturnWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "receiveItemReturnRequestWorkflow", + "path": "/references/medusa-workflows/receiveItemReturnRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeAddItemClaimActionWorkflow", + "path": "/references/medusa-workflows/removeAddItemClaimActionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeClaimShippingMethodWorkflow", + "path": "/references/medusa-workflows/removeClaimShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeExchangeShippingMethodWorkflow", + "path": "/references/medusa-workflows/removeExchangeShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeItemClaimActionWorkflow", + "path": "/references/medusa-workflows/removeItemClaimActionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeItemExchangeActionWorkflow", + "path": "/references/medusa-workflows/removeItemExchangeActionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeItemOrderEditActionWorkflow", + "path": "/references/medusa-workflows/removeItemOrderEditActionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeItemReceiveReturnActionWorkflow", + "path": "/references/medusa-workflows/removeItemReceiveReturnActionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeItemReturnActionWorkflow", + "path": "/references/medusa-workflows/removeItemReturnActionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeOrderEditShippingMethodWorkflow", + "path": "/references/medusa-workflows/removeOrderEditShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeReturnShippingMethodWorkflow", + "path": "/references/medusa-workflows/removeReturnShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "requestItemReturnWorkflow", + "path": "/references/medusa-workflows/requestItemReturnWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "requestOrderEditRequestWorkflow", + "path": "/references/medusa-workflows/requestOrderEditRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "requestOrderTransferWorkflow", + "path": "/references/medusa-workflows/requestOrderTransferWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateClaimAddItemWorkflow", + "path": "/references/medusa-workflows/updateClaimAddItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateClaimItemWorkflow", + "path": "/references/medusa-workflows/updateClaimItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateClaimShippingMethodWorkflow", + "path": "/references/medusa-workflows/updateClaimShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateExchangeAddItemWorkflow", + "path": "/references/medusa-workflows/updateExchangeAddItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateExchangeShippingMethodWorkflow", + "path": "/references/medusa-workflows/updateExchangeShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderChangeActionsWorkflow", + "path": "/references/medusa-workflows/updateOrderChangeActionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderChangesWorkflow", + "path": "/references/medusa-workflows/updateOrderChangesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderEditAddItemWorkflow", + "path": "/references/medusa-workflows/updateOrderEditAddItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderEditItemQuantityWorkflow", + "path": "/references/medusa-workflows/updateOrderEditItemQuantityWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderEditShippingMethodWorkflow", + "path": "/references/medusa-workflows/updateOrderEditShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderTaxLinesWorkflow", + "path": "/references/medusa-workflows/updateOrderTaxLinesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderWorkflow", + "path": "/references/medusa-workflows/updateOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateReceiveItemReturnRequestWorkflow", + "path": "/references/medusa-workflows/updateReceiveItemReturnRequestWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateRequestItemReturnWorkflow", + "path": "/references/medusa-workflows/updateRequestItemReturnWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateReturnShippingMethodWorkflow", + "path": "/references/medusa-workflows/updateReturnShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateReturnWorkflow", + "path": "/references/medusa-workflows/updateReturnWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "capturePaymentWorkflow", + "path": "/references/medusa-workflows/capturePaymentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "processPaymentWorkflow", + "path": "/references/medusa-workflows/processPaymentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "refundPaymentWorkflow", + "path": "/references/medusa-workflows/refundPaymentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReturnReasonsWorkflow", + "path": "/references/medusa-workflows/createReturnReasonsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteReturnReasonsWorkflow", + "path": "/references/medusa-workflows/deleteReturnReasonsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateReturnReasonsWorkflow", + "path": "/references/medusa-workflows/updateReturnReasonsWorkflow", + "children": [] } ] - } - ] - }, - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Order Module", - "isChildSidebar": true, - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order", - "title": "Overview", - "children": [] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+order", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/concepts", - "title": "Order Concepts", + "type": "ref", + "title": "addOrderTransactionStep", + "path": "/references/medusa-workflows/steps/addOrderTransactionStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "archiveOrdersStep", + "path": "/references/medusa-workflows/steps/archiveOrdersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderChangeStep", + "path": "/references/medusa-workflows/steps/cancelOrderChangeStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderClaimStep", + "path": "/references/medusa-workflows/steps/cancelOrderClaimStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderExchangeStep", + "path": "/references/medusa-workflows/steps/cancelOrderExchangeStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderFulfillmentStep", + "path": "/references/medusa-workflows/steps/cancelOrderFulfillmentStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderReturnStep", + "path": "/references/medusa-workflows/steps/cancelOrderReturnStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrdersStep", + "path": "/references/medusa-workflows/steps/cancelOrdersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "completeOrdersStep", + "path": "/references/medusa-workflows/steps/completeOrdersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCompleteReturnStep", + "path": "/references/medusa-workflows/steps/createCompleteReturnStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderChangeStep", + "path": "/references/medusa-workflows/steps/createOrderChangeStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderClaimItemsFromActionsStep", + "path": "/references/medusa-workflows/steps/createOrderClaimItemsFromActionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderClaimsStep", + "path": "/references/medusa-workflows/steps/createOrderClaimsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderExchangeItemsFromActionsStep", + "path": "/references/medusa-workflows/steps/createOrderExchangeItemsFromActionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderExchangesStep", + "path": "/references/medusa-workflows/steps/createOrderExchangesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderLineItemsStep", + "path": "/references/medusa-workflows/steps/createOrderLineItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrdersStep", + "path": "/references/medusa-workflows/steps/createOrdersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReturnsStep", + "path": "/references/medusa-workflows/steps/createReturnsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "declineOrderChangeStep", + "path": "/references/medusa-workflows/steps/declineOrderChangeStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/promotion-adjustments", - "title": "Promotions Adjustments", + "type": "ref", + "title": "deleteClaimsStep", + "path": "/references/medusa-workflows/steps/deleteClaimsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/tax-lines", - "title": "Tax Lines", + "type": "ref", + "title": "deleteExchangesStep", + "path": "/references/medusa-workflows/steps/deleteExchangesStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/transactions", - "title": "Transactions", + "type": "ref", + "title": "deleteOrderChangeActionsStep", + "path": "/references/medusa-workflows/steps/deleteOrderChangeActionsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/order-versioning", - "title": "Order Versioning", + "type": "ref", + "title": "deleteOrderChangesStep", + "path": "/references/medusa-workflows/steps/deleteOrderChangesStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/return", - "title": "Return", + "type": "ref", + "title": "deleteOrderShippingMethods", + "path": "/references/medusa-workflows/steps/deleteOrderShippingMethods", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/exchange", - "title": "Exchange", + "type": "ref", + "title": "deleteReturnsStep", + "path": "/references/medusa-workflows/steps/deleteReturnsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/claim", - "title": "Claim", + "type": "ref", + "title": "previewOrderChangeStep", + "path": "/references/medusa-workflows/steps/previewOrderChangeStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/edit", - "title": "Order Edit", + "type": "ref", + "title": "registerOrderChangesStep", + "path": "/references/medusa-workflows/steps/registerOrderChangesStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/order-change", - "title": "Order Change", + "type": "ref", + "title": "registerOrderFulfillmentStep", + "path": "/references/medusa-workflows/steps/registerOrderFulfillmentStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/order/links-to-other-modules", - "title": "Links to Other Modules", + "type": "ref", + "title": "registerOrderShipmentStep", + "path": "/references/medusa-workflows/steps/registerOrderShipmentStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "setOrderTaxLinesForItemsStep", + "path": "/references/medusa-workflows/steps/setOrderTaxLinesForItemsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderChangeActionsStep", + "path": "/references/medusa-workflows/steps/updateOrderChangeActionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderChangesStep", + "path": "/references/medusa-workflows/steps/updateOrderChangesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderExchangesStep", + "path": "/references/medusa-workflows/steps/updateOrderExchangesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderShippingMethodsStep", + "path": "/references/medusa-workflows/steps/updateOrderShippingMethodsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrdersStep", + "path": "/references/medusa-workflows/steps/updateOrdersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReturnReasonsStep", + "path": "/references/medusa-workflows/steps/createReturnReasonsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteReturnReasonStep", + "path": "/references/medusa-workflows/steps/deleteReturnReasonStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateReturnReasonsStep", + "path": "/references/medusa-workflows/steps/updateReturnReasonsStep", "children": [] } ] @@ -3100,8 +5871,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -4419,90 +7191,338 @@ export const generatedSidebar = [ "title": "Module Options", "children": [] }, + { + "type": "separator" + }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/examples", - "title": "Examples", - "children": [] + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/payment/payment-collection", + "title": "Payment Collections", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/payment/payment-session", + "title": "Payment Session", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/payment/payment", + "title": "Payment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/payment/payment-provider", + "title": "Payment Provider Module", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/payment/webhook-events", + "title": "Webhook Events", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/payment/links-to-other-modules", + "title": "Links to Other Modules", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+payment", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/payment/payment-flow", + "title": "Accept Payment Flow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/payment/provider", + "title": "Create Payment Provider", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+payment", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Customize the Stripe Integration in the Next.js Starter", + "path": "/nextjs-starter/guides/customize-stripe", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 5: Complete Cart", + "path": "/storefront-development/checkout/complete-cart", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Checkout Step 4: Choose Payment Provider", + "path": "/storefront-development/checkout/payment", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Payment with Stripe in React Storefront", + "path": "/storefront-development/checkout/payment/stripe", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+payment", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPaymentCollectionForCartWorkflow", + "path": "/references/medusa-workflows/createPaymentCollectionForCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "refreshPaymentCollectionForCartWorkflow", + "path": "/references/medusa-workflows/refreshPaymentCollectionForCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "cancelOrderWorkflow", + "path": "/references/medusa-workflows/cancelOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderPaymentCollectionWorkflow", + "path": "/references/medusa-workflows/createOrderPaymentCollectionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "markPaymentCollectionAsPaid", + "path": "/references/medusa-workflows/markPaymentCollectionAsPaid", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "capturePaymentWorkflow", + "path": "/references/medusa-workflows/capturePaymentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "processPaymentWorkflow", + "path": "/references/medusa-workflows/processPaymentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "refundPaymentWorkflow", + "path": "/references/medusa-workflows/refundPaymentWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPaymentSessionsWorkflow", + "path": "/references/medusa-workflows/createPaymentSessionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createRefundReasonsWorkflow", + "path": "/references/medusa-workflows/createRefundReasonsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deletePaymentSessionsWorkflow", + "path": "/references/medusa-workflows/deletePaymentSessionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateRefundReasonsWorkflow", + "path": "/references/medusa-workflows/updateRefundReasonsWorkflow", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+payment", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/payment-collection", - "title": "Payment Collections", + "type": "ref", + "title": "createPaymentCollectionsStep", + "path": "/references/medusa-workflows/steps/createPaymentCollectionsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/payment-session", - "title": "Payment Session", + "type": "ref", + "title": "authorizePaymentSessionStep", + "path": "/references/medusa-workflows/steps/authorizePaymentSessionStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/payment", - "title": "Payment", + "type": "ref", + "title": "cancelPaymentStep", + "path": "/references/medusa-workflows/steps/cancelPaymentStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/payment-provider", - "title": "Payment Provider Module", + "type": "ref", + "title": "capturePaymentStep", + "path": "/references/medusa-workflows/steps/capturePaymentStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/webhook-events", - "title": "Webhook Events", + "type": "ref", + "title": "refundPaymentStep", + "path": "/references/medusa-workflows/steps/refundPaymentStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/links-to-other-modules", - "title": "Links to Other Modules", + "type": "ref", + "title": "createPaymentSessionStep", + "path": "/references/medusa-workflows/steps/createPaymentSessionStep", "children": [] - } - ] - }, - { - "loaded": true, - "isPathHref": true, - "type": "sub-category", - "title": "Guides", - "children": [ + }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/payment/payment-flow", - "title": "Accept Payment Flow", + "type": "ref", + "title": "createRefundReasonStep", + "path": "/references/medusa-workflows/steps/createRefundReasonStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/payment/provider", - "title": "Create Payment Provider", + "type": "ref", + "title": "deletePaymentSessionsStep", + "path": "/references/medusa-workflows/steps/deletePaymentSessionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePaymentCollectionStep", + "path": "/references/medusa-workflows/steps/updatePaymentCollectionStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateRefundReasonsStep", + "path": "/references/medusa-workflows/steps/updateRefundReasonsStep", "children": [] } ] @@ -4510,8 +7530,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Payment Providers", + "type": "category", + "title": "Providers", + "initialOpen": false, "children": [ { "loaded": true, @@ -4526,8 +7547,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -4890,76 +7912,468 @@ export const generatedSidebar = [ ] } ] - } - ] - }, - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Pricing Module", - "isChildSidebar": true, - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/pricing", - "title": "Overview", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/pricing/examples", - "title": "Examples", - "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Pricing Module", + "isChildSidebar": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/pricing", + "title": "Overview", + "children": [] + }, + { + "type": "separator" + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/pricing/concepts", + "title": "Pricing Concepts", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/pricing/price-rules", + "title": "Price Rules", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/pricing/price-calculation", + "title": "Prices Calculation", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/pricing/tax-inclusive-pricing", + "title": "Tax-Inclusive Pricing", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/pricing/links-to-other-modules", + "title": "Links to Other Modules", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+pricing", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Get Variant Prices", + "path": "/commerce-modules/product/guides/price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Get Variant Price with Taxes", + "path": "/commerce-modules/product/guides/price-with-taxes", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+pricing", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Example: Show Sale Price", + "path": "/storefront-development/products/price/examples/sale-price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Example: Show Variant's Price", + "path": "/storefront-development/products/price/examples/show-price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Example: Show Price with Taxes", + "path": "/storefront-development/products/price/examples/tax-price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Product Variant's Prices in Storefront", + "path": "/storefront-development/products/price", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+pricing", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createShippingOptionsWorkflow", + "path": "/references/medusa-workflows/createShippingOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateShippingOptionsWorkflow", + "path": "/references/medusa-workflows/updateShippingOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchPriceListPricesWorkflow", + "path": "/references/medusa-workflows/batchPriceListPricesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPriceListPricesWorkflow", + "path": "/references/medusa-workflows/createPriceListPricesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPriceListsWorkflow", + "path": "/references/medusa-workflows/createPriceListsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deletePriceListsWorkflow", + "path": "/references/medusa-workflows/deletePriceListsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removePriceListPricesWorkflow", + "path": "/references/medusa-workflows/removePriceListPricesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePriceListPricesWorkflow", + "path": "/references/medusa-workflows/updatePriceListPricesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePriceListsWorkflow", + "path": "/references/medusa-workflows/updatePriceListsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPricePreferencesWorkflow", + "path": "/references/medusa-workflows/createPricePreferencesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deletePricePreferencesWorkflow", + "path": "/references/medusa-workflows/deletePricePreferencesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePricePreferencesWorkflow", + "path": "/references/medusa-workflows/updatePricePreferencesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchProductVariantsWorkflow", + "path": "/references/medusa-workflows/batchProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchProductsWorkflow", + "path": "/references/medusa-workflows/batchProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductVariantsWorkflow", + "path": "/references/medusa-workflows/createProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductsWorkflow", + "path": "/references/medusa-workflows/createProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductVariantsWorkflow", + "path": "/references/medusa-workflows/updateProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductsWorkflow", + "path": "/references/medusa-workflows/updateProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "upsertVariantPricesWorkflow", + "path": "/references/medusa-workflows/upsertVariantPricesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createRegionsWorkflow", + "path": "/references/medusa-workflows/createRegionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateRegionsWorkflow", + "path": "/references/medusa-workflows/updateRegionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createStoresWorkflow", + "path": "/references/medusa-workflows/createStoresWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateStoresWorkflow", + "path": "/references/medusa-workflows/updateStoresWorkflow", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+pricing", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/pricing/concepts", - "title": "Pricing Concepts", + "type": "ref", + "title": "createShippingOptionsPriceSetsStep", + "path": "/references/medusa-workflows/steps/createShippingOptionsPriceSetsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/pricing/price-rules", - "title": "Price Rules", + "type": "ref", + "title": "setShippingOptionsPricesStep", + "path": "/references/medusa-workflows/steps/setShippingOptionsPricesStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/pricing/price-calculation", - "title": "Prices Calculation", + "type": "ref", + "title": "createPriceListPricesStep", + "path": "/references/medusa-workflows/steps/createPriceListPricesStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/pricing/tax-inclusive-pricing", - "title": "Tax-Inclusive Pricing", + "type": "ref", + "title": "createPriceListsStep", + "path": "/references/medusa-workflows/steps/createPriceListsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/pricing/links-to-other-modules", - "title": "Links to Other Modules", + "type": "ref", + "title": "deletePriceListsStep", + "path": "/references/medusa-workflows/steps/deletePriceListsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removePriceListPricesStep", + "path": "/references/medusa-workflows/steps/removePriceListPricesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePriceListPricesStep", + "path": "/references/medusa-workflows/steps/updatePriceListPricesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePriceListsStep", + "path": "/references/medusa-workflows/steps/updatePriceListsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "validatePriceListsStep", + "path": "/references/medusa-workflows/steps/validatePriceListsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPricePreferencesStep", + "path": "/references/medusa-workflows/steps/createPricePreferencesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPriceSetsStep", + "path": "/references/medusa-workflows/steps/createPriceSetsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deletePricePreferencesStep", + "path": "/references/medusa-workflows/steps/deletePricePreferencesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePricePreferencesAsArrayStep", + "path": "/references/medusa-workflows/steps/updatePricePreferencesAsArrayStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePricePreferencesStep", + "path": "/references/medusa-workflows/steps/updatePricePreferencesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePriceSetsStep", + "path": "/references/medusa-workflows/steps/updatePriceSetsStep", "children": [] } ] @@ -4967,8 +8381,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -5420,77 +8835,628 @@ export const generatedSidebar = [ ] } ] - } - ] - }, - { - "loaded": true, - "isPathHref": true, - "type": "category", - "title": "Product Module", - "isChildSidebar": true, - "children": [ - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/product", - "title": "Overview", - "children": [] - }, - { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/product/examples", - "title": "Examples", - "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Product Module", + "isChildSidebar": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/product", + "title": "Overview", + "children": [] + }, + { + "type": "separator" + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/product/links-to-other-modules", + "title": "Links to Other Modules", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+product", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/product/extend", + "title": "Extend Module", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/product/guides/price", + "title": "Get Variant Prices", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/product/guides/price-with-taxes", + "title": "Get Variant Price with Taxes", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+product", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "List Product Categories in Storefront", + "path": "/storefront-development/products/categories/list", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Nested Categories in Storefront", + "path": "/storefront-development/products/categories/nested-categories", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve a Category's Products in Storefront", + "path": "/storefront-development/products/categories/products", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve a Category in Storefront", + "path": "/storefront-development/products/categories/retrieve", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "List Product Collections in Storefront", + "path": "/storefront-development/products/collections/list", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve a Collection's Products in Storefront", + "path": "/storefront-development/products/collections/products", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve a Collection in Storefront", + "path": "/storefront-development/products/collections/retrieve", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Product Variant's Inventory in Storefront", + "path": "/storefront-development/products/inventory", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "List Products in Storefront", + "path": "/storefront-development/products/list", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Example: Show Sale Price", + "path": "/storefront-development/products/price/examples/sale-price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Example: Show Variant's Price", + "path": "/storefront-development/products/price/examples/show-price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Example: Show Price with Taxes", + "path": "/storefront-development/products/price/examples/tax-price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve Product Variant's Prices in Storefront", + "path": "/storefront-development/products/price", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Retrieve a Product in Storefront", + "path": "/storefront-development/products/retrieve", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Select Product Variants in Storefront", + "path": "/storefront-development/products/variants", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/product/extend", - "title": "Extend Module", - "children": [] + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+product", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchLinkProductsToCollectionWorkflow", + "path": "/references/medusa-workflows/batchLinkProductsToCollectionWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchProductVariantsWorkflow", + "path": "/references/medusa-workflows/batchProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchProductsWorkflow", + "path": "/references/medusa-workflows/batchProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCollectionsWorkflow", + "path": "/references/medusa-workflows/createCollectionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductOptionsWorkflow", + "path": "/references/medusa-workflows/createProductOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductTagsWorkflow", + "path": "/references/medusa-workflows/createProductTagsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductTypesWorkflow", + "path": "/references/medusa-workflows/createProductTypesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductVariantsWorkflow", + "path": "/references/medusa-workflows/createProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductsWorkflow", + "path": "/references/medusa-workflows/createProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCollectionsWorkflow", + "path": "/references/medusa-workflows/deleteCollectionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductOptionsWorkflow", + "path": "/references/medusa-workflows/deleteProductOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductTagsWorkflow", + "path": "/references/medusa-workflows/deleteProductTagsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductTypesWorkflow", + "path": "/references/medusa-workflows/deleteProductTypesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductVariantsWorkflow", + "path": "/references/medusa-workflows/deleteProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductsWorkflow", + "path": "/references/medusa-workflows/deleteProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "importProductsWorkflow", + "path": "/references/medusa-workflows/importProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCollectionsWorkflow", + "path": "/references/medusa-workflows/updateCollectionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductOptionsWorkflow", + "path": "/references/medusa-workflows/updateProductOptionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductTagsWorkflow", + "path": "/references/medusa-workflows/updateProductTagsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductTypesWorkflow", + "path": "/references/medusa-workflows/updateProductTypesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductVariantsWorkflow", + "path": "/references/medusa-workflows/updateProductVariantsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductsWorkflow", + "path": "/references/medusa-workflows/updateProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductCategoriesWorkflow", + "path": "/references/medusa-workflows/createProductCategoriesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductCategoriesWorkflow", + "path": "/references/medusa-workflows/deleteProductCategoriesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductCategoriesWorkflow", + "path": "/references/medusa-workflows/updateProductCategoriesWorkflow", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+product", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/product/links-to-other-modules", - "title": "Links to Other Modules", + "type": "ref", + "title": "batchLinkProductsToCollectionStep", + "path": "/references/medusa-workflows/steps/batchLinkProductsToCollectionStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCollectionsStep", + "path": "/references/medusa-workflows/steps/createCollectionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductOptionsStep", + "path": "/references/medusa-workflows/steps/createProductOptionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductTagsStep", + "path": "/references/medusa-workflows/steps/createProductTagsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductTypesStep", + "path": "/references/medusa-workflows/steps/createProductTypesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductVariantsStep", + "path": "/references/medusa-workflows/steps/createProductVariantsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductsStep", + "path": "/references/medusa-workflows/steps/createProductsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCollectionsStep", + "path": "/references/medusa-workflows/steps/deleteCollectionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductOptionsStep", + "path": "/references/medusa-workflows/steps/deleteProductOptionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductTagsStep", + "path": "/references/medusa-workflows/steps/deleteProductTagsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductTypesStep", + "path": "/references/medusa-workflows/steps/deleteProductTypesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductVariantsStep", + "path": "/references/medusa-workflows/steps/deleteProductVariantsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductsStep", + "path": "/references/medusa-workflows/steps/deleteProductsStep", "children": [] - } - ] - }, - { - "loaded": true, - "isPathHref": true, - "type": "sub-category", - "title": "Guides", - "autogenerate_path": "/commerce-modules/product/guides", - "children": [ + }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/product/guides/price", - "title": "Get Variant Prices", + "type": "ref", + "title": "getProductsStep", + "path": "/references/medusa-workflows/steps/getProductsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/product/guides/price-with-taxes", - "title": "Get Variant Price with Taxes", + "type": "ref", + "title": "groupProductsForBatchStep", + "path": "/references/medusa-workflows/steps/groupProductsForBatchStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "parseProductCsvStep", + "path": "/references/medusa-workflows/steps/parseProductCsvStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCollectionsStep", + "path": "/references/medusa-workflows/steps/updateCollectionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductOptionsStep", + "path": "/references/medusa-workflows/steps/updateProductOptionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductTagsStep", + "path": "/references/medusa-workflows/steps/updateProductTagsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductTypesStep", + "path": "/references/medusa-workflows/steps/updateProductTypesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductVariantsStep", + "path": "/references/medusa-workflows/steps/updateProductVariantsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductsStep", + "path": "/references/medusa-workflows/steps/updateProductsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createProductCategoriesStep", + "path": "/references/medusa-workflows/steps/createProductCategoriesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteProductCategoriesStep", + "path": "/references/medusa-workflows/steps/deleteProductCategoriesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateProductCategoriesStep", + "path": "/references/medusa-workflows/steps/updateProductCategoriesStep", "children": [] } ] @@ -5498,8 +9464,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -6209,66 +10176,319 @@ export const generatedSidebar = [ "title": "Overview", "children": [] }, + { + "type": "separator" + }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/promotion/examples", - "title": "Examples", - "children": [] + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/promotion/concepts", + "title": "Promotion", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/promotion/application-method", + "title": "Application Method", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/promotion/campaign", + "title": "Campaign", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/promotion/actions", + "title": "Promotion Actions", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/promotion/links-to-other-modules", + "title": "Links to Modules", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/promotion/extend", - "title": "Extend Module", - "children": [] + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+promotion", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/promotion/extend", + "title": "Extend Module", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+promotion", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCartPromotionsWorkflow", + "path": "/references/medusa-workflows/updateCartPromotionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addOrRemoveCampaignPromotionsWorkflow", + "path": "/references/medusa-workflows/addOrRemoveCampaignPromotionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "batchPromotionRulesWorkflow", + "path": "/references/medusa-workflows/batchPromotionRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCampaignsWorkflow", + "path": "/references/medusa-workflows/createCampaignsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPromotionRulesWorkflow", + "path": "/references/medusa-workflows/createPromotionRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPromotionsWorkflow", + "path": "/references/medusa-workflows/createPromotionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCampaignsWorkflow", + "path": "/references/medusa-workflows/deleteCampaignsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deletePromotionRulesWorkflow", + "path": "/references/medusa-workflows/deletePromotionRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deletePromotionsWorkflow", + "path": "/references/medusa-workflows/deletePromotionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCampaignsWorkflow", + "path": "/references/medusa-workflows/updateCampaignsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePromotionRulesWorkflow", + "path": "/references/medusa-workflows/updatePromotionRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updatePromotionsWorkflow", + "path": "/references/medusa-workflows/updatePromotionsWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+promotion", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/promotion/concepts", - "title": "Promotion", + "type": "ref", + "title": "getActionsToComputeFromPromotionsStep", + "path": "/references/medusa-workflows/steps/getActionsToComputeFromPromotionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "getPromotionCodesToApply", + "path": "/references/medusa-workflows/steps/getPromotionCodesToApply", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "prepareAdjustmentsFromPromotionActionsStep", + "path": "/references/medusa-workflows/steps/prepareAdjustmentsFromPromotionActionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCartPromotionsStep", + "path": "/references/medusa-workflows/steps/updateCartPromotionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addCampaignPromotionsStep", + "path": "/references/medusa-workflows/steps/addCampaignPromotionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addRulesToPromotionsStep", + "path": "/references/medusa-workflows/steps/addRulesToPromotionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCampaignsStep", + "path": "/references/medusa-workflows/steps/createCampaignsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createPromotionsStep", + "path": "/references/medusa-workflows/steps/createPromotionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteCampaignsStep", + "path": "/references/medusa-workflows/steps/deleteCampaignsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deletePromotionsStep", + "path": "/references/medusa-workflows/steps/deletePromotionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeCampaignPromotionsStep", + "path": "/references/medusa-workflows/steps/removeCampaignPromotionsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/promotion/application-method", - "title": "Application Method", + "type": "ref", + "title": "removeRulesFromPromotionsStep", + "path": "/references/medusa-workflows/steps/removeRulesFromPromotionsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/promotion/campaign", - "title": "Campaign", + "type": "ref", + "title": "updateCampaignsStep", + "path": "/references/medusa-workflows/steps/updateCampaignsStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/promotion/actions", - "title": "Promotion Actions", + "type": "ref", + "title": "updatePromotionRulesStep", + "path": "/references/medusa-workflows/steps/updatePromotionRulesStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/promotion/links-to-other-modules", - "title": "Links to Modules", + "type": "ref", + "title": "updatePromotionsStep", + "path": "/references/medusa-workflows/steps/updatePromotionsStep", "children": [] } ] @@ -6276,8 +10496,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -6629,18 +10850,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/region/examples", - "title": "Examples", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -6655,8 +10872,202 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+region", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Region Context in Storefront", + "path": "/storefront-development/regions/context", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "List Regions in Storefront", + "path": "/storefront-development/regions/list", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Store and Retrieve Region", + "path": "/storefront-development/regions/store-retrieve-region", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+region", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addOrderLineItemsWorkflow", + "path": "/references/medusa-workflows/addOrderLineItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderWorkflow", + "path": "/references/medusa-workflows/createOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderClaimAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderEditAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderExchangeAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "exportProductsWorkflow", + "path": "/references/medusa-workflows/exportProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "importProductsWorkflow", + "path": "/references/medusa-workflows/importProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createRegionsWorkflow", + "path": "/references/medusa-workflows/createRegionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteRegionsWorkflow", + "path": "/references/medusa-workflows/deleteRegionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateRegionsWorkflow", + "path": "/references/medusa-workflows/updateRegionsWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+region", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "findOneOrAnyRegionStep", + "path": "/references/medusa-workflows/steps/findOneOrAnyRegionStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "generateProductCsvStep", + "path": "/references/medusa-workflows/steps/generateProductCsvStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "parseProductCsvStep", + "path": "/references/medusa-workflows/steps/parseProductCsvStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createRegionsStep", + "path": "/references/medusa-workflows/steps/createRegionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteRegionsStep", + "path": "/references/medusa-workflows/steps/deleteRegionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateRegionsStep", + "path": "/references/medusa-workflows/steps/updateRegionsStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -6845,34 +11256,231 @@ export const generatedSidebar = [ "title": "Overview", "children": [] }, + { + "type": "separator" + }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/sales-channel/examples", - "title": "Examples", - "children": [] + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/sales-channel/publishable-api-keys", + "title": "Publishable API Keys", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/sales-channel/links-to-other-modules", + "title": "Links to Modules", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+salesChannel", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Use a Publishable API Key in the Storefront", + "path": "/storefront-development/publishable-api-keys", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+salesChannel", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "linkSalesChannelsToApiKeyWorkflow", + "path": "/references/medusa-workflows/linkSalesChannelsToApiKeyWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCartWorkflow", + "path": "/references/medusa-workflows/updateCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createDefaultsWorkflow", + "path": "/references/medusa-workflows/createDefaultsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addOrderLineItemsWorkflow", + "path": "/references/medusa-workflows/addOrderLineItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderWorkflow", + "path": "/references/medusa-workflows/createOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderClaimAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderEditAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderExchangeAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "importProductsWorkflow", + "path": "/references/medusa-workflows/importProductsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createSalesChannelsWorkflow", + "path": "/references/medusa-workflows/createSalesChannelsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteSalesChannelsWorkflow", + "path": "/references/medusa-workflows/deleteSalesChannelsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateSalesChannelsWorkflow", + "path": "/references/medusa-workflows/updateSalesChannelsWorkflow", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+salesChannel", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/sales-channel/publishable-api-keys", - "title": "Publishable API Keys", + "type": "ref", + "title": "validateSalesChannelsExistStep", + "path": "/references/medusa-workflows/steps/validateSalesChannelsExistStep", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/sales-channel/links-to-other-modules", - "title": "Links to Modules", + "type": "ref", + "title": "findSalesChannelStep", + "path": "/references/medusa-workflows/steps/findSalesChannelStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "parseProductCsvStep", + "path": "/references/medusa-workflows/steps/parseProductCsvStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createDefaultSalesChannelStep", + "path": "/references/medusa-workflows/steps/createDefaultSalesChannelStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createSalesChannelsStep", + "path": "/references/medusa-workflows/steps/createSalesChannelsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteSalesChannelsStep", + "path": "/references/medusa-workflows/steps/deleteSalesChannelsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateSalesChannelsStep", + "path": "/references/medusa-workflows/steps/updateSalesChannelsStep", "children": [] } ] @@ -6880,8 +11488,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -7039,18 +11648,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/stock-location/examples", - "title": "Examples", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -7073,8 +11678,79 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+stockLocation", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createStockLocationsWorkflow", + "path": "/references/medusa-workflows/createStockLocationsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteStockLocationsWorkflow", + "path": "/references/medusa-workflows/deleteStockLocationsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateStockLocationsWorkflow", + "path": "/references/medusa-workflows/updateStockLocationsWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+stockLocation", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createStockLocations", + "path": "/references/medusa-workflows/steps/createStockLocations", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteStockLocationsStep", + "path": "/references/medusa-workflows/steps/deleteStockLocationsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateStockLocationsStep", + "path": "/references/medusa-workflows/steps/updateStockLocationsStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -7232,18 +11908,14 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/store/examples", - "title": "Examples", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "Concepts", + "initialOpen": false, "children": [ { "loaded": true, @@ -7258,8 +11930,167 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+store", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateCartWorkflow", + "path": "/references/medusa-workflows/updateCartWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createDefaultsWorkflow", + "path": "/references/medusa-workflows/createDefaultsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "addOrderLineItemsWorkflow", + "path": "/references/medusa-workflows/addOrderLineItemsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderWorkflow", + "path": "/references/medusa-workflows/createOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderClaimAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderEditAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderExchangeAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createStoresWorkflow", + "path": "/references/medusa-workflows/createStoresWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteStoresWorkflow", + "path": "/references/medusa-workflows/deleteStoresWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateStoresWorkflow", + "path": "/references/medusa-workflows/updateStoresWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+store", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "findOneOrAnyRegionStep", + "path": "/references/medusa-workflows/steps/findOneOrAnyRegionStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "findSalesChannelStep", + "path": "/references/medusa-workflows/steps/findSalesChannelStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createDefaultStoreStep", + "path": "/references/medusa-workflows/steps/createDefaultStoreStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createStoresStep", + "path": "/references/medusa-workflows/steps/createStoresStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteStoresStep", + "path": "/references/medusa-workflows/steps/deleteStoresStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateStoresStep", + "path": "/references/medusa-workflows/steps/updateStoresStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -7424,42 +12255,247 @@ export const generatedSidebar = [ "title": "Module Options", "children": [] }, + { + "type": "separator" + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Concepts", + "initialOpen": false, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/tax/tax-region", + "title": "Tax Region", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/tax/tax-rates-and-rules", + "title": "Tax Rates and Rules", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/commerce-modules/tax/tax-calculation-with-provider", + "title": "Tax Calculation and Providers", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+tax", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "link", + "path": "/references/tax/provider", + "title": "Tax Provider Reference", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Get Variant Price with Taxes", + "path": "/commerce-modules/product/guides/price-with-taxes", + "children": [] + } + ] + }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/tax/examples", - "title": "Examples", - "children": [] + "type": "category", + "title": "Storefront Guides", + "autogenerate_tags": "storefront+tax", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "Example: Show Price with Taxes", + "path": "/storefront-development/products/price/examples/tax-price", + "children": [] + } + ] }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Concepts", + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+tax", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/tax/tax-region", - "title": "Tax Region", + "type": "ref", + "title": "createCartWorkflow", + "path": "/references/medusa-workflows/createCartWorkflow", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/tax/tax-rates-and-rules", - "title": "Tax Rates and Rules", + "type": "ref", + "title": "updateTaxLinesWorkflow", + "path": "/references/medusa-workflows/updateTaxLinesWorkflow", "children": [] }, { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/commerce-modules/tax/tax-calculation-with-provider", - "title": "Tax Calculation and Providers", + "type": "ref", + "title": "createClaimShippingMethodWorkflow", + "path": "/references/medusa-workflows/createClaimShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createExchangeShippingMethodWorkflow", + "path": "/references/medusa-workflows/createExchangeShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderEditShippingMethodWorkflow", + "path": "/references/medusa-workflows/createOrderEditShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createOrderWorkflow", + "path": "/references/medusa-workflows/createOrderWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createReturnShippingMethodWorkflow", + "path": "/references/medusa-workflows/createReturnShippingMethodWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderClaimAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderClaimAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderEditAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderEditAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "orderExchangeAddNewItemWorkflow", + "path": "/references/medusa-workflows/orderExchangeAddNewItemWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateOrderTaxLinesWorkflow", + "path": "/references/medusa-workflows/updateOrderTaxLinesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createTaxRateRulesWorkflow", + "path": "/references/medusa-workflows/createTaxRateRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createTaxRatesWorkflow", + "path": "/references/medusa-workflows/createTaxRatesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createTaxRegionsWorkflow", + "path": "/references/medusa-workflows/createTaxRegionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteTaxRateRulesWorkflow", + "path": "/references/medusa-workflows/deleteTaxRateRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteTaxRatesWorkflow", + "path": "/references/medusa-workflows/deleteTaxRatesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteTaxRegionsWorkflow", + "path": "/references/medusa-workflows/deleteTaxRegionsWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "setTaxRateRulesWorkflow", + "path": "/references/medusa-workflows/setTaxRateRulesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateTaxRatesWorkflow", + "path": "/references/medusa-workflows/updateTaxRatesWorkflow", "children": [] } ] @@ -7467,15 +12503,82 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Guides", + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+tax", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, "isPathHref": true, - "type": "link", - "path": "/references/tax/provider", - "title": "Tax Provider Reference", + "type": "ref", + "title": "createTaxRateRulesStep", + "path": "/references/medusa-workflows/steps/createTaxRateRulesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createTaxRatesStep", + "path": "/references/medusa-workflows/steps/createTaxRatesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createTaxRegionsStep", + "path": "/references/medusa-workflows/steps/createTaxRegionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteTaxRateRulesStep", + "path": "/references/medusa-workflows/steps/deleteTaxRateRulesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteTaxRatesStep", + "path": "/references/medusa-workflows/steps/deleteTaxRatesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteTaxRegionsStep", + "path": "/references/medusa-workflows/steps/deleteTaxRegionsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "getItemTaxLinesStep", + "path": "/references/medusa-workflows/steps/getItemTaxLinesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "listTaxRateRuleIdsStep", + "path": "/references/medusa-workflows/steps/listTaxRateRuleIdsStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateTaxRatesStep", + "path": "/references/medusa-workflows/steps/updateTaxRatesStep", "children": [] } ] @@ -7483,8 +12586,9 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, @@ -7762,18 +12866,16 @@ export const generatedSidebar = [ "children": [] }, { - "loaded": true, - "isPathHref": true, - "type": "link", - "path": "/commerce-modules/user/examples", - "title": "Examples", - "children": [] + "type": "separator" }, { "loaded": true, "isPathHref": true, - "type": "sub-category", - "title": "Guides", + "type": "category", + "title": "Server Guides", + "autogenerate_tags": "server+user", + "initialOpen": false, + "autogenerate_as_ref": true, "children": [ { "loaded": true, @@ -7788,8 +12890,159 @@ export const generatedSidebar = [ { "loaded": true, "isPathHref": true, - "type": "sub-category", + "type": "category", + "title": "Workflows", + "autogenerate_tags": "workflow+user", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "acceptInviteWorkflow", + "path": "/references/medusa-workflows/acceptInviteWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createInvitesWorkflow", + "path": "/references/medusa-workflows/createInvitesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteInvitesWorkflow", + "path": "/references/medusa-workflows/deleteInvitesWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "refreshInviteTokensWorkflow", + "path": "/references/medusa-workflows/refreshInviteTokensWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createUserAccountWorkflow", + "path": "/references/medusa-workflows/createUserAccountWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createUsersWorkflow", + "path": "/references/medusa-workflows/createUsersWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteUsersWorkflow", + "path": "/references/medusa-workflows/deleteUsersWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "removeUserAccountWorkflow", + "path": "/references/medusa-workflows/removeUserAccountWorkflow", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateUsersWorkflow", + "path": "/references/medusa-workflows/updateUsersWorkflow", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", + "title": "Steps", + "autogenerate_tags": "step+user", + "initialOpen": false, + "autogenerate_as_ref": true, + "children": [ + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createInviteStep", + "path": "/references/medusa-workflows/steps/createInviteStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteInvitesStep", + "path": "/references/medusa-workflows/steps/deleteInvitesStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "refreshInviteTokensStep", + "path": "/references/medusa-workflows/steps/refreshInviteTokensStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "validateTokenStep", + "path": "/references/medusa-workflows/steps/validateTokenStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "createUsersStep", + "path": "/references/medusa-workflows/steps/createUsersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "deleteUsersStep", + "path": "/references/medusa-workflows/steps/deleteUsersStep", + "children": [] + }, + { + "loaded": true, + "isPathHref": true, + "type": "ref", + "title": "updateUsersStep", + "path": "/references/medusa-workflows/steps/updateUsersStep", + "children": [] + } + ] + }, + { + "loaded": true, + "isPathHref": true, + "type": "category", "title": "References", + "initialOpen": false, "children": [ { "loaded": true, diff --git a/www/apps/resources/scripts/prepare.mjs b/www/apps/resources/scripts/prepare.mjs index 78ee2bb6e5ff3..a9ec814a87ea8 100644 --- a/www/apps/resources/scripts/prepare.mjs +++ b/www/apps/resources/scripts/prepare.mjs @@ -1,12 +1,9 @@ import { generateEditedDates, generateSidebar } from "build-scripts" -import { generateTags } from "tags" import { main as generateSlugChanges } from "./generate-slug-changes.mjs" import { main as generateFilesMap } from "./generate-files-map.mjs" import { sidebar } from "../sidebar.mjs" -import path from "path" async function main() { - await generateTags(path.resolve("..", "..", "packages", "tags")) await generateSidebar(sidebar) await generateSlugChanges() await generateFilesMap() diff --git a/www/apps/resources/sidebars/api-key.mjs b/www/apps/resources/sidebars/api-key.mjs index aeffd5387cd81..19823e33e70b4 100644 --- a/www/apps/resources/sidebars/api-key.mjs +++ b/www/apps/resources/sidebars/api-key.mjs @@ -11,13 +11,12 @@ export const apiKeySidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/api-key/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -32,8 +31,44 @@ export const apiKeySidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Storefront Guides", + initialOpen: false, + autogenerate_tags: "storefront+apiKey", + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + initialOpen: false, + autogenerate_tags: "admin+apiKey", + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + initialOpen: false, + autogenerate_tags: "userGuide+apiKey", + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + initialOpen: false, + autogenerate_tags: "workflow+apiKey", + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + initialOpen: false, + autogenerate_tags: "step+apiKey", + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/auth.mjs b/www/apps/resources/sidebars/auth.mjs index 6f4baea84e7de..216e2c053811d 100644 --- a/www/apps/resources/sidebars/auth.mjs +++ b/www/apps/resources/sidebars/auth.mjs @@ -16,13 +16,12 @@ export const authSidebar = [ title: "Module Options", }, { - type: "link", - path: "/commerce-modules/auth/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -47,8 +46,11 @@ export const authSidebar = [ ], }, { - type: "sub-category", - title: "Guides", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+auth", + initialOpen: false, + autogenerate_as_ref: true, children: [ { type: "link", @@ -68,8 +70,44 @@ export const authSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+auth", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+auth", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+auth", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+auth", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+auth", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "Providers", + initialOpen: false, children: [ { type: "link", @@ -89,8 +127,9 @@ export const authSidebar = [ ], }, { - type: "sub-category", + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/cart.mjs b/www/apps/resources/sidebars/cart.mjs index b017109d514c6..015ffacfd1b0f 100644 --- a/www/apps/resources/sidebars/cart.mjs +++ b/www/apps/resources/sidebars/cart.mjs @@ -11,18 +11,12 @@ export const cartSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/cart/examples", - title: "Examples", - }, - { - type: "link", - path: "/commerce-modules/cart/extend", - title: "Extend Module", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -47,8 +41,58 @@ export const cartSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+cart", + initialOpen: false, + autogenerate_as_ref: true, + children: [ + { + type: "link", + path: "/commerce-modules/cart/extend", + title: "Extend Module", + }, + ], + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+cart", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+cart", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+cart", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+cart", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+cart", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/currency.mjs b/www/apps/resources/sidebars/currency.mjs index 57a53b2bc928e..f2c2796a4b388 100644 --- a/www/apps/resources/sidebars/currency.mjs +++ b/www/apps/resources/sidebars/currency.mjs @@ -11,13 +11,12 @@ export const currencySidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/currency/examples", - title: "Examples", + type: "separator", }, { type: "sub-category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -26,16 +25,59 @@ export const currencySidebar = [ }, ], }, + { + type: "category", + title: "Server Guides", + autogenerate_tags: "server+currency", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+currency", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+currency", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+currency", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+currency", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+currency", + initialOpen: false, + autogenerate_as_ref: true, + }, { type: "sub-category", title: "References", + initialOpen: false, children: [ { type: "link", path: "/references/currency", title: "Main Service Reference", isChildSidebar: true, - childSidebarTitle: "Cart Module's Main Service Reference", + childSidebarTitle: "Currency Module's Main Service Reference", children: [ { type: "category", diff --git a/www/apps/resources/sidebars/customer.mjs b/www/apps/resources/sidebars/customer.mjs index 3f1d6ec450082..25ed586ba4521 100644 --- a/www/apps/resources/sidebars/customer.mjs +++ b/www/apps/resources/sidebars/customer.mjs @@ -11,18 +11,12 @@ export const customerSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/customer/examples", - title: "Examples", - }, - { - type: "link", - path: "/commerce-modules/customer/extend", - title: "Extend Module", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -37,8 +31,58 @@ export const customerSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+customer", + initialOpen: false, + autogenerate_as_ref: true, + children: [ + { + type: "link", + path: "/commerce-modules/customer/extend", + title: "Extend Module", + }, + ], + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+customer", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+customer", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+customer", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+customer", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+customer", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/fulfillment.mjs b/www/apps/resources/sidebars/fulfillment.mjs index c46b2fec93fb6..22eda06b5b202 100644 --- a/www/apps/resources/sidebars/fulfillment.mjs +++ b/www/apps/resources/sidebars/fulfillment.mjs @@ -16,8 +16,12 @@ export const fulfillmentSidebar = [ title: "Module Options", }, { - type: "sub-category", + type: "separator", + }, + { + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -47,8 +51,11 @@ export const fulfillmentSidebar = [ ], }, { - type: "sub-category", - title: "Guides", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+fulfillment", + initialOpen: false, + autogenerate_as_ref: true, children: [ { type: "link", @@ -56,15 +63,51 @@ export const fulfillmentSidebar = [ title: "Create Fulfillment Provider Module", }, { - type: "link", + type: "ref", path: "/integrations/guides/shipstation", title: "Integrate ShipStation", }, ], }, { - type: "sub-category", + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+fulfillment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+fulfillment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+fulfillment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+fulfillment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+fulfillment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/inventory.mjs b/www/apps/resources/sidebars/inventory.mjs index 4d32a13a7546a..ed2c3d1ceafd4 100644 --- a/www/apps/resources/sidebars/inventory.mjs +++ b/www/apps/resources/sidebars/inventory.mjs @@ -11,13 +11,12 @@ export const inventorySidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/inventory/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -37,8 +36,51 @@ export const inventorySidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+inventory", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+inventory", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+inventory", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+inventory", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+inventory", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+inventory", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/order-module.mjs b/www/apps/resources/sidebars/order-module.mjs index 1142348b9fc70..911fc02eb02f8 100644 --- a/www/apps/resources/sidebars/order-module.mjs +++ b/www/apps/resources/sidebars/order-module.mjs @@ -11,8 +11,12 @@ export const orderSidebar = [ title: "Overview", }, { - type: "sub-category", + type: "separator", + }, + { + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -72,8 +76,51 @@ export const orderSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+order", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+order", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+order", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+order", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+order", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+order", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/payment.mjs b/www/apps/resources/sidebars/payment.mjs index 7e9625fd4d800..0f0b032745d34 100644 --- a/www/apps/resources/sidebars/payment.mjs +++ b/www/apps/resources/sidebars/payment.mjs @@ -16,13 +16,12 @@ export const paymentSidebar = [ title: "Module Options", }, { - type: "link", - path: "/commerce-modules/payment/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -57,8 +56,11 @@ export const paymentSidebar = [ ], }, { - type: "sub-category", - title: "Guides", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+payment", + initialOpen: false, + autogenerate_as_ref: true, children: [ { type: "link", @@ -73,8 +75,44 @@ export const paymentSidebar = [ ], }, { - type: "sub-category", - title: "Payment Providers", + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+payment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+payment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+payment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+payment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+payment", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Providers", + initialOpen: false, children: [ { type: "link", @@ -84,8 +122,9 @@ export const paymentSidebar = [ ], }, { - type: "sub-category", + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/pricing.mjs b/www/apps/resources/sidebars/pricing.mjs index 090fde1184b2a..c75402480aebf 100644 --- a/www/apps/resources/sidebars/pricing.mjs +++ b/www/apps/resources/sidebars/pricing.mjs @@ -11,13 +11,12 @@ export const pricingSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/pricing/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -47,8 +46,51 @@ export const pricingSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+pricing", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+pricing", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+pricing", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+pricing", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+pricing", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+pricing", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/product.mjs b/www/apps/resources/sidebars/product.mjs index bb2157bd33663..715b29e016253 100644 --- a/www/apps/resources/sidebars/product.mjs +++ b/www/apps/resources/sidebars/product.mjs @@ -11,18 +11,12 @@ export const productSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/product/examples", - title: "Examples", - }, - { - type: "link", - path: "/commerce-modules/product/extend", - title: "Extend Module", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -32,13 +26,68 @@ export const productSidebar = [ ], }, { - type: "sub-category", - title: "Guides", - autogenerate_path: "/commerce-modules/product/guides", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+product", + initialOpen: false, + autogenerate_as_ref: true, + children: [ + { + type: "link", + path: "/commerce-modules/product/extend", + title: "Extend Module", + }, + { + type: "link", + path: "/commerce-modules/product/guides/price", + title: "Get Variant Prices", + }, + { + type: "link", + path: "/commerce-modules/product/guides/price-with-taxes", + title: "Get Variant Price with Taxes", + }, + ], + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+product", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+product", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+product", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+product", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+product", + initialOpen: false, + autogenerate_as_ref: true, }, { - type: "sub-category", + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/promotion.mjs b/www/apps/resources/sidebars/promotion.mjs index 9072b55202cfc..d7877353cf503 100644 --- a/www/apps/resources/sidebars/promotion.mjs +++ b/www/apps/resources/sidebars/promotion.mjs @@ -11,18 +11,12 @@ export const promotionSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/promotion/examples", - title: "Examples", - }, - { - type: "link", - path: "/commerce-modules/promotion/extend", - title: "Extend Module", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -52,8 +46,58 @@ export const promotionSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+promotion", + initialOpen: false, + autogenerate_as_ref: true, + children: [ + { + type: "link", + path: "/commerce-modules/promotion/extend", + title: "Extend Module", + }, + ], + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+promotion", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+promotion", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+promotion", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+promotion", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+promotion", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/region.mjs b/www/apps/resources/sidebars/region.mjs index d8515c01cc061..0b9d93d94ee0a 100644 --- a/www/apps/resources/sidebars/region.mjs +++ b/www/apps/resources/sidebars/region.mjs @@ -11,13 +11,12 @@ export const regionSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/region/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -27,8 +26,51 @@ export const regionSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+region", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+region", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+region", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+region", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+region", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+region", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/sales-channel.mjs b/www/apps/resources/sidebars/sales-channel.mjs index de38d90b5b176..d1aa355a2a05c 100644 --- a/www/apps/resources/sidebars/sales-channel.mjs +++ b/www/apps/resources/sidebars/sales-channel.mjs @@ -11,13 +11,12 @@ export const salesChannelSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/sales-channel/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -32,8 +31,51 @@ export const salesChannelSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+salesChannel", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+salesChannel", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+salesChannel", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+salesChannel", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+salesChannel", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+salesChannel", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/stock-location.mjs b/www/apps/resources/sidebars/stock-location.mjs index daa2c277f516a..39b4cc02a3a8f 100644 --- a/www/apps/resources/sidebars/stock-location.mjs +++ b/www/apps/resources/sidebars/stock-location.mjs @@ -11,13 +11,12 @@ export const stockLocationSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/stock-location/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -32,8 +31,51 @@ export const stockLocationSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+stockLocation", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+stockLocation", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+stockLocation", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+stockLocation", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+stockLocation", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+stockLocation", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/store.mjs b/www/apps/resources/sidebars/store.mjs index 08d87591ba8f8..ecb00d450e1ad 100644 --- a/www/apps/resources/sidebars/store.mjs +++ b/www/apps/resources/sidebars/store.mjs @@ -11,13 +11,12 @@ export const storeSidebar = [ title: "Overview", }, { - type: "link", - path: "/commerce-modules/store/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -27,8 +26,51 @@ export const storeSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+store", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+store", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+store", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+store", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+store", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+store", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/tax.mjs b/www/apps/resources/sidebars/tax.mjs index 59f30262f0eb8..0aaea5b753369 100644 --- a/www/apps/resources/sidebars/tax.mjs +++ b/www/apps/resources/sidebars/tax.mjs @@ -16,13 +16,12 @@ export const taxSidebar = [ title: "Module Options", }, { - type: "link", - path: "/commerce-modules/tax/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", + type: "category", title: "Concepts", + initialOpen: false, children: [ { type: "link", @@ -42,8 +41,11 @@ export const taxSidebar = [ ], }, { - type: "sub-category", - title: "Guides", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+tax", + initialOpen: false, + autogenerate_as_ref: true, children: [ { type: "link", @@ -53,8 +55,44 @@ export const taxSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+tax", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+tax", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+tax", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+tax", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+tax", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/apps/resources/sidebars/user.mjs b/www/apps/resources/sidebars/user.mjs index 7bd33cbc12a8a..a8144829a4bbc 100644 --- a/www/apps/resources/sidebars/user.mjs +++ b/www/apps/resources/sidebars/user.mjs @@ -16,13 +16,14 @@ export const userSidebar = [ title: "Module Options", }, { - type: "link", - path: "/commerce-modules/user/examples", - title: "Examples", + type: "separator", }, { - type: "sub-category", - title: "Guides", + type: "category", + title: "Server Guides", + autogenerate_tags: "server+user", + initialOpen: false, + autogenerate_as_ref: true, children: [ { type: "link", @@ -32,8 +33,44 @@ export const userSidebar = [ ], }, { - type: "sub-category", + type: "category", + title: "Storefront Guides", + autogenerate_tags: "storefront+user", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Admin Guides", + autogenerate_tags: "admin+user", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "User Guides", + autogenerate_tags: "userGuides+user", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Workflows", + autogenerate_tags: "workflow+user", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", + title: "Steps", + autogenerate_tags: "step+user", + initialOpen: false, + autogenerate_as_ref: true, + }, + { + type: "category", title: "References", + initialOpen: false, children: [ { type: "link", diff --git a/www/packages/build-scripts/src/generate-sidebar.ts b/www/packages/build-scripts/src/generate-sidebar.ts index 35ff3379c4dc5..a7bd54137a1c9 100644 --- a/www/packages/build-scripts/src/generate-sidebar.ts +++ b/www/packages/build-scripts/src/generate-sidebar.ts @@ -88,23 +88,35 @@ async function getAutogeneratedSidebarItems( } async function getAutogeneratedTagSidebarItems( - tags: string + tags: string, + type: "link" | "ref", + existingChildren?: RawSidebarItem[] ): Promise { const items: ItemsToAdd[] = [] const parsedTags = parseTags(tags) items.push( - ...parsedTags.map( - (tagItem) => - ({ - type: "link", - ...tagItem, - }) as ItemsToAdd - ) + ...parsedTags + .filter((tagItem) => { + return existingChildren?.every((existingItem) => { + if (existingItem.type !== "link" && existingItem.type !== "ref") { + return true + } + + return existingItem.path !== tagItem.path + }) + }) + .map( + (tagItem) => + ({ + type, + ...tagItem, + }) as ItemsToAdd + ) ) - return sidebarAttachHrefCommonOptions(items) + return sidebarAttachHrefCommonOptions([...(existingChildren || []), ...items]) } async function checkItem(item: RawSidebarItem): Promise { @@ -130,7 +142,9 @@ async function checkItem(item: RawSidebarItem): Promise { }) } else if (item.autogenerate_tags) { item.children = await getAutogeneratedTagSidebarItems( - item.autogenerate_tags + item.autogenerate_tags, + item.autogenerate_as_ref ? "ref" : "link", + item.children ) } else if ( item.custom_autogenerate && @@ -138,21 +152,29 @@ async function checkItem(item: RawSidebarItem): Promise { ) { item.children = await customGenerators[item.custom_autogenerate]() } else if (item.children) { - item.children = await Promise.all( - item.children.map(async (childItem) => await checkItem(childItem)) - ) + item.children = await checkItems(item.children) } return item } +async function checkItems(items: RawSidebarItem[]): Promise { + return ( + await Promise.all(items.map(async (item) => await checkItem(item))) + ).filter((item) => { + if (item.type !== "category" && item.type !== "sub-category") { + return true + } + + return (item.children?.length || 0) > 0 + }) +} + export async function generateSidebar(sidebar: RawSidebarItem[]) { const path = await import("path") const { writeFileSync } = await import("fs") - const normalizedSidebar = await Promise.all( - sidebar.map(async (item) => await checkItem(item)) - ) + const normalizedSidebar = await checkItems(sidebar) const generatedDirPath = path.resolve("generated") diff --git a/www/packages/build-scripts/src/utils/parse-tags.ts b/www/packages/build-scripts/src/utils/parse-tags.ts index ba4ac77874bed..710ff825edca9 100644 --- a/www/packages/build-scripts/src/utils/parse-tags.ts +++ b/www/packages/build-scripts/src/utils/parse-tags.ts @@ -27,14 +27,11 @@ const getIntersectionTags = (tags: string): Tag => { .map((tagName) => getTagItems(tagName)) .filter((tag) => tag !== undefined) as Tag[] - if (!tagsToIntersect.length) { + if (tagsToIntersect.length < 2) { + // if there are less than 2 tags to intersect, return an empty array return [] } - if (tagsToIntersect.length === 1) { - return tagsToIntersect[0] - } - return tagsToIntersect[0].filter((tagItem) => { return tagsToIntersect .slice(1) diff --git a/www/packages/docs-ui/src/components/Breadcrumbs/index.tsx b/www/packages/docs-ui/src/components/Breadcrumbs/index.tsx index 4c5476abef5e5..e794c9f34c5ea 100644 --- a/www/packages/docs-ui/src/components/Breadcrumbs/index.tsx +++ b/www/packages/docs-ui/src/components/Breadcrumbs/index.tsx @@ -4,7 +4,12 @@ import React, { useMemo } from "react" import clsx from "clsx" import Link from "next/link" import { SidebarItemLink } from "types" -import { CurrentItemsState, useSidebar, useSiteConfig } from "../../providers" +import { + CurrentItemsState, + isSidebarItemLink, + useSidebar, + useSiteConfig, +} from "../../providers" import { Button } from "../Button" import { TriangleRightMini } from "@medusajs/icons" @@ -29,22 +34,20 @@ export const Breadcrumbs = () => { tempBreadcrumbItems = getBreadcrumbsOfItem(item.previousSidebar) } - const parentPath = - item.parentItem?.type === "link" - ? getLinkPath(item.parentItem) - : (item.parentItem?.type === "category" && - breadcrumbOptions?.showCategories) || - item.parentItem?.type === "sub-category" - ? "#" - : undefined - const firstItemPath = - item.default[0].type === "link" - ? getLinkPath(item.default[0]) - : (item.default[0].type === "category" && - breadcrumbOptions?.showCategories) || - item.default[0].type === "sub-category" - ? "#" - : undefined + const parentPath = isSidebarItemLink(item.parentItem) + ? getLinkPath(item.parentItem) + : (item.parentItem?.type === "category" && + breadcrumbOptions?.showCategories) || + item.parentItem?.type === "sub-category" + ? "#" + : undefined + const firstItemPath = isSidebarItemLink(item.default[0]) + ? getLinkPath(item.default[0]) + : (item.default[0].type === "category" && + breadcrumbOptions?.showCategories) || + item.default[0].type === "sub-category" + ? "#" + : undefined const breadcrumbPath = parentPath || firstItemPath || "/" @@ -76,7 +79,7 @@ export const Breadcrumbs = () => { breadcrumbOptions?.showCategories) ) { tempBreadcrumbItems.set( - sidebarActiveItem.parentItem.type === "link" + isSidebarItemLink(sidebarActiveItem.parentItem) ? getLinkPath(sidebarActiveItem.parentItem) || "#" : "#", sidebarActiveItem.parentItem.chapterTitle || diff --git a/www/packages/docs-ui/src/components/ChildDocs/index.tsx b/www/packages/docs-ui/src/components/ChildDocs/index.tsx index 9e3e23563f7cb..724c3748ed381 100644 --- a/www/packages/docs-ui/src/components/ChildDocs/index.tsx +++ b/www/packages/docs-ui/src/components/ChildDocs/index.tsx @@ -1,193 +1,10 @@ "use client" -import React, { useMemo } from "react" -import { Card, CardList, H2, useSidebar } from "../.." -import { InteractiveSidebarItem, SidebarItem, SidebarItemLink } from "types" -import slugify from "slugify" -import { MDXComponents } from "../.." +import React from "react" +import { useChildDocs, UseChildDocsProps } from "../.." -const Hr = MDXComponents["hr"] as () => React.JSX.Element +export const ChildDocs = (props: UseChildDocsProps) => { + const { component } = useChildDocs(props) -type ChildDocsProps = { - onlyTopLevel?: boolean - type?: "sidebar" | "item" - hideItems?: string[] - showItems?: string[] - hideTitle?: boolean - childLevel?: number -} - -export const ChildDocs = ({ - onlyTopLevel = false, - hideItems = [], - showItems, - type = "sidebar", - hideTitle = false, - childLevel = 1, -}: ChildDocsProps) => { - const { currentItems, activeItem } = useSidebar() - const filterType = useMemo(() => { - return showItems !== undefined - ? "show" - : hideItems.length > 0 - ? "hide" - : "all" - }, [showItems, hideItems]) - - const filterCondition = (item: SidebarItem): boolean => { - if (item.type === "separator") { - return false - } - switch (filterType) { - case "hide": - return ( - (item.type !== "link" || !hideItems.includes(item.path)) && - !hideItems.includes(item.title) - ) - case "show": - return ( - (item.type === "link" && showItems!.includes(item.path)) || - showItems!.includes(item.title) - ) - case "all": - return true - } - } - - const filterItems = (items: SidebarItem[]): SidebarItem[] => { - return items - .filter(filterCondition) - .map((item) => Object.assign({}, item)) - .map((item) => { - if ( - item.type !== "separator" && - item.children && - filterType === "hide" - ) { - item.children = filterItems(item.children) - } - - return item - }) - } - - const filteredItems = useMemo(() => { - const targetItems = - type === "sidebar" - ? currentItems - ? Object.assign({}, currentItems) - : undefined - : { - default: [...(activeItem?.children || [])], - } - if (filterType === "all" || !targetItems) { - return targetItems - } - - return { - ...targetItems, - default: filterItems(targetItems.default), - } - }, [currentItems, type, activeItem, filterItems]) - - const filterNonInteractiveItems = ( - items: SidebarItem[] | undefined - ): InteractiveSidebarItem[] => { - return ( - (items?.filter( - (item) => item.type !== "separator" - ) as InteractiveSidebarItem[]) || [] - ) - } - - const getChildrenForLevel = ( - item: InteractiveSidebarItem, - currentLevel = 1 - ): InteractiveSidebarItem[] | undefined => { - if (currentLevel === childLevel) { - return filterNonInteractiveItems(item.children) - } - if (!item.children) { - return - } - - const childrenResult: InteractiveSidebarItem[] = [] - - filterNonInteractiveItems(item.children).forEach((child) => { - const childChildren = getChildrenForLevel(child, currentLevel + 1) - - if (!childChildren) { - return - } - - childrenResult.push(...childChildren) - }) - - return childrenResult - } - - const getTopLevelElms = (items?: SidebarItem[]) => { - return ( - { - const href = - childItem.type === "link" - ? childItem.path - : childItem.children?.length - ? ( - childItem.children.find( - (item) => item.type === "link" - ) as SidebarItemLink - )?.path - : "#" - return { - title: childItem.title, - href, - } - }) || [] - } - /> - ) - } - - const getAllLevelsElms = (items?: SidebarItem[]) => { - const filteredItems = filterNonInteractiveItems(items) - return filteredItems.map((item, key) => { - const itemChildren = getChildrenForLevel(item) - const HeadingComponent = itemChildren?.length ? H2 : undefined - - return ( - - {HeadingComponent && ( - <> - {!hideTitle && ( - - {item.title} - - )} - ({ - title: childItem.title, - href: childItem.type === "link" ? childItem.path : "", - })) || [] - } - /> - {key !== filteredItems.length - 1 &&
} - - )} - {!HeadingComponent && item.type === "link" && ( - - )} -
- ) - }) - } - - const getElms = (items?: SidebarItem[]) => { - return onlyTopLevel ? getTopLevelElms(items) : getAllLevelsElms(items) - } - - return <>{getElms(filteredItems?.default)} + return <>{component} } diff --git a/www/packages/docs-ui/src/components/MDXComponents/index.tsx b/www/packages/docs-ui/src/components/MDXComponents/index.tsx index 39f2b75c1bf3d..c5377fbcb463d 100644 --- a/www/packages/docs-ui/src/components/MDXComponents/index.tsx +++ b/www/packages/docs-ui/src/components/MDXComponents/index.tsx @@ -120,3 +120,5 @@ export const MDXComponents: MDXComponentsType = { return }, } + +export const Hr = MDXComponents["hr"] as () => React.JSX.Element diff --git a/www/packages/docs-ui/src/components/Sidebar/Item/index.tsx b/www/packages/docs-ui/src/components/Sidebar/Item/index.tsx index 943e08b7181b0..0072d1690b79e 100644 --- a/www/packages/docs-ui/src/components/Sidebar/Item/index.tsx +++ b/www/packages/docs-ui/src/components/Sidebar/Item/index.tsx @@ -30,6 +30,7 @@ export const SidebarItem = ({ case "sub-category": return case "link": + case "ref": return case "separator": return diff --git a/www/packages/docs-ui/src/components/Sidebar/index.tsx b/www/packages/docs-ui/src/components/Sidebar/index.tsx index e0c82fa82e01a..cdde5f23ec436 100644 --- a/www/packages/docs-ui/src/components/Sidebar/index.tsx +++ b/www/packages/docs-ui/src/components/Sidebar/index.tsx @@ -1,7 +1,7 @@ "use client" import React, { Suspense, useMemo, useRef } from "react" -import { useSidebar } from "@/providers" +import { isSidebarItemLink, useSidebar } from "@/providers" import clsx from "clsx" import { Loading } from "@/components" import { SidebarItem } from "./Item" @@ -139,7 +139,7 @@ export const Sidebar = ({ const itemKey = item.type === "separator" ? index - : item.type === "link" + : isSidebarItemLink(item) ? `${item.path}-${index}` : `${item.title}-${index}` return ( diff --git a/www/packages/docs-ui/src/hooks/index.ts b/www/packages/docs-ui/src/hooks/index.ts index cca8f31263877..42079da035b04 100644 --- a/www/packages/docs-ui/src/hooks/index.ts +++ b/www/packages/docs-ui/src/hooks/index.ts @@ -1,4 +1,5 @@ export * from "./use-active-on-scroll" +export * from "./use-child-docs" export * from "./use-click-outside" export * from "./use-collapsible" export * from "./use-collapsible-code-lines" diff --git a/www/packages/docs-ui/src/hooks/use-child-docs/index.tsx b/www/packages/docs-ui/src/hooks/use-child-docs/index.tsx new file mode 100644 index 0000000000000..0c677173a49c8 --- /dev/null +++ b/www/packages/docs-ui/src/hooks/use-child-docs/index.tsx @@ -0,0 +1,228 @@ +"use client" + +import React, { useMemo } from "react" +import { + Card, + CardList, + H2, + H3, + H4, + Hr, + isSidebarItemLink, + useSidebar, +} from "../.." +import { InteractiveSidebarItem, SidebarItem, SidebarItemLink } from "types" +import slugify from "slugify" +import { MDXComponents } from "../.." + +type HeadingComponent = ( + props: React.HTMLAttributes +) => React.JSX.Element + +export type UseChildDocsProps = { + onlyTopLevel?: boolean + type?: "sidebar" | "item" + hideItems?: string[] + showItems?: string[] + hideTitle?: boolean + titleLevel?: number + childLevel?: number + itemsPerRow?: number +} + +export const useChildDocs = ({ + onlyTopLevel = false, + hideItems = [], + showItems, + type = "sidebar", + hideTitle = false, + titleLevel = 2, + childLevel = 1, + itemsPerRow, +}: UseChildDocsProps) => { + const { currentItems, activeItem } = useSidebar() + const TitleHeaderComponent: HeadingComponent = useMemo(() => { + switch (titleLevel) { + case 3: + return H3 + case 4: + return H4 + case 5: + return MDXComponents["h5"] as HeadingComponent + case 6: + return MDXComponents["h6"] as HeadingComponent + default: + return H2 + } + }, [titleLevel]) + const filterType = useMemo(() => { + return showItems !== undefined + ? "show" + : hideItems.length > 0 + ? "hide" + : "all" + }, [showItems, hideItems]) + + const filterCondition = (item: SidebarItem): boolean => { + if (item.type === "separator") { + return false + } + switch (filterType) { + case "hide": + return ( + (!isSidebarItemLink(item) || !hideItems.includes(item.path)) && + !hideItems.includes(item.title) + ) + case "show": + return ( + (isSidebarItemLink(item) && showItems!.includes(item.path)) || + showItems!.includes(item.title) + ) + case "all": + return true + } + } + + const filterItems = (items: SidebarItem[]): SidebarItem[] => { + return items + .filter(filterCondition) + .map((item) => Object.assign({}, item)) + .map((item) => { + if ( + item.type !== "separator" && + item.children && + filterType === "hide" + ) { + item.children = filterItems(item.children) + } + + return item + }) + } + + const filteredItems = useMemo(() => { + const targetItems = + type === "sidebar" + ? currentItems + ? Object.assign({}, currentItems) + : undefined + : { + default: [...(activeItem?.children || [])], + } + if (filterType === "all" || !targetItems) { + return targetItems + } + + return { + ...targetItems, + default: filterItems(targetItems.default), + } + }, [currentItems, type, activeItem, filterItems]) + + const filterNonInteractiveItems = ( + items: SidebarItem[] | undefined + ): InteractiveSidebarItem[] => { + return ( + (items?.filter( + (item) => item.type !== "separator" + ) as InteractiveSidebarItem[]) || [] + ) + } + + const getChildrenForLevel = ( + item: InteractiveSidebarItem, + currentLevel = 1 + ): InteractiveSidebarItem[] | undefined => { + if (currentLevel === childLevel) { + return filterNonInteractiveItems(item.children) + } + if (!item.children) { + return + } + + const childrenResult: InteractiveSidebarItem[] = [] + + filterNonInteractiveItems(item.children).forEach((child) => { + const childChildren = getChildrenForLevel(child, currentLevel + 1) + + if (!childChildren) { + return + } + + childrenResult.push(...childChildren) + }) + + return childrenResult + } + + const getTopLevelElms = (items?: SidebarItem[]) => { + return ( + { + const href = isSidebarItemLink(childItem) + ? childItem.path + : childItem.children?.length + ? ( + childItem.children.find((item) => + isSidebarItemLink(item) + ) as SidebarItemLink + )?.path + : "#" + return { + title: childItem.title, + href, + } + }) || [] + } + itemsPerRow={itemsPerRow} + /> + ) + } + + const getAllLevelsElms = (items?: SidebarItem[]) => { + const filteredItems = filterNonInteractiveItems(items) + return filteredItems.map((item, key) => { + const itemChildren = getChildrenForLevel(item) + const HeadingComponent = itemChildren?.length + ? TitleHeaderComponent + : undefined + + return ( + + {HeadingComponent && ( + <> + {!hideTitle && ( + + {item.title} + + )} + ({ + title: childItem.title, + href: isSidebarItemLink(childItem) ? childItem.path : "", + })) || [] + } + itemsPerRow={itemsPerRow} + /> + {key !== filteredItems.length - 1 &&
} + + )} + {!HeadingComponent && isSidebarItemLink(item) && ( + + )} +
+ ) + }) + } + + const getElms = (items?: SidebarItem[]) => { + return onlyTopLevel ? getTopLevelElms(items) : getAllLevelsElms(items) + } + + return { + items: filteredItems, + component: getElms(filteredItems?.default), + } +} diff --git a/www/packages/docs-ui/src/providers/Pagination/index.tsx b/www/packages/docs-ui/src/providers/Pagination/index.tsx index f8211b21efd31..8788edbfc6ac9 100644 --- a/www/packages/docs-ui/src/providers/Pagination/index.tsx +++ b/www/packages/docs-ui/src/providers/Pagination/index.tsx @@ -7,7 +7,7 @@ import React, { useMemo, useState, } from "react" -import { useSidebar } from "../Sidebar" +import { isSidebarItemLink, useSidebar } from "../Sidebar" import { usePrevious } from "@uidotdev/usehooks" import { InteractiveSidebarItem, SidebarItem } from "types" @@ -56,7 +56,7 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { return undefined } - return children[0].type === "link" + return isSidebarItemLink(children[0]) ? { ...children[0], parent: item, @@ -69,7 +69,7 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { ): SidebarItemWithParent[] | undefined => { return item.children?.filter( (childItem) => - childItem.type === "link" || + isSidebarItemLink(childItem) || (childItem.type !== "separator" && getChildrenWithPages(childItem)?.length) ) as SidebarItemWithParent[] @@ -95,7 +95,7 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { parent: item, } } - } else if (item.type === "link") { + } else if (isSidebarItemLink(item)) { foundItem = item } @@ -115,7 +115,7 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { return false } - if (item.type === "link") { + if (isSidebarItemLink(item)) { foundItem = item } else if (item.children?.length) { const childItem = getNextItem(item.children, -1) @@ -139,7 +139,7 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { } result.foundActive = currentItems.some((item, index) => { - if (item.type === "link" && item.path === activePath) { + if (isSidebarItemLink(item) && item.path === activePath) { if (index !== 0) { result.prevItem = getPrevItem(currentItems, index) } @@ -161,8 +161,9 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { result.prevItem = childrenResult.prevItem result.nextItem = childrenResult.nextItem if (!result.prevItem) { - result.prevItem = - item.type === "link" ? item : getPrevItem(currentItems, index) + result.prevItem = isSidebarItemLink(item) + ? item + : getPrevItem(currentItems, index) } if (!result.nextItem && index !== currentItems.length - 1) { @@ -186,7 +187,9 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { result.prevItem ? { title: result.prevItem.title, - link: result.prevItem.type === "link" ? result.prevItem.path : "", + link: isSidebarItemLink(result.prevItem) + ? result.prevItem.path + : "", parentTitle: result.prevItem.parent?.type !== "separator" ? result.prevItem.parent?.title @@ -198,7 +201,9 @@ export const PaginationProvider = ({ children }: PaginationProviderProps) => { result.nextItem ? { title: result.nextItem.title, - link: result.nextItem.type === "link" ? result.nextItem.path : "", + link: isSidebarItemLink(result.nextItem) + ? result.nextItem.path + : "", parentTitle: result.nextItem.parent?.type !== "separator" ? result.nextItem.parent?.title diff --git a/www/packages/docs-ui/src/providers/Sidebar/index.tsx b/www/packages/docs-ui/src/providers/Sidebar/index.tsx index 13cae0aa2ec84..b3b7bc1e6a43d 100644 --- a/www/packages/docs-ui/src/providers/Sidebar/index.tsx +++ b/www/packages/docs-ui/src/providers/Sidebar/index.tsx @@ -95,13 +95,26 @@ export type ActionType = type LinksMap = Map +export const isSidebarItemLink = ( + item: SidebarItem | undefined, + checkRef = true +): item is SidebarItemLink => { + return ( + item !== undefined && + (item.type === "link" || (checkRef && item.type === "ref")) + ) +} + const areItemsEqual = (itemA: SidebarItem, itemB: SidebarItem): boolean => { if (itemA.type === "separator" || itemB.type === "separator") { return false } const hasSameTitle = itemA.title === itemB.title const hasSamePath = - itemA.type === "link" && itemB.type === "link" && itemA.path === itemB.path + isSidebarItemLink(itemA) && + isSidebarItemLink(itemB) && + itemA.type === itemB.type && + itemA.path === itemB.path return hasSameTitle || hasSamePath } @@ -116,8 +129,8 @@ const findItem = ( if (i.type === "separator") { return false } - if (areItemsEqual(item as SidebarItem, i) && i.type === "link") { - foundItem = i + if (areItemsEqual(item as SidebarItem, i)) { + foundItem = i as SidebarItemLink } else if (checkChildren && i.children) { foundItem = findItem(i.children, item) if (foundItem && !foundItem.parentItem) { @@ -143,7 +156,7 @@ const getLinksMap = ( return } - if (item.type === "link") { + if (isSidebarItemLink(item)) { map.set(item.path, { ...item, parentItem, @@ -246,7 +259,7 @@ export const reducer = ( : [...(i.children || []), ...items], loaded: parent.changeLoaded ? true - : i.type === "link" + : isSidebarItemLink(i) ? i.loaded : true, } @@ -355,8 +368,8 @@ export const SidebarProvider = ({ } const isLinkActive = useCallback( - (item: SidebarItem, checkChildren = false): boolean => { - if (item.type !== "link") { + (item: SidebarItem, checkChildren = false, checkRef = true): boolean => { + if (!isSidebarItemLink(item, checkRef)) { return false } @@ -399,25 +412,29 @@ export const SidebarProvider = ({ if (item.type === "separator") { return false } - if (item.isChildSidebar && isLinkActive(item)) { + if (item.isChildSidebar && isLinkActive(item, false, false)) { currentSidebar = item + return true } - - if (!currentSidebar && item.children?.length) { - const childSidebar = - getCurrentSidebar(item.children) || - (activePath - ? findItem(item.children, { - path: activePath || undefined, - type: "link", - }) - : undefined) - - if (childSidebar) { - currentSidebar = childSidebar.isChildSidebar ? childSidebar : item - } + if (!item.children?.length) { + return false } + const childSidebar = + getCurrentSidebar(item.children) || + (activePath + ? findItem(item.children, { + path: activePath, + type: "link", + }) + : undefined) + + currentSidebar = childSidebar + ? childSidebar.isChildSidebar + ? childSidebar + : item + : undefined + return currentSidebar !== undefined }) @@ -434,7 +451,7 @@ export const SidebarProvider = ({ const previousSidebar = currentItems.previousSidebar || items const backItem = previousSidebar.default.find( - (item) => item.type === "link" && !item.isChildSidebar + (item) => isSidebarItemLink(item) && !item.isChildSidebar ) as SidebarItemLink if (!backItem) { @@ -472,7 +489,7 @@ export const SidebarProvider = ({ const handleScroll = () => { if (getScrolledTop(resolvedScrollableElement) === 0) { const firstItemPath = - items.default.length && items.default[0].type === "link" + items.default.length && isSidebarItemLink(items.default[0]) ? items.default[0].path : "" setActivePath(firstItemPath) @@ -548,8 +565,8 @@ export const SidebarProvider = ({ ) { const { children, ...parentItem } = currentSidebar const hasPreviousSidebar = - currentItems?.previousSidebar?.parentItem?.type === "link" && - parentItem.type === "link" && + isSidebarItemLink(currentItems?.previousSidebar?.parentItem) && + isSidebarItemLink(parentItem) && currentItems.previousSidebar.parentItem.path !== parentItem.path setCurrentItems({ diff --git a/www/packages/tags/src/tags/api-key.ts b/www/packages/tags/src/tags/api-key.ts index 413887972854b..c0f4ea5571aa1 100644 --- a/www/packages/tags/src/tags/api-key.ts +++ b/www/packages/tags/src/tags/api-key.ts @@ -1,7 +1,7 @@ export const apiKey = [ { "title": "Use a Publishable API Key in the Storefront", - "path": "/app/storefront-development/publishable-api-keys" + "path": "/storefront-development/publishable-api-keys" }, { "title": "createApiKeysStep", diff --git a/www/packages/tags/src/tags/auth.ts b/www/packages/tags/src/tags/auth.ts index ee8b6fad16ff2..c86c4eeb450b5 100644 --- a/www/packages/tags/src/tags/auth.ts +++ b/www/packages/tags/src/tags/auth.ts @@ -1,27 +1,27 @@ export const auth = [ { "title": "Log-out Customer in Storefront", - "path": "/app/storefront-development/customers/log-out" + "path": "/storefront-development/customers/log-out" }, { "title": "Login Customer in Storefront", - "path": "/app/storefront-development/customers/login" + "path": "/storefront-development/customers/login" }, { "title": "Register Customer in Storefront", - "path": "/app/storefront-development/customers/register" + "path": "/storefront-development/customers/register" }, { "title": "Reset Customer Password in Storefront", - "path": "/app/storefront-development/customers/reset-password" + "path": "/storefront-development/customers/reset-password" }, { "title": "Retrieve Customer in Storefront", - "path": "/app/storefront-development/customers/retrieve" + "path": "/storefront-development/customers/retrieve" }, { "title": "Third-Party or Social Login in Storefront", - "path": "/app/storefront-development/customers/third-party-login" + "path": "/storefront-development/customers/third-party-login" }, { "title": "setAuthAppMetadataStep", diff --git a/www/packages/tags/src/tags/cart.ts b/www/packages/tags/src/tags/cart.ts index bd506612ddb96..2777e5dcab162 100644 --- a/www/packages/tags/src/tags/cart.ts +++ b/www/packages/tags/src/tags/cart.ts @@ -1,47 +1,47 @@ export const cart = [ { "title": "Create Cart Context in Storefront", - "path": "/app/storefront-development/cart/context" + "path": "/storefront-development/cart/context" }, { "title": "Create Cart in Storefront", - "path": "/app/storefront-development/cart/create" + "path": "/storefront-development/cart/create" }, { "title": "Manage Cart's Items in Storefront", - "path": "/app/storefront-development/cart/manage-items" + "path": "/storefront-development/cart/manage-items" }, { "title": "Retrieve Cart in Storefront", - "path": "/app/storefront-development/cart/retrieve" + "path": "/storefront-development/cart/retrieve" }, { "title": "Update Cart in Storefront", - "path": "/app/storefront-development/cart/update" + "path": "/storefront-development/cart/update" }, { "title": "Checkout Step 2: Enter Address", - "path": "/app/storefront-development/checkout/address" + "path": "/storefront-development/checkout/address" }, { "title": "Checkout Step 5: Complete Cart", - "path": "/app/storefront-development/checkout/complete-cart" + "path": "/storefront-development/checkout/complete-cart" }, { "title": "Checkout Step 1: Enter Email", - "path": "/app/storefront-development/checkout/email" + "path": "/storefront-development/checkout/email" }, { "title": "Checkout Step 4: Choose Payment Provider", - "path": "/app/storefront-development/checkout/payment" + "path": "/storefront-development/checkout/payment" }, { "title": "Payment with Stripe in React Storefront", - "path": "/app/storefront-development/checkout/payment/stripe" + "path": "/storefront-development/checkout/payment/stripe" }, { "title": "Checkout Step 3: Choose Shipping Method", - "path": "/app/storefront-development/checkout/shipping" + "path": "/storefront-development/checkout/shipping" }, { "title": "addShippingMethodToCartStep", diff --git a/www/packages/tags/src/tags/customer.ts b/www/packages/tags/src/tags/customer.ts index e1cd6e0bc79f4..c5dcc39568e79 100644 --- a/www/packages/tags/src/tags/customer.ts +++ b/www/packages/tags/src/tags/customer.ts @@ -1,39 +1,39 @@ export const customer = [ { "title": "Manage Customer Addresses in Storefront", - "path": "/app/storefront-development/customers/addresses" + "path": "/storefront-development/customers/addresses" }, { "title": "Customer Context in Storefront", - "path": "/app/storefront-development/customers/context" + "path": "/storefront-development/customers/context" }, { "title": "Log-out Customer in Storefront", - "path": "/app/storefront-development/customers/log-out" + "path": "/storefront-development/customers/log-out" }, { "title": "Login Customer in Storefront", - "path": "/app/storefront-development/customers/login" + "path": "/storefront-development/customers/login" }, { "title": "Edit Customer Profile in Storefront", - "path": "/app/storefront-development/customers/profile" + "path": "/storefront-development/customers/profile" }, { "title": "Register Customer in Storefront", - "path": "/app/storefront-development/customers/register" + "path": "/storefront-development/customers/register" }, { "title": "Reset Customer Password in Storefront", - "path": "/app/storefront-development/customers/reset-password" + "path": "/storefront-development/customers/reset-password" }, { "title": "Retrieve Customer in Storefront", - "path": "/app/storefront-development/customers/retrieve" + "path": "/storefront-development/customers/retrieve" }, { "title": "Third-Party or Social Login in Storefront", - "path": "/app/storefront-development/customers/third-party-login" + "path": "/storefront-development/customers/third-party-login" }, { "title": "findOrCreateCustomerStep", diff --git a/www/packages/tags/src/tags/fulfillment.ts b/www/packages/tags/src/tags/fulfillment.ts index 03d85179c72ca..f7915835f7f13 100644 --- a/www/packages/tags/src/tags/fulfillment.ts +++ b/www/packages/tags/src/tags/fulfillment.ts @@ -1,7 +1,7 @@ export const fulfillment = [ { "title": "Checkout Step 3: Choose Shipping Method", - "path": "/app/storefront-development/checkout/shipping" + "path": "/storefront-development/checkout/shipping" }, { "title": "validateCartShippingOptionsStep", diff --git a/www/packages/tags/src/tags/index.ts b/www/packages/tags/src/tags/index.ts index 3180e8cc416ae..88d36d1db676d 100644 --- a/www/packages/tags/src/tags/index.ts +++ b/www/packages/tags/src/tags/index.ts @@ -1,31 +1,32 @@ export * from "./product.js" -export * from "./tax.js" +export * from "./server.js" export * from "./storefront.js" -export * from "./order.js" export * from "./payment.js" +export * from "./cart.js" +export * from "./order.js" export * from "./stripe.js" export * from "./fulfillment.js" export * from "./customer.js" -export * from "./auth.js" -export * from "./pricing.js" -export * from "./product-collection.js" +export * from "./tax.js" export * from "./inventory.js" +export * from "./pricing.js" +export * from "./api-key.js" +export * from "./query.js" export * from "./publishable-api-key.js" +export * from "./auth.js" export * from "./region.js" -export * from "./api-key.js" -export * from "./step.js" +export * from "./product-collection.js" export * from "./remote-link.js" -export * from "./sales-channel.js" export * from "./workflow.js" -export * from "./remote-query.js" +export * from "./sales-channel.js" +export * from "./product-category.js" +export * from "./step.js" +export * from "./promotion.js" export * from "./event-bus.js" export * from "./store.js" -export * from "./logger.js" -export * from "./promotion.js" -export * from "./locking.js" export * from "./file.js" -export * from "./user.js" -export * from "./product-category.js" export * from "./stock-location.js" -export * from "./cart.js" -export * from "./query.js" +export * from "./locking.js" +export * from "./user.js" +export * from "./remote-query.js" +export * from "./logger.js" diff --git a/www/packages/tags/src/tags/inventory.ts b/www/packages/tags/src/tags/inventory.ts index 5ff02e0c2077d..afb302f775936 100644 --- a/www/packages/tags/src/tags/inventory.ts +++ b/www/packages/tags/src/tags/inventory.ts @@ -1,7 +1,7 @@ export const inventory = [ { "title": "Retrieve Product Variant's Inventory in Storefront", - "path": "/app/storefront-development/products/inventory" + "path": "/storefront-development/products/inventory" }, { "title": "confirmInventoryStep", diff --git a/www/packages/tags/src/tags/order.ts b/www/packages/tags/src/tags/order.ts index 947d59f35769f..2f975e940151a 100644 --- a/www/packages/tags/src/tags/order.ts +++ b/www/packages/tags/src/tags/order.ts @@ -1,7 +1,7 @@ export const order = [ { "title": "Checkout Step 5: Complete Cart", - "path": "/app/storefront-development/checkout/complete-cart" + "path": "/storefront-development/checkout/complete-cart" }, { "title": "addOrderTransactionStep", diff --git a/www/packages/tags/src/tags/payment.ts b/www/packages/tags/src/tags/payment.ts index 77a35378c6457..4d32aed86b31e 100644 --- a/www/packages/tags/src/tags/payment.ts +++ b/www/packages/tags/src/tags/payment.ts @@ -1,15 +1,19 @@ export const payment = [ + { + "title": "Customize the Stripe Integration in the Next.js Starter", + "path": "/nextjs-starter/guides/customize-stripe" + }, { "title": "Checkout Step 5: Complete Cart", - "path": "/app/storefront-development/checkout/complete-cart" + "path": "/storefront-development/checkout/complete-cart" }, { "title": "Checkout Step 4: Choose Payment Provider", - "path": "/app/storefront-development/checkout/payment" + "path": "/storefront-development/checkout/payment" }, { "title": "Payment with Stripe in React Storefront", - "path": "/app/storefront-development/checkout/payment/stripe" + "path": "/storefront-development/checkout/payment/stripe" }, { "title": "createPaymentCollectionsStep", diff --git a/www/packages/tags/src/tags/pricing.ts b/www/packages/tags/src/tags/pricing.ts index d309be07b26e5..7ff9fae2b33b8 100644 --- a/www/packages/tags/src/tags/pricing.ts +++ b/www/packages/tags/src/tags/pricing.ts @@ -1,27 +1,27 @@ export const pricing = [ { "title": "Get Variant Prices", - "path": "/app/commerce-modules/product/guides/price" + "path": "/commerce-modules/product/guides/price" }, { "title": "Get Variant Price with Taxes", - "path": "/app/commerce-modules/product/guides/price-with-taxes" + "path": "/commerce-modules/product/guides/price-with-taxes" }, { "title": "Example: Show Sale Price", - "path": "/app/storefront-development/products/price/examples/sale-price" + "path": "/storefront-development/products/price/examples/sale-price" }, { "title": "Example: Show Variant's Price", - "path": "/app/storefront-development/products/price/examples/show-price" + "path": "/storefront-development/products/price/examples/show-price" }, { "title": "Example: Show Price with Taxes", - "path": "/app/storefront-development/products/price/examples/tax-price" + "path": "/storefront-development/products/price/examples/tax-price" }, { "title": "Retrieve Product Variant's Prices in Storefront", - "path": "/app/storefront-development/products/price" + "path": "/storefront-development/products/price" }, { "title": "createShippingOptionsPriceSetsStep", diff --git a/www/packages/tags/src/tags/product-category.ts b/www/packages/tags/src/tags/product-category.ts index 0cbb9575019db..6e8622c36a105 100644 --- a/www/packages/tags/src/tags/product-category.ts +++ b/www/packages/tags/src/tags/product-category.ts @@ -1,18 +1,18 @@ export const productCategory = [ { "title": "List Product Categories in Storefront", - "path": "/app/storefront-development/products/categories/list" + "path": "/storefront-development/products/categories/list" }, { "title": "Retrieve Nested Categories in Storefront", - "path": "/app/storefront-development/products/categories/nested-categories" + "path": "/storefront-development/products/categories/nested-categories" }, { "title": "Retrieve a Category's Products in Storefront", - "path": "/app/storefront-development/products/categories/products" + "path": "/storefront-development/products/categories/products" }, { "title": "Retrieve a Category in Storefront", - "path": "/app/storefront-development/products/categories/retrieve" + "path": "/storefront-development/products/categories/retrieve" } ] \ No newline at end of file diff --git a/www/packages/tags/src/tags/product-collection.ts b/www/packages/tags/src/tags/product-collection.ts index 964c0683a6e76..3d1d0c916de0a 100644 --- a/www/packages/tags/src/tags/product-collection.ts +++ b/www/packages/tags/src/tags/product-collection.ts @@ -1,14 +1,14 @@ export const productCollection = [ { "title": "List Product Collections in Storefront", - "path": "/app/storefront-development/products/collections/list" + "path": "/storefront-development/products/collections/list" }, { "title": "Retrieve a Collection's Products in Storefront", - "path": "/app/storefront-development/products/collections/products" + "path": "/storefront-development/products/collections/products" }, { "title": "Retrieve a Collection in Storefront", - "path": "/app/storefront-development/products/collections/retrieve" + "path": "/storefront-development/products/collections/retrieve" } ] \ No newline at end of file diff --git a/www/packages/tags/src/tags/product.ts b/www/packages/tags/src/tags/product.ts index d5f21ec0dc7ca..6038da105e74f 100644 --- a/www/packages/tags/src/tags/product.ts +++ b/www/packages/tags/src/tags/product.ts @@ -1,71 +1,71 @@ export const product = [ { "title": "Get Variant Prices", - "path": "/app/commerce-modules/product/guides/price" + "path": "/commerce-modules/product/guides/price" }, { "title": "Get Variant Price with Taxes", - "path": "/app/commerce-modules/product/guides/price-with-taxes" + "path": "/commerce-modules/product/guides/price-with-taxes" }, { "title": "List Product Categories in Storefront", - "path": "/app/storefront-development/products/categories/list" + "path": "/storefront-development/products/categories/list" }, { "title": "Retrieve Nested Categories in Storefront", - "path": "/app/storefront-development/products/categories/nested-categories" + "path": "/storefront-development/products/categories/nested-categories" }, { "title": "Retrieve a Category's Products in Storefront", - "path": "/app/storefront-development/products/categories/products" + "path": "/storefront-development/products/categories/products" }, { "title": "Retrieve a Category in Storefront", - "path": "/app/storefront-development/products/categories/retrieve" + "path": "/storefront-development/products/categories/retrieve" }, { "title": "List Product Collections in Storefront", - "path": "/app/storefront-development/products/collections/list" + "path": "/storefront-development/products/collections/list" }, { "title": "Retrieve a Collection's Products in Storefront", - "path": "/app/storefront-development/products/collections/products" + "path": "/storefront-development/products/collections/products" }, { "title": "Retrieve a Collection in Storefront", - "path": "/app/storefront-development/products/collections/retrieve" + "path": "/storefront-development/products/collections/retrieve" }, { "title": "Retrieve Product Variant's Inventory in Storefront", - "path": "/app/storefront-development/products/inventory" + "path": "/storefront-development/products/inventory" }, { "title": "List Products in Storefront", - "path": "/app/storefront-development/products/list" + "path": "/storefront-development/products/list" }, { "title": "Example: Show Sale Price", - "path": "/app/storefront-development/products/price/examples/sale-price" + "path": "/storefront-development/products/price/examples/sale-price" }, { "title": "Example: Show Variant's Price", - "path": "/app/storefront-development/products/price/examples/show-price" + "path": "/storefront-development/products/price/examples/show-price" }, { "title": "Example: Show Price with Taxes", - "path": "/app/storefront-development/products/price/examples/tax-price" + "path": "/storefront-development/products/price/examples/tax-price" }, { "title": "Retrieve Product Variant's Prices in Storefront", - "path": "/app/storefront-development/products/price" + "path": "/storefront-development/products/price" }, { "title": "Retrieve a Product in Storefront", - "path": "/app/storefront-development/products/retrieve" + "path": "/storefront-development/products/retrieve" }, { "title": "Select Product Variants in Storefront", - "path": "/app/storefront-development/products/variants" + "path": "/storefront-development/products/variants" }, { "title": "batchLinkProductsToCollectionStep", diff --git a/www/packages/tags/src/tags/publishable-api-key.ts b/www/packages/tags/src/tags/publishable-api-key.ts index 44f281ed34cad..560223940d697 100644 --- a/www/packages/tags/src/tags/publishable-api-key.ts +++ b/www/packages/tags/src/tags/publishable-api-key.ts @@ -1,6 +1,6 @@ export const publishableApiKey = [ { "title": "Use a Publishable API Key in the Storefront", - "path": "/app/storefront-development/publishable-api-keys" + "path": "/storefront-development/publishable-api-keys" } ] \ No newline at end of file diff --git a/www/packages/tags/src/tags/query.ts b/www/packages/tags/src/tags/query.ts index ae0b73e8ebeae..c41850749a7f6 100644 --- a/www/packages/tags/src/tags/query.ts +++ b/www/packages/tags/src/tags/query.ts @@ -1,11 +1,11 @@ export const query = [ { "title": "Get Variant Prices", - "path": "/app/commerce-modules/product/guides/price" + "path": "/commerce-modules/product/guides/price" }, { "title": "Get Variant Price with Taxes", - "path": "/app/commerce-modules/product/guides/price-with-taxes" + "path": "/commerce-modules/product/guides/price-with-taxes" }, { "title": "addShippingMethodToCartWorkflow", diff --git a/www/packages/tags/src/tags/region.ts b/www/packages/tags/src/tags/region.ts index 6f69b6c97b093..58868e4db6746 100644 --- a/www/packages/tags/src/tags/region.ts +++ b/www/packages/tags/src/tags/region.ts @@ -1,15 +1,15 @@ export const region = [ { "title": "Region Context in Storefront", - "path": "/app/storefront-development/regions/context" + "path": "/storefront-development/regions/context" }, { "title": "List Regions in Storefront", - "path": "/app/storefront-development/regions/list" + "path": "/storefront-development/regions/list" }, { "title": "Store and Retrieve Region", - "path": "/app/storefront-development/regions/store-retrieve-region" + "path": "/storefront-development/regions/store-retrieve-region" }, { "title": "findOneOrAnyRegionStep", diff --git a/www/packages/tags/src/tags/sales-channel.ts b/www/packages/tags/src/tags/sales-channel.ts index 9f40edcd6c0be..8bdd634c185e1 100644 --- a/www/packages/tags/src/tags/sales-channel.ts +++ b/www/packages/tags/src/tags/sales-channel.ts @@ -1,4 +1,8 @@ export const salesChannel = [ + { + "title": "Use a Publishable API Key in the Storefront", + "path": "/storefront-development/publishable-api-keys" + }, { "title": "validateSalesChannelsExistStep", "path": "/references/medusa-workflows/steps/validateSalesChannelsExistStep" diff --git a/www/packages/tags/src/tags/server.ts b/www/packages/tags/src/tags/server.ts new file mode 100644 index 0000000000000..1327cf802aed5 --- /dev/null +++ b/www/packages/tags/src/tags/server.ts @@ -0,0 +1,10 @@ +export const server = [ + { + "title": "Get Variant Prices", + "path": "/commerce-modules/product/guides/price" + }, + { + "title": "Get Variant Price with Taxes", + "path": "/commerce-modules/product/guides/price-with-taxes" + } +] \ No newline at end of file diff --git a/www/packages/tags/src/tags/storefront.ts b/www/packages/tags/src/tags/storefront.ts index 828634946f41d..162d33cf180da 100644 --- a/www/packages/tags/src/tags/storefront.ts +++ b/www/packages/tags/src/tags/storefront.ts @@ -1,162 +1,166 @@ export const storefront = [ + { + "title": "Customize the Stripe Integration in the Next.js Starter", + "path": "/nextjs-starter/guides/customize-stripe" + }, { "title": "Create Cart Context in Storefront", - "path": "/app/storefront-development/cart/context" + "path": "/storefront-development/cart/context" }, { "title": "Create Cart in Storefront", - "path": "/app/storefront-development/cart/create" + "path": "/storefront-development/cart/create" }, { "title": "Manage Cart's Items in Storefront", - "path": "/app/storefront-development/cart/manage-items" + "path": "/storefront-development/cart/manage-items" }, { "title": "Retrieve Cart in Storefront", - "path": "/app/storefront-development/cart/retrieve" + "path": "/storefront-development/cart/retrieve" }, { "title": "Update Cart in Storefront", - "path": "/app/storefront-development/cart/update" + "path": "/storefront-development/cart/update" }, { "title": "Checkout Step 2: Enter Address", - "path": "/app/storefront-development/checkout/address" + "path": "/storefront-development/checkout/address" }, { "title": "Checkout Step 5: Complete Cart", - "path": "/app/storefront-development/checkout/complete-cart" + "path": "/storefront-development/checkout/complete-cart" }, { "title": "Checkout Step 1: Enter Email", - "path": "/app/storefront-development/checkout/email" + "path": "/storefront-development/checkout/email" }, { "title": "Checkout Step 4: Choose Payment Provider", - "path": "/app/storefront-development/checkout/payment" + "path": "/storefront-development/checkout/payment" }, { "title": "Payment with Stripe in React Storefront", - "path": "/app/storefront-development/checkout/payment/stripe" + "path": "/storefront-development/checkout/payment/stripe" }, { "title": "Checkout Step 3: Choose Shipping Method", - "path": "/app/storefront-development/checkout/shipping" + "path": "/storefront-development/checkout/shipping" }, { "title": "Manage Customer Addresses in Storefront", - "path": "/app/storefront-development/customers/addresses" + "path": "/storefront-development/customers/addresses" }, { "title": "Customer Context in Storefront", - "path": "/app/storefront-development/customers/context" + "path": "/storefront-development/customers/context" }, { "title": "Log-out Customer in Storefront", - "path": "/app/storefront-development/customers/log-out" + "path": "/storefront-development/customers/log-out" }, { "title": "Login Customer in Storefront", - "path": "/app/storefront-development/customers/login" + "path": "/storefront-development/customers/login" }, { "title": "Edit Customer Profile in Storefront", - "path": "/app/storefront-development/customers/profile" + "path": "/storefront-development/customers/profile" }, { "title": "Register Customer in Storefront", - "path": "/app/storefront-development/customers/register" + "path": "/storefront-development/customers/register" }, { "title": "Reset Customer Password in Storefront", - "path": "/app/storefront-development/customers/reset-password" + "path": "/storefront-development/customers/reset-password" }, { "title": "Retrieve Customer in Storefront", - "path": "/app/storefront-development/customers/retrieve" + "path": "/storefront-development/customers/retrieve" }, { "title": "Third-Party or Social Login in Storefront", - "path": "/app/storefront-development/customers/third-party-login" + "path": "/storefront-development/customers/third-party-login" }, { "title": "List Product Categories in Storefront", - "path": "/app/storefront-development/products/categories/list" + "path": "/storefront-development/products/categories/list" }, { "title": "Retrieve Nested Categories in Storefront", - "path": "/app/storefront-development/products/categories/nested-categories" + "path": "/storefront-development/products/categories/nested-categories" }, { "title": "Retrieve a Category's Products in Storefront", - "path": "/app/storefront-development/products/categories/products" + "path": "/storefront-development/products/categories/products" }, { "title": "Retrieve a Category in Storefront", - "path": "/app/storefront-development/products/categories/retrieve" + "path": "/storefront-development/products/categories/retrieve" }, { "title": "List Product Collections in Storefront", - "path": "/app/storefront-development/products/collections/list" + "path": "/storefront-development/products/collections/list" }, { "title": "Retrieve a Collection's Products in Storefront", - "path": "/app/storefront-development/products/collections/products" + "path": "/storefront-development/products/collections/products" }, { "title": "Retrieve a Collection in Storefront", - "path": "/app/storefront-development/products/collections/retrieve" + "path": "/storefront-development/products/collections/retrieve" }, { "title": "Retrieve Product Variant's Inventory in Storefront", - "path": "/app/storefront-development/products/inventory" + "path": "/storefront-development/products/inventory" }, { "title": "List Products in Storefront", - "path": "/app/storefront-development/products/list" + "path": "/storefront-development/products/list" }, { "title": "Example: Show Sale Price", - "path": "/app/storefront-development/products/price/examples/sale-price" + "path": "/storefront-development/products/price/examples/sale-price" }, { "title": "Example: Show Variant's Price", - "path": "/app/storefront-development/products/price/examples/show-price" + "path": "/storefront-development/products/price/examples/show-price" }, { "title": "Example: Show Price with Taxes", - "path": "/app/storefront-development/products/price/examples/tax-price" + "path": "/storefront-development/products/price/examples/tax-price" }, { "title": "Retrieve Product Variant's Prices in Storefront", - "path": "/app/storefront-development/products/price" + "path": "/storefront-development/products/price" }, { "title": "Retrieve a Product in Storefront", - "path": "/app/storefront-development/products/retrieve" + "path": "/storefront-development/products/retrieve" }, { "title": "Select Product Variants in Storefront", - "path": "/app/storefront-development/products/variants" + "path": "/storefront-development/products/variants" }, { "title": "Use a Publishable API Key in the Storefront", - "path": "/app/storefront-development/publishable-api-keys" + "path": "/storefront-development/publishable-api-keys" }, { "title": "Region Context in Storefront", - "path": "/app/storefront-development/regions/context" + "path": "/storefront-development/regions/context" }, { "title": "List Regions in Storefront", - "path": "/app/storefront-development/regions/list" + "path": "/storefront-development/regions/list" }, { "title": "Store and Retrieve Region", - "path": "/app/storefront-development/regions/store-retrieve-region" + "path": "/storefront-development/regions/store-retrieve-region" }, { "title": "Storefront Development Tips", - "path": "/app/storefront-development/tips" + "path": "/storefront-development/tips" } ] \ No newline at end of file diff --git a/www/packages/tags/src/tags/stripe.ts b/www/packages/tags/src/tags/stripe.ts index 11f08bb59572e..8542ad6c3f290 100644 --- a/www/packages/tags/src/tags/stripe.ts +++ b/www/packages/tags/src/tags/stripe.ts @@ -1,6 +1,6 @@ export const stripe = [ { "title": "Payment with Stripe in React Storefront", - "path": "/app/storefront-development/checkout/payment/stripe" + "path": "/storefront-development/checkout/payment/stripe" } ] \ No newline at end of file diff --git a/www/packages/tags/src/tags/tax.ts b/www/packages/tags/src/tags/tax.ts index 2fecd0eabb18e..99cfbce592e07 100644 --- a/www/packages/tags/src/tags/tax.ts +++ b/www/packages/tags/src/tags/tax.ts @@ -1,11 +1,11 @@ export const tax = [ { "title": "Get Variant Price with Taxes", - "path": "/app/commerce-modules/product/guides/price-with-taxes" + "path": "/commerce-modules/product/guides/price-with-taxes" }, { "title": "Example: Show Price with Taxes", - "path": "/app/storefront-development/products/price/examples/tax-price" + "path": "/storefront-development/products/price/examples/tax-price" }, { "title": "createCartWorkflow", diff --git a/www/packages/tags/src/utils/generate-tags.ts b/www/packages/tags/src/utils/generate-tags.ts index 1b7d6b04abaa8..a75f9eefecfad 100644 --- a/www/packages/tags/src/utils/generate-tags.ts +++ b/www/packages/tags/src/utils/generate-tags.ts @@ -6,25 +6,51 @@ import { findPageTitle, getFrontMatterSync } from "docs-utils" type ConfigItem = { path: string - contentPaths: string[] + contentPaths: { + path: string + omitFromPath?: boolean + }[] } const config: ConfigItem[] = [ { path: path.resolve("..", "..", "apps", "book"), - contentPaths: ["app"], + contentPaths: [ + { + path: "app", + omitFromPath: true, + }, + ], }, { path: path.resolve("..", "..", "apps", "resources"), - contentPaths: ["app", "references"], + contentPaths: [ + { + path: "app", + omitFromPath: true, + }, + { + path: "references", + }, + ], }, { path: path.resolve("..", "..", "apps", "ui"), - contentPaths: [path.join("src", "content", "docs")], + contentPaths: [ + { + path: path.join("src", "content", "docs"), + omitFromPath: true, + }, + ], }, { path: path.resolve("..", "..", "apps", "user-guide"), - contentPaths: ["app"], + contentPaths: [ + { + path: "app", + omitFromPath: true, + }, + ], }, ] @@ -47,20 +73,21 @@ export async function generateTags(basePath?: string) { basePath = basePath || path.resolve() const tags: Tags = {} async function getTags(item: ConfigItem) { - async function scanDirectory(dirPath: string) { - const files = await readdir(dirPath) + async function scanDirectory(currentDirPath: string, omitPath?: string) { + const files = await readdir(currentDirPath) for (const file of files) { - const fullPath = path.join(dirPath, file) + const fullPath = path.join(currentDirPath, file) if (!file.endsWith(".mdx") || file.startsWith("_")) { if (statSync(fullPath).isDirectory()) { - await scanDirectory(fullPath) + await scanDirectory(fullPath, omitPath) } continue } const frontmatter = getFrontMatterSync(fullPath) const fileBasename = path.basename(file) + const itemBasePath = path.join(item.path, omitPath || "") frontmatter.tags?.forEach((tag) => { if (!Object.hasOwn(tags, tag)) { @@ -73,16 +100,21 @@ export async function generateTags(basePath?: string) { ), path: frontmatter.slug || - fullPath.replace(item.path, "").replace(`/${fileBasename}`, ""), + fullPath + .replace(itemBasePath, "") + .replace(`/${fileBasename}`, ""), }) }) } } for (const contentPath of item.contentPaths) { - const basePath = path.join(item.path, contentPath) + const basePath = path.join(item.path, contentPath.path) - await scanDirectory(basePath) + await scanDirectory( + basePath, + !contentPath.omitFromPath ? "" : contentPath.path + ) } } diff --git a/www/packages/types/src/sidebar.ts b/www/packages/types/src/sidebar.ts index 043ffb193b342..86454469f6b8e 100644 --- a/www/packages/types/src/sidebar.ts +++ b/www/packages/types/src/sidebar.ts @@ -16,7 +16,7 @@ export type SidebarItemCommon = { } export type SidebarItemLink = SidebarItemCommon & { - type: "link" + type: "link" | "ref" path: string isPathHref?: boolean linkProps?: React.AllHTMLAttributes @@ -59,9 +59,18 @@ export type SidebarSectionItems = { export type RawSidebarItem = SidebarItem & { autogenerate_path?: string autogenerate_tags?: string + autogenerate_as_ref?: boolean custom_autogenerate?: string number?: string -} +} & ( + | { + type: "category" | "sub-category" | "link" | "ref" + children?: RawSidebarItem[] + } + | { + type: "separator" + } + ) export type PersistedSidebarCategoryState = { [k: string]: {