Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(dashboard,admin-vite-plugin): Add support for outlet routes, loader, and handle #11305

Merged
merged 6 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/rude-balloons-report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@medusajs/admin-vite-plugin": patch
"@medusajs/dashboard": patch
---

feat(dashboard,admin-vite-plugin): Add support for parallel routes
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,112 @@ const expectedRoutesWithoutLoaders = `
routes: [
{
Component: RouteComponent0,
path: "/one",
path: "/one"
},
{
Component: RouteComponent1,
path: "/two",
path: "/two"
}
]
`

const mockFileContentsWithParallel = [
// Parent route
`
import { defineRouteConfig } from "@medusajs/admin-sdk"
const Page = () => {
return <div>Brands</div>
}
export const config = defineRouteConfig({
label: "Brands",
})
export default Page
`,
// Parallel route
`
import { defineRouteConfig } from "@medusajs/admin-sdk"
const Page = () => {
return <div>Create Brand</div>
}
export const config = defineRouteConfig({
label: "Create Brand",
})
export default Page
`,
]

const expectedRoutesWithParallel = `
routes: [
{
Component: RouteComponent0,
path: "/brands",
children: [
{
Component: RouteComponent1,
path: "/brands/create"
}
]
}
]
`

const mockFileContentsWithHandleLoader = [
`
import { defineRouteConfig } from "@medusajs/admin-sdk"

const Page = () => {
return <div>Page 1</div>
}

export const handle = {
someConfig: true
}

export const loader = async () => {
return { data: true }
}

export const config = defineRouteConfig({
label: "Page 1",
})

export default Page
`,
`
import { defineRouteConfig } from "@medusajs/admin-sdk"

const Page = () => {
return <div>Page 2</div>
}

export async function loader() {
return { data: true }
}

export const config = defineRouteConfig({
label: "Page 2",
})

export default Page
`,
]

const expectedRoutesWithHandleLoader = `
routes: [
{
Component: RouteComponent0,
path: "/one",
handle: handle0,
loader: loader0
},
{
Component: RouteComponent1,
path: "/two",
loader: loader1
}
]
`

describe("generateRoutes", () => {
it("should generate routes", async () => {
const mockFiles = [
Expand Down Expand Up @@ -103,4 +200,70 @@ describe("generateRoutes", () => {
utils.normalizeString(expectedRoutesWithoutLoaders)
)
})
it("should handle parallel routes", async () => {
const mockFiles = [
"Users/user/medusa/src/admin/routes/brands/page.tsx",
"Users/user/medusa/src/admin/routes/brands/@create/page.tsx",
]
vi.mocked(utils.crawl).mockResolvedValue(mockFiles)

vi.mocked(fs.readFile).mockImplementation(async (file) =>
Promise.resolve(
mockFileContentsWithParallel[mockFiles.indexOf(file as string)]
)
)

vi.mocked(fs.stat).mockRejectedValue(new Error("File not found"))

const result = await generateRoutes(
new Set(["Users/user/medusa/src/admin"])
)
expect(utils.normalizeString(result.code)).toEqual(
utils.normalizeString(expectedRoutesWithParallel)
)
})
it("should handle parallel routes with windows paths", async () => {
const mockFiles = [
"C:\\medusa\\src\\admin\\routes\\brands\\page.tsx",
"C:\\medusa\\src\\admin\\routes\\brands\\@create\\page.tsx",
]
vi.mocked(utils.crawl).mockResolvedValue(mockFiles)

vi.mocked(fs.readFile).mockImplementation(async (file) =>
Promise.resolve(
mockFileContentsWithParallel[mockFiles.indexOf(file as string)]
)
)

vi.mocked(fs.stat).mockRejectedValue(new Error("File not found"))

const result = await generateRoutes(new Set(["C:\\medusa\\src\\admin"]))

expect(utils.normalizeString(result.code)).toEqual(
utils.normalizeString(expectedRoutesWithParallel)
)
})
it("should handle routes with handle and loader exports", async () => {
const mockFiles = [
"Users/user/medusa/src/admin/routes/one/page.tsx",
"Users/user/medusa/src/admin/routes/two/page.tsx",
]
vi.mocked(utils.crawl).mockResolvedValue(mockFiles)

vi.mocked(fs.readFile).mockImplementation(async (file) =>
Promise.resolve(
mockFileContentsWithHandleLoader[mockFiles.indexOf(file as string)]
)
)

vi.mocked(fs.stat).mockRejectedValue(new Error("File not found"))

const result = await generateRoutes(
new Set(["Users/user/medusa/src/admin"])
)

expect(utils.normalizeString(result.code)).toEqual(
utils.normalizeString(expectedRoutesWithHandleLoader)
)
})
})
Loading
Loading