docs: added migration guide for Medusa React (#3066)

* docs: added migration guide for Medusa React

* docs: fixed vale error
This commit is contained in:
Shahed Nasser
2023-01-19 16:59:49 +02:00
committed by GitHub
parent 296d6e229f
commit 7cafff14b9
22 changed files with 222 additions and 367 deletions

View File

@@ -0,0 +1,9 @@
{
"position": 3,
"collapsed": true,
"link": null,
"label": "Medusa Admin",
"customProps": {
"sort": "desc"
}
}

View File

@@ -1,5 +1,6 @@
---
description: 'Actions Required for Vite Update'
sidebar_label: 'Medusa Admin: Vite'
---
# Updating Medusa Admin from Gatsby to Vite

View File

@@ -4,7 +4,7 @@ hide_table_of_contents: true
import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
import filterListItems from '@site/src/utils/filterListItems';
import filterListItems, { flattenList } from '@site/src/utils/filterListItems';
# Upgrade Guides
@@ -12,8 +12,12 @@ Find in this page the upgrade guides that require necessary steps when upgrading
## Server
<DocCardList items={filterListItems(useCurrentSidebarCategory().items, /^(?!.*\/admin\/).*$/)}/>
<DocCardList items={filterListItems(flattenList(useCurrentSidebarCategory().items), /\/medusa\-core\//)}/>
## Medusa React
<DocCardList items={filterListItems(flattenList(useCurrentSidebarCategory().items), /\/medusa-react\//)}/>
## Admin
<DocCardList items={filterListItems(useCurrentSidebarCategory().items, /\/admin\//)}/>
<DocCardList items={filterListItems(flattenList(useCurrentSidebarCategory().items), /\/admin\//)}/>

View File

@@ -1,4 +1,5 @@
---
sidebar_position: 7
description: 'Actions Required for v.1.3.0'
---

View File

@@ -1,4 +1,5 @@
---
sidebar_position: 6
description: 'Actions Required for v.1.3.0'
---
@@ -8,7 +9,7 @@ Following the addition of feature flags in version v1.3.3 and the addition of th
:::note
In version 1.3.6, Sales Channels are available but guraded by [feature flags](../feature-flags/toggle.md). If you dont have Sales Channels enabled, you dont need to follow the steps detailed in this migration script.
In version 1.3.6, Sales Channels are available but guraded by [feature flags](../../feature-flags/toggle.md). If you dont have Sales Channels enabled, you dont need to follow the steps detailed in this migration script.
:::
@@ -30,7 +31,7 @@ These environment variables are used in the data migration scripts in this upgra
## Sales Channels
Sales Channels were introduced in v1.3.5 guarded by a [feature flag](../feature-flags/toggle.md). By enabling Sales Channels, developers and users can associate products and other entities with a specific Sales Channel.
Sales Channels were introduced in v1.3.5 guarded by a [feature flag](../../feature-flags/toggle.md). By enabling Sales Channels, developers and users can associate products and other entities with a specific Sales Channel.
However, if you upgraded Medusa to v1.3.5 and enabled Sales Channels, you must add every product to at least one Sales Channel manually. Otherwise, products cant be added to carts in different Sales Channels.

View File

@@ -1,4 +1,5 @@
---
sidebar_position: 5
description: 'Actions Required for v.1.3.0'
---

View File

@@ -1,4 +1,5 @@
---
sidebar_position: 4
description: 'Actions Required for v.1.6.1'
---

View File

@@ -1,14 +1,15 @@
---
sidebar_position: 3
description: 'Actions Required for v.1.7.0'
---
# v1.7.0
Version `1.7.0` of Medusa introduces a breaking change in the [CustomerService](../../../references/services/classes/CustomerService.md).
Version `1.7.0` of Medusa introduces a breaking change in the [CustomerService](../../../../references/services/classes/CustomerService.md).
## Overview
In this new version, the method [`retrieveByEmail` in the Customer Service](../../../references/services/classes/CustomerService.md#retrievebyemail) has been deprecated in favor of other methods. Read the actions required below to learn which methods to use instead.
In this new version, the method [`retrieveByEmail` in the Customer Service](../../../../references/services/classes/CustomerService.md#retrievebyemail) has been deprecated in favor of other methods. Read the actions required below to learn which methods to use instead.
In addition, after introducing the Claim Order feature, this version of Medusa introduces changes in the database that allows two customers having the same email based on the value of the `has_account` field. This change requires running migrations after the update.

View File

@@ -1,4 +1,5 @@
---
sidebar_position: 2
description: 'Actions Required for v.1.7.1'
---
@@ -65,7 +66,7 @@ const myJob = async (container, options) => {
export default myJob
```
You can learn more in the [How to Create a Scheduled Job](../scheduled-jobs/create.md) documentation.
You can learn more in the [How to Create a Scheduled Job](../../scheduled-jobs/create.md) documentation.
### Change to Payment Provider

View File

@@ -1,4 +1,5 @@
---
sidebar_position: 1
description: 'Actions Required for v.1.7.3'
---
@@ -8,7 +9,7 @@ Version 1.7.3 of Medusa changes the feature flag value for Sales Channels and Pu
## Overview
Sales Channels and Publishable API Keys were introduced in previous versions of Medusa, but guarded by [feature flags](../feature-flags/toggle.md) This meant that developers had to manually enable them to use them.
Sales Channels and Publishable API Keys were introduced in previous versions of Medusa, but guarded by [feature flags](../../feature-flags/toggle.md) This meant that developers had to manually enable them to use them.
Version 1.7.3 of Medusa keeps the feature flags for these two features, but theyre now enabled by default. This requires running the necessary migrations to ensure your server works as expected.
@@ -50,4 +51,4 @@ node ./node_modules/@medusajs/medusa/dist/scripts/sales-channels-migration.js
## Disabling Feature Flags
Although this version enables Sales Channels and Publishable API Keys by default, you can still turn them off using feature flags. Learn more in [this documentation](../feature-flags/toggle.md#disable-feature-flags)
Although this version enables Sales Channels and Publishable API Keys by default, you can still turn them off using feature flags. Learn more in [this documentation](../../feature-flags/toggle.md#disable-feature-flags)

View File

@@ -0,0 +1,9 @@
{
"position": 1,
"collapsed": false,
"link": null,
"label": "Server",
"customProps": {
"sort": "desc"
}
}

View File

@@ -0,0 +1,58 @@
---
description: 'Actions Required for v4.0.2'
---
<!-- vale docs.HeadingColons = NO -->
# Medusa React: v4.0.2
<!-- vale docs.HeadingColons = YES -->
Version 4.0.2 of Medusa React introduces a new update in its dependencies which can lead to breaking changes.
## Overview
Medusa React previously required installing React Query v3 as a peer dependency. This version changes the peer dependency requirement to [Tanstack Query](https://tanstack.com/query/latest/docs/react/overview) - the updated version of React Query.
This requires additional actions related to installing the new dependency and changing imports.
---
## Actions Required
### Update Medusa Dependencies
To update to the latest version of Medusa React, run the following command in your custom storefront or admin to update both Medusa React and the core package:
```bash
npm update medusa-react @medusajs/medusa
```
### Uninstall React Query v3
As React Query v3 is not required as a peer dependency anymore, uninstall it from your custom storefront or admin:
```bash npm2yarn
npm remove react-query
```
### Install Tanstack Query
Run the following command to install Tanstack Query:
```bash npm2yarn
npm install @tanstack/react-query
```
### Update Imports
Across your custom storefront or admin project, change all imports from `react-query` to `@tanstack/react-query`.
For example, update the import for `QueryClient` where you use it with Medusa Provider:
```ts
import { QueryClient } from "@tanstack/react-query"
// this remains the same
const queryClient = new QueryClient()
```

View File

@@ -0,0 +1,9 @@
{
"position": 2,
"collapsed": true,
"link": null,
"label": "Medusa React",
"customProps": {
"sort": "desc"
}
}

View File

@@ -7,7 +7,7 @@ In this document, youll learn how to implement the claim order flow in a stor
:::note
This flow was added starting from Medusa v1.7. You can learn more about upgrading in the [upgrade guide](../backend/upgrade-guides/1-7-0.md).
This flow was added starting from Medusa v1.7. You can learn more about upgrading in the [upgrade guide](../backend/upgrade-guides/medusa-core/1-7-0.md).
:::

View File

@@ -13,13 +13,20 @@ Alternatively, you can use Medusas [JS Client](../js-client/overview.md) or t
In the directory holding your React-based storefront or admin dashboard, run the following command to install Medusa React:
```bash npm2yarn
npm install medusa-react react-query @medusajs/medusa
npm install medusa-react @tanstack/react-query @medusajs/medusa
```
In addition to the `medusa-react` library, you need the following libraries:
1. `react-query`: `medusa-react` is built on top of [React Query v3](https://react-query-v3.tanstack.com/). Youll learn later in this reference how you can use Mutations and Queries with Medusa React.
2. `@medusajs/medusa`: The core Medusa package. This is used to import types used by Medusa React and while developing with it.
1\. `@tanstack/react-query`: `medusa-react` is built on top of [Tanstack Query](https://tanstack.com/query/latest/docs/react/overview). Youll learn later in this reference how you can use Mutations and Queries with Medusa React.
:::note
Versions of Medusa React prior to v4.0.2 used React Query v3 instead of Tanstack Query. Check out [this upgrade guide] to learn how you can update your storefront.
:::
2\. `@medusajs/medusa`: The core Medusa package. This is used to import types used by Medusa React and while developing with it.
:::info
@@ -36,14 +43,14 @@ To use the hooks exposed by Medusa React, you need to include the `MedusaProvi
The `MedusaProvider` requires two props:
1. `baseUrl`: The URL to your Medusa server
2. `queryClientProviderProps`: An object used to set the `react-query` client. The object requires a `client` property, which should be an instance of [QueryClient](https://react-query-v3.tanstack.com/reference/QueryClient).
2. `queryClientProviderProps`: An object used to set the Tanstack Query client. The object requires a `client` property, which should be an instance of [QueryClient](https://tanstack.com/query/v4/docs/react/reference/QueryClient).
For example:
```tsx title=src/App.ts
import { MedusaProvider } from "medusa-react"
import Storefront from "./Storefront"
import { QueryClient } from "react-query"
import { QueryClient } from "@tanstack/react-query"
import React from "react"
const queryClient = new QueryClient()
@@ -68,7 +75,7 @@ The `Storefront` component and its child components can now use hooks exposed by
### Queries
To fetch data from the Medusa server (in other words, perform `GET` requests), you can use [Queries](https://react-query-v3.tanstack.com/guides/queries). Query hooks simply wrap around react-query's `useQuery` hook to fetch data from your medusa server.
To fetch data from the Medusa server (in other words, perform `GET` requests), you can use [Queries](https://tanstack.com/query/v4/docs/react/guides/queries). Query hooks simply wrap around Tanstack Query's `useQuery` hook to fetch data from your medusa server.
For example, to fetch products from your Medusa server:
@@ -99,7 +106,7 @@ const Products = () => {
export default Products
```
In the example above, you import the `useProducts` hook from `medusa-react`. This hook, and every other query hook exposed by `medusa-react`, returns everything that `useQuery` [returns in react-query](https://react-query-v3.tanstack.com/reference/useQuery), except for the `data` field.
In the example above, you import the `useProducts` hook from `medusa-react`. This hook, and every other query hook exposed by `medusa-react`, returns everything that `useQuery` [returns in Tanstack Query](https://tanstack.com/query/v4/docs/react/reference/useQuery), except for the `data` field.
Instead of the `data` field, the response data is flattened and is part of the hooks returned fields. In the example above, the List Products endpoint returns a `products` array. So, `useProducts` returns a `products` array along with other fields returned by `useQuery`.
@@ -111,11 +118,11 @@ const { products } = useProducts({
})
```
You can learn more about using queries in [React Querys documentation](https://react-query-v3.tanstack.com/guides/queries).
You can learn more about using queries in [Tanstack Querys documentation](https://tanstack.com/query/v4/docs/react/guides/queries).
### Mutations
To create, update, or delete data on the Medusa server (in other words, perform `POST`, `PUT`, and `DELETE` requests), you can use [Mutations](https://react-query-v3.tanstack.com/guides/mutations). Mutation hooks wrap around react-query's `useMutation` to mutate data on your medusa server.
To create, update, or delete data on the Medusa server (in other words, perform `POST`, `PUT`, and `DELETE` requests), you can use [Mutations](https://tanstack.com/query/v4/docs/react/guides/mutations). Mutation hooks wrap around Tanstack Query's `useMutation` to mutate data on your medusa server.
For example, to create a cart:
@@ -148,13 +155,13 @@ const Cart = () => {
export default Cart
```
In the example above, you import the `useCreateCart` hook from `medusa-react`. This hook, and every other mutation hook exposed by `medusa-react`, returns everything that [useMutation](https://react-query-v3.tanstack.com/reference/useMutation) returns. You can also pass the same options you would pass to `useMutation` to mutation hooks exposed by `medusa-react`.
In the example above, you import the `useCreateCart` hook from `medusa-react`. This hook, and every other mutation hook exposed by `medusa-react`, returns everything that [useMutation](https://tanstack.com/query/v4/docs/react/reference/useMutation) returns. You can also pass the same options you would pass to `useMutation` to mutation hooks exposed by `medusa-react`.
To create a cart, you call the `createCart.mutate` method. In the underlying logic, this method sends a `POST` request to the Medusa server to create a cart.
If the request accepts any parameters, they can be passed as parameters to the `mutate` request. For example:
```tsx
```ts
createCart.mutate({
region_id,
})
@@ -170,7 +177,7 @@ The example above does not store in the browser the ID of the cart created, so t
Instead of using `mutate`, you can use `mutateAsync` to receive a Promise that resolves on success or throws on error.
Learn more about how you can use mutations in [React Querys documentation](https://react-query-v3.tanstack.com/guides/mutations).
Learn more about how you can use mutations in [Tanstack Querys documentation](https://tanstack.com/query/v4/docs/react/guides/mutations).
---
@@ -349,7 +356,7 @@ For example:
```tsx title=src/App.ts
import { CartProvider, MedusaProvider } from "medusa-react"
import Storefront from "./Storefront"
import { QueryClient } from "react-query"
import { QueryClient } from "@tanstack/react-query"
import React from "react"
const queryClient = new QueryClient()
@@ -439,7 +446,7 @@ For example:
```tsx title=src/App.ts
import { SessionProvider, MedusaProvider } from "medusa-react"
import Storefront from "./Storefront"
import { QueryClient } from "react-query"
import { QueryClient } from "@tanstack/react-query"
import React from "react"
const queryClient = new QueryClient()

View File

@@ -24,7 +24,7 @@ By default, Medusa loads environment variables from the systems environment v
:::info
This change in how environment variables are loaded was introduced in version 1.3.0. You can learn more in the [upgrade guide for version 1.3.0](../advanced/backend/upgrade-guides/1-3-0.md).
This change in how environment variables are loaded was introduced in version 1.3.0. You can learn more in the [upgrade guide for version 1.3.0](../advanced/backend/upgrade-guides/medusa-core/1-3-0.md).
:::

View File

@@ -2,305 +2,4 @@
A React library providing a set of components, utilities, and hooks for interacting seamlessly with a Medusa backend and building custom React storefronts.
## Installation
The library uses [react-query](https://react-query.tanstack.com/overview) as a solution for server-side state management and lists the library as a peer dependency.
In order to install the package, run the following
```bash
npm install medusa-react react-query @medusajs/medusa
# or
yarn add medusa-react react-query @medusajs/medusa
```
## Quick Start
In order to use the hooks exposed by medusa-react, you will need to include the `MedusaProvider` somewhere up in your component tree. The `MedusaProvider` takes a `baseUrl` prop which should point to your Medusa server. Under the hood, `medusa-react` uses the `medusa-js` client library (built on top of axios) to interact with your server.
In addition, because medusa-react is built on top of react-query, you can pass an object representing react-query's [QueryClientProvider](https://react-query.tanstack.com/reference/QueryClientProvider#_top) props, which will be passed along by `MedusaProvider`.
```jsx
// App.tsx
import * as React from "react"
import { QueryClient } from "@tanstack/react-query"
import { MedusaProvider } from "medusa-react"
import MyStorefront from "./my-storefront"
// Your react-query's query client config
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
staleTime: 30000,
retry: 1,
},
},
})
const App = () => {
return (
<MedusaProvider
queryClientProviderProps={{ client: queryClient }}
baseUrl="http://localhost:9000"
>
<MyStorefront />
</MedusaProvider>
)
}
export default App
```
The hooks exposed by `medusa-react` fall into two main categories: queries and mutations.
### Queries
[Queries](https://react-query.tanstack.com/guides/queries#_top) simply wrap around react-query's `useQuery` hook to fetch some data from your medusa server
```jsx
// ./my-storefront.tsx
import * as React from "react"
import { useProducts } from "medusa-react"
const MyStorefront = () => {
const { products, isLoading } = useProducts()
return isLoading ? (
<Spinner />
) : (
products.map((product) => <Product product={product} />)
)
}
```
In general, the queries will return everything react-query returns from [`useQuery`](https://react-query.tanstack.com/reference/useQuery#_top) except the `data` field, which will be flattened out. In addition, you can also access the HTTP response object returned from the `medusa-js` client including things like `status`, `headers`, etc.
So, in other words, we can express what the above query returns as the following:
```typescript
import { UseQueryResult } from "@tanstack/react-query"
// This is what a Medusa server returns when you hit the GET /store/products endpoint
type ProductsResponse = {
products: Product[]
limit: number
offset: number
}
// UseProductsQuery refers to what's returned by the useProducts hook
type UseProductsQuery = ProductsResponse &
Omit<UseQueryResult, "data"> & {
response: {
status: number
statusText: string
headers: Record<string, string> & {
"set-cookie"?: string[]
}
config: any
request?: any
}
}
// More generally ...
type QueryReturnType = APIResponse &
Omit<UseQueryResult, "data"> & {
response: {
status: number
statusText: string
headers: Record<string, string> & {
"set-cookie"?: string[]
}
config: any
request?: any
}
}
```
### Mutations
[Mutations](https://react-query.tanstack.com/guides/mutations#_top) wrap around react-query's `useMutation` to mutate data and perform server-side effects on your medusa server. If you are not entirely familiar with this idea of "mutations", creating a cart would be a mutation because it creates a cart in your server (and database). Mutations also have to be invoked imperatively, meaning that calling for the mutation to take action, you will have to call a `mutate()` function returned from mutation hooks.
```jsx
import * as React from "react"
import { useCreateCart } from "medusa-react"
const CreateCartButton = () => {
const createCart = useCreateCart()
const handleClick = () => {
createCart.mutate({}) // create an empty cart
}
return (
<Button isLoading={createCart.isLoading} onClick={handleClick}>
Create cart
</Button>
)
}
```
The mutation hooks will return exactly what react-query's [`useMutation`](https://react-query.tanstack.com/reference/useMutation#_top) returns. In addition, the options you pass in to the hooks will be passed along to `useMutation`.
### Utilities
A set of utility functions are also exposed from the library to make your life easier when dealing with displaying money amounts
#### `formatVariantPrice()`
- `formatVariantPrice(params: FormatVariantPriceParams): string`
```typescript
type FormatVariantPriceParams = {
variant: ProductVariantInfo
region: RegionInfo
includeTaxes?: boolean
minimumFractionDigits?: number
maximumFractionDigits?: number
locale?: string
}
type ProductVariantInfo = Pick<ProductVariant, "prices">
type RegionInfo = {
currency_code: string
tax_code: string
tax_rate: number
}
```
Given a variant and region, will return a string representing the localized amount (i.e: `$19.50`)
The behavior of minimumFractionDigits and maximumFractionDigits is the same as the one explained by MDN [here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat). In fact, in order to convert the decimal amount, we use the browser's `Intl.NumberFormat` method.
#### `computeVariantPrice()`
- `computeVariantPrice(params: ComputeVariantPriceParams): number`
```typescript
type ComputeVariantPriceParams = {
variant: ProductVariantInfo
region: RegionInfo
includeTaxes?: boolean
}
```
Determines a variant's price based on the region provided. Returns a decimal number representing the amount.
#### `formatAmount()`
- `formatAmount(params: FormatAmountParams): string`
```typescript
type FormatAmountParams = {
amount: number
region: RegionInfo
includeTaxes?: boolean
minimumFractionDigits?: number
maximumFractionDigits?: number
locale?: string
}
```
Returns a localized string based on the input params representing the amount (i.e: "$10.99").
#### `computeAmount()`
- `computeAmount(params: ComputeAmountParams): number`
```typescript
type ComputeAmountParams = {
amount: number
region: RegionInfo
includeTaxes?: boolean
}
```
Takes an integer amount, a region, and includeTaxes boolean. Returns a decimal amount including (or excluding) taxes.
### Context Providers (Experimental)
In order to make building custom storefronts easier, we also expose a `SessionCartProvider` and a `CartProvider` . At first, the two sound very similar to each other, however, the main distinction between the two is that the `SessionCartProvider` never interacts with your medusa server.
The main goal behind the provider is to manage the state related to your users' cart experience. In other words, the provider keeps track of the items users add to their cart and help you interact with those items through a set of helpful methods like `addItem`, `updateQuantity`, `removeItem` , etc.
On the other hand the `CartProvider` makes use of some of the hooks already exposed by `medusa-react` to help you create a cart (on the medusa backend), start the checkout flow, authorize payment sessions, etc. It also manages one single global piece of state which represents a cart, exactly like the one created on your medusa backend.
You can think of a `sessionCart` as a purely client-side lightweight cart, in other words, just a javascript object living in your browser, whereas `cart` is the entity which you have stored in your database.
### SessionCart
The first step to using the `SessionCartProvider` is by inserting it somewhere up in your component tree.
```jsx
// App.tsx
import * as React from "react"
import { QueryClient } from "@tanstack/react-query"
import { MedusaProvider, SessionCartProvider } from "medusa-react"
import MyStorefront from "./my-storefront"
// Your react-query's query client config
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
staleTime: 30000,
retry: 1,
},
},
})
const App = () => {
return (
<MedusaProvider
queryClientProviderProps={{ client: queryClient }}
baseUrl="http://localhost:9000"
>
<SessionCartProvider>
<MyStorefront />
</SessionCartProvider>
</MedusaProvider>
)
}
export default App
```
### Cart
```jsx
// App.tsx
import * as React from "react"
import { QueryClient } from "@tanstack/react-query"
import { MedusaProvider, CartProvider } from "medusa-react"
import MyStorefront from "./my-storefront"
// Your react-query's query client config
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
staleTime: 30000,
retry: 1,
},
},
})
const App = () => {
return (
<MedusaProvider
queryClientProviderProps={{ client: queryClient }}
baseUrl="http://localhost:9000"
>
<CartProvider>
<MyStorefront />
</CartProvider>
</MedusaProvider>
)
}
export default App
```
Learn how to install and use it in [this documentation](https://docs.medusajs.com/medusa-react/overview).

View File

@@ -2,6 +2,7 @@ const path = require("path")
const fs = require("fs")
const docsPath = path.join(__dirname, "../../docs/content")
const apisPath = path.join(__dirname, "../../docs/api")
const reverseSidebar = require('./src/utils/reverseSidebar')
const algoliaAppId = process.env.ALGOLIA_APP_ID || "temp"
const algoliaApiKey = process.env.ALGOLIA_API_KEY || "temp"
@@ -33,7 +34,7 @@ const config = {
apiKey: process.env.SEGMENT_API_KEY || "temp"
}
],
require.resolve("docusaurus-plugin-image-zoom")
require.resolve("docusaurus-plugin-image-zoom"),
],
themeConfig: {
image: 'img/docs-banner.jpg',
@@ -210,6 +211,10 @@ const config = {
],
showLastUpdateTime: true,
breadcrumbs: false,
async sidebarItemsGenerator({defaultSidebarItemsGenerator, ...args}) {
const sidebarItems = await defaultSidebarItemsGenerator(args);
return reverseSidebar(sidebarItems);
},
},
theme: {
customCss: require.resolve("./src/css/custom.css")

View File

@@ -84,4 +84,32 @@
[[redirects]]
from = "/guides/checkouts"
to = "/advanced/storefront/how-to-implement-checkout-flow"
to = "/advanced/storefront/how-to-implement-checkout-flow"
[[redirects]]
from="/advanced/backend/upgrade-guides/1-7-3"
to="advanced/backend/upgrade-guides/medusa-core/1-7-3"
[[redirects]]
from="/advanced/backend/upgrade-guides/1-7-1"
to="advanced/backend/upgrade-guides/medusa-core/1-7-1"
[[redirects]]
from="/advanced/backend/upgrade-guides/1-7-0"
to="advanced/backend/upgrade-guides/medusa-core/1-7-0"
[[redirects]]
from="/advanced/backend/upgrade-guides/1-6-1"
to="advanced/backend/upgrade-guides/medusa-core/1-6-1"
[[redirects]]
from="/advanced/backend/upgrade-guides/1-3-8"
to="advanced/backend/upgrade-guides/medusa-core/1-3-8"
[[redirects]]
from="/advanced/backend/upgrade-guides/1-3-6"
to="advanced/backend/upgrade-guides/medusa-core/1-3-6"
[[redirects]]
from="/advanced/backend/upgrade-guides/1-3-0"
to="advanced/backend/upgrade-guides/medusa-core/1-3-0"

View File

@@ -183,45 +183,35 @@ module.exports = {
},
items: [
{
type: "doc",
id: "advanced/backend/upgrade-guides/1-7-3",
label: "v1.7.3"
type: "category",
label: "Server",
items: [
{
type: 'autogenerated',
dirName: 'advanced/backend/upgrade-guides/medusa-core'
}
]
},
{
type: "doc",
id: "advanced/backend/upgrade-guides/1-7-1",
label: "v1.7.1"
type: "category",
label: "Medusa React",
items: [
{
type: 'autogenerated',
dirName: 'advanced/backend/upgrade-guides/medusa-react'
}
]
},
{
type: "doc",
id: "advanced/backend/upgrade-guides/1-7-0",
label: "v1.7.0"
},
{
type: "doc",
id: "advanced/backend/upgrade-guides/1-6-1",
label: "v1.6.1"
},
{
type: "doc",
id: "advanced/backend/upgrade-guides/1-3-8",
label: "v1.3.8"
},
{
type: "doc",
id: "advanced/backend/upgrade-guides/1-3-6",
label: "v1.3.6"
},
{
type: "doc",
id: "advanced/backend/upgrade-guides/1-3-0",
label: "v1.3.0"
},
{
type: "doc",
id: "advanced/backend/upgrade-guides/admin/admin-vite",
label: "Medusa Admin: Vite"
},
type: "category",
label: "Medusa Admin",
items: [
{
type: 'autogenerated',
dirName: 'advanced/backend/upgrade-guides/admin'
}
]
}
]
},
{

View File

@@ -1,9 +1,28 @@
export default function filterListItems (items: any[], pathPattern: string | RegExp) {
import { PropSidebarItem, PropSidebarItemLink } from '@docusaurus/plugin-content-docs'
export default function filterListItems (items: PropSidebarItemLink[], pathPattern: string | RegExp): PropSidebarItemLink[] {
console.log(items)
if (!items.length) {
return items
}
let pattern = new RegExp(pathPattern)
return items.filter((item) => pattern.test(item.href))
return items.filter((item: PropSidebarItemLink) => pattern.test(item.href))
}
/**
* Flatting a sidebar list moving items from category
* to links
*/
export function flattenList (items: PropSidebarItem[]): PropSidebarItem[] {
const newItems = items.map((item: PropSidebarItem) => {
if (item.type !== 'category') {
return item
}
return item.items
})
return newItems.flat()
}

View File

@@ -0,0 +1,10 @@
module.exports = function reverseSidebarItems(items) {
// Reverse items in categories
const result = items.map((item) => {
if (item.type === 'category' && item.customProps?.sort === 'desc') {
return {...item, items: reverseSidebarItems(item.items)};
}
return item;
});
return result;
}