Skip to content

Commit

Permalink
Merge branch 'develop' into docs/commerce-modules-revisit-5
Browse files Browse the repository at this point in the history
  • Loading branch information
shahednasser committed Oct 16, 2024
2 parents 56629ac + 714b9e6 commit 8193482
Show file tree
Hide file tree
Showing 124 changed files with 3,063 additions and 653 deletions.
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ packages/*
!packages/workflow-engine-inmemory
!packages/fulfillment
!packages/fulfillment-manual
!packages/locking-redis
!packages/index

!packages/framework
Expand Down
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ module.exports = {
"./packages/modules/providers/file-s3/tsconfig.spec.json",
"./packages/modules/providers/fulfillment-manual/tsconfig.spec.json",
"./packages/modules/providers/payment-stripe/tsconfig.spec.json",
"./packages/modules/providers/locking-redis/tsconfig.spec.json",

"./packages/framework/tsconfig.json",
],
Expand Down
1 change: 1 addition & 0 deletions integration-tests/modules/medusa-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ module.exports = {
resolve: "@medusajs/cache-inmemory",
options: { ttl: 0 }, // Cache disabled
},
[Modules.LOCKING]: true,
[Modules.STOCK_LOCATION]: {
resolve: "@medusajs/stock-location-next",
options: {},
Expand Down
3 changes: 2 additions & 1 deletion packages/admin/admin-bundler/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { AdminOptions } from "@medusajs/types"

export type BundlerOptions = Required<Pick<AdminOptions, "outDir" | "path">> &
export type BundlerOptions = Required<Pick<AdminOptions, "path">> &
Pick<AdminOptions, "vite" | "backendUrl" | "storefrontUrl"> & {
outDir: string
sources?: string[]
}
7 changes: 5 additions & 2 deletions packages/admin/admin-vite-plugin/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,17 @@
],
"scripts": {
"build": "tsup",
"watch": "tsup --watch"
"watch": "tsup --watch",
"test": "vitest --run",
"test:watch": "vitest"
},
"devDependencies": {
"@babel/types": "7.25.6",
"@types/node": "^20.10.4",
"tsup": "8.0.1",
"typescript": "5.3.3",
"vite": "^5.2.11"
"vite": "^5.2.11",
"vitest": "^2.1.3"
},
"peerDependencies": {
"vite": "^5.0.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {
traverse,
} from "../babel"
import { logger } from "../logger"
import { crawl, getParserOptions } from "../utils"
import { crawl, getParserOptions, normalizePath } from "../utils"
import { getConfigArgument, getModel, validateLink } from "./helpers"

type CustomFieldDisplay = {
Expand Down Expand Up @@ -288,5 +288,6 @@ function generateCustomFieldConfigName(index: number): string {
}

function generateImport(file: string, index: number): string {
return `import ${generateCustomFieldConfigName(index)} from "${file}"`
const path = normalizePath(file)
return `import ${generateCustomFieldConfigName(index)} from "${path}"`
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
traverse,
} from "../babel"
import { logger } from "../logger"
import { crawl, getParserOptions } from "../utils"
import { crawl, getParserOptions, normalizePath } from "../utils"
import { getConfigArgument, getModel, validateLink } from "./helpers"

type CustomFieldConfigField = {
Expand Down Expand Up @@ -263,7 +263,8 @@ function generateCustomFieldConfigName(index: number): string {
}

function generateImport(file: string, index: number): string {
return `import ${generateCustomFieldConfigName(index)} from "${file}"`
const path = normalizePath(file)
return `import ${generateCustomFieldConfigName(index)} from "${path}"`
}

function getForms(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
traverse,
} from "../babel"
import { logger } from "../logger"
import { crawl, getParserOptions } from "../utils"
import { crawl, getParserOptions, normalizePath } from "../utils"
import { getConfigArgument, getModel } from "./helpers"

type ParsedCustomFieldLink = {
Expand Down Expand Up @@ -138,7 +138,8 @@ function generateCustomFieldConfigName(index: number): string {
}

function generateImport(file: string, index: number): string {
return `import ${generateCustomFieldConfigName(index)} from "${file}"`
const path = normalizePath(file)
return `import ${generateCustomFieldConfigName(index)} from "${path}"`
}

function getLink(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { describe, expect, it, vi } from "vitest"

import fs from "fs/promises"
import * as utils from "../../utils"
import { generateMenuItems } from "../generate-menu-items"

vi.mock("../../utils", async () => {
const actual = await vi.importActual("../../utils")
return {
...actual,
crawl: vi.fn(),
}
})

vi.mock("fs/promises", () => ({
default: {
readFile: vi.fn(),
},
}))

const mockFileContents = [
`
import { defineRouteConfig } from "@medusajs/admin-sdk"
const Page = () => {
return <div>Page 1</div>
}
export const config = defineRouteConfig({
label: "Page 1",
icon: "icon1",
})
export default Page
`,
`
import { defineRouteConfig } from "@medusajs/admin-sdk"
const Page = () => {
return <div>Page 2</div>
}
export const config = defineRouteConfig({
label: "Page 2",
})
export default Page
`,
]

const expectedMenuItems = `
menuItems: [
{
label: RouteConfig0.label,
icon: RouteConfig0.icon,
path: "/one",
},
{
label: RouteConfig1.label,
icon: undefined,
path: "/two",
}
]
`

describe("generateMenuItems", () => {
it("should generate menu items", 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(mockFileContents[mockFiles.indexOf(file as string)])
)

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

expect(result.imports).toEqual([
`import { config as RouteConfig0 } from "Users/user/medusa/src/admin/routes/one/page.tsx"`,
`import { config as RouteConfig1 } from "Users/user/medusa/src/admin/routes/two/page.tsx"`,
])
expect(utils.normalizeString(result.code)).toEqual(
utils.normalizeString(expectedMenuItems)
)
})

it("should handle windows paths", async () => {
// Setup mocks
const mockFiles = [
"C:\\medusa\\src\\admin\\routes\\one\\page.tsx",
"C:\\medusa\\src\\admin\\routes\\two\\page.tsx",
]
vi.mocked(utils.crawl).mockResolvedValue(mockFiles)

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

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

expect(result.imports).toEqual([
`import { config as RouteConfig0 } from "C:/medusa/src/admin/routes/one/page.tsx"`,
`import { config as RouteConfig1 } from "C:/medusa/src/admin/routes/two/page.tsx"`,
])
expect(utils.normalizeString(result.code)).toEqual(
utils.normalizeString(expectedMenuItems)
)
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import { describe, expect, it, vi } from "vitest"

import { Stats } from "fs"
import fs from "fs/promises"
import * as utils from "../../utils"
import { generateRoutes } from "../generate-routes"

// Mock the dependencies
vi.mock("../../utils", async () => {
const actual = await vi.importActual("../../utils")
return {
...actual,
crawl: vi.fn(),
}
})

vi.mock("fs/promises", () => ({
default: {
readFile: vi.fn(),
stat: vi.fn(),
},
}))

const mockFileContents = [
`
import { defineRouteConfig } from "@medusajs/admin-sdk"
const Page = () => {
return <div>Page 1</div>
}
export const config = defineRouteConfig({
label: "Page 1",
icon: "icon1",
})
export default Page
`,
`
import { defineRouteConfig } from "@medusajs/admin-sdk"
const Page = () => {
return <div>Page 2</div>
}
export const config = defineRouteConfig({
label: "Page 2",
})
export default Page
`,
]

const expectedRoutesWithoutLoaders = `
routes: [
{
Component: RouteComponent0,
loader: undefined,
path: "/one",
},
{
Component: RouteComponent1,
loader: undefined,
path: "/two",
}
]
`

const expectedRoutesWithLoaders = `
routes: [
{
Component: RouteComponent0,
loader: RouteLoader0,
path: "/one",
},
{
Component: RouteComponent1,
loader: RouteLoader1,
path: "/two",
}
]
`

describe("generateRoutes", () => {
it("should generate routes", 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(mockFileContents[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(expectedRoutesWithoutLoaders)
)
})
it("should generate routes with loaders", 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(mockFileContents[mockFiles.indexOf(file as string)])
)

vi.mocked(fs.stat).mockResolvedValue({} as Stats) // We just want to mock that the check passes

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

vi.mocked(fs.readFile).mockImplementation(async (file) =>
Promise.resolve(mockFileContents[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(expectedRoutesWithoutLoaders)
)
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ import fs from "fs/promises"
import { outdent } from "outdent"
import { isIdentifier, isObjectProperty, parse, traverse } from "../babel"
import { logger } from "../logger"
import { crawl, getConfigObjectProperties, getParserOptions } from "../utils"
import {
crawl,
getConfigObjectProperties,
getParserOptions,
normalizePath,
} from "../utils"
import { getRoute } from "./helpers"

type MenuItem = {
Expand Down Expand Up @@ -90,7 +95,8 @@ async function parseFile(
}

function generateImport(file: string, index: number): string {
return `import { config as ${generateRouteConfigName(index)} } from "${file}"`
const path = normalizePath(file)
return `import { config as ${generateRouteConfigName(index)} } from "${path}"`
}

function generateMenuItem(
Expand Down
Loading

0 comments on commit 8193482

Please sign in to comment.