chore(framework): Move and improve links loader (#8367)

**What**
Refactor and move links loader

FIXES FRMW-2637
This commit is contained in:
Adrien de Peretti authored and GitHub committed 2024-07-31 12:33:12 +00:00
1 parent 8a6e172dec
commit 12c6a1a022
16 files changed
+195 -147

No files matched your search

@@ -1,73 +0,0 @@
import { mkdirSync, rmSync, writeFileSync } from "fs"
import { resolve } from "path"
import { resolvePluginsLinks } from "../helpers/resolve-plugins-links"
import { createMedusaContainer } from "@medusajs/utils"
import { asValue } from "awilix"
const distTestTargetDirectorPath = resolve(__dirname, "__links__")
const getFolderTestTargetDirectoryPath = (folderName: string): string => {
return resolve(distTestTargetDirectorPath, folderName)
}
describe("resolve plugins links", () => {
beforeEach(() => {
jest.resetModules()
jest.clearAllMocks()
rmSync(distTestTargetDirectorPath, { recursive: true, force: true })
mkdirSync(getFolderTestTargetDirectoryPath("links"), {
mode: "777",
recursive: true,
})
})
afterAll(() => {
rmSync(distTestTargetDirectorPath, { recursive: true, force: true })
})
it("should load the custom links from the links directory", async () => {
writeFileSync(
resolve(getFolderTestTargetDirectoryPath("links"), "link.js"),
`
export default {
isLink: true
}
`
)
writeFileSync(
resolve(getFolderTestTargetDirectoryPath("links"), "empty-link.js"),
`
export default 'string'
`
)
const loggerMock = { warn: jest.fn() }
const container = createMedusaContainer()
container.register({
logger: asValue(loggerMock),
})
const links = await resolvePluginsLinks(
[
{
resolve: distTestTargetDirectorPath,
},
],
container
)
expect(loggerMock.warn).toHaveBeenCalledTimes(1)
expect(loggerMock.warn).toHaveBeenCalledWith(
`Links file ${distTestTargetDirectorPath}/links/empty-link.js does not export a default object`
)
expect(links).toEqual([
{
isLink: true,
},
])
})
})
@@ -1,57 +0,0 @@
import { glob } from "glob"
import {
MedusaContainer,
ModuleJoinerConfig,
PluginDetails,
} from "@medusajs/types"
import {
ContainerRegistrationKeys,
DefineLinkSymbol,
isObject,
} from "@medusajs/utils"
/**
* import files from the links directory to retrieve the links to be loaded
* @param plugins
* @param container
*/
export async function resolvePluginsLinks(
plugins: PluginDetails[],
container: MedusaContainer
): Promise<ModuleJoinerConfig[]> {
const logger =
container.resolve(ContainerRegistrationKeys.LOGGER, {
allowUnregistered: true,
}) ?? console
return (
await Promise.all(
plugins.map(async (pluginDetails) => {
const files = glob.sync(
`${pluginDetails.resolve}/links/*.{ts,js,mjs,mts}`,
{
ignore: ["**/*.d.ts", "**/*.map"],
}
)
return (
await Promise.all(
files.map(async (file) => {
const import_ = await import(file)
if (import_.default && !isObject(import_.default)) {
logger.warn(
`Links file ${file} does not export a default object`
)
return
}
return import_.default
})
)
).filter((value) => {
return isObject(value) && !value[DefineLinkSymbol]
})
})
)
)
.flat(Infinity)
.filter(Boolean)
}
+5 -3
View File
@@ -13,6 +13,7 @@ import {
container,
expressLoader,
featureFlagsLoader,
LinkLoader,
JobLoader,
logger,
pgConnectionLoader,
@@ -20,7 +21,6 @@ import {
} from "@medusajs/framework"
import { registerWorkflows } from "./helpers/register-workflows"
import { getResolvedPlugins } from "./helpers/resolve-plugins"
import { resolvePluginsLinks } from "./helpers/resolve-plugins-links"
import loadMedusaApp from "./medusa-app"
type Options = {
@@ -151,7 +151,10 @@ export default async ({
)
const plugins = getResolvedPlugins(rootDirectory, configModule, true) || []
const pluginLinks = await resolvePluginsLinks(plugins, container)
const linksSourcePaths = plugins.map((plugin) =>
join(plugin.resolve, "links")
)
await new LinkLoader(linksSourcePaths).load()
const {
onApplicationStart,
@@ -159,7 +162,6 @@ export default async ({
onApplicationPrepareShutdown,
} = await loadMedusaApp({
container,
linkModules: pluginLinks,
})
await registerWorkflows(plugins)