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

chore: use loaded module reference #5763

Merged
merged 31 commits into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9db37c7
chore: use loaded module reference
carlos-r-l-rodrigues Nov 29, 2023
9a48d93
changeset
carlos-r-l-rodrigues Nov 29, 2023
2fe8ae9
type
carlos-r-l-rodrigues Nov 29, 2023
20ca357
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 22, 2024
0e009fc
LINK module reference
carlos-r-l-rodrigues Jan 22, 2024
e4a7bf5
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 22, 2024
35e4489
changeset
carlos-r-l-rodrigues Jan 22, 2024
cf5c750
resolve if not string
carlos-r-l-rodrigues Jan 22, 2024
1b0f5f6
Merge branch 'chore/medusa-app-modules-reference' of https://github.c…
carlos-r-l-rodrigues Jan 22, 2024
35a5840
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 22, 2024
aad77a1
revert
carlos-r-l-rodrigues Jan 22, 2024
966effb
Merge branch 'chore/medusa-app-modules-reference' of https://github.c…
carlos-r-l-rodrigues Jan 22, 2024
8d30ace
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 22, 2024
6528072
update modules definition
carlos-r-l-rodrigues Jan 22, 2024
f2a93f1
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 22, 2024
2fad6b0
changeset
carlos-r-l-rodrigues Jan 22, 2024
bdf061c
Merge branch 'chore/medusa-app-modules-reference' of https://github.c…
carlos-r-l-rodrigues Jan 22, 2024
1046666
fix changeset
carlos-r-l-rodrigues Jan 22, 2024
875f7f5
normalize all modules entrypoints
carlos-r-l-rodrigues Jan 22, 2024
06a1746
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 22, 2024
986629d
remove .only
carlos-r-l-rodrigues Jan 22, 2024
723c766
exporting types
carlos-r-l-rodrigues Jan 22, 2024
a8fab05
pricing exporting models
carlos-r-l-rodrigues Jan 22, 2024
11ae2a5
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 22, 2024
720177f
export service
carlos-r-l-rodrigues Jan 23, 2024
28b9399
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 23, 2024
a58818b
rem not yet released modules
carlos-r-l-rodrigues Jan 23, 2024
974db99
Merge branch 'chore/medusa-app-modules-reference' of https://github.c…
carlos-r-l-rodrigues Jan 23, 2024
d3c69b7
Merge branch 'develop' into chore/medusa-app-modules-reference
carlos-r-l-rodrigues Jan 23, 2024
cf01dea
rem payment
carlos-r-l-rodrigues Jan 23, 2024
c814544
Merge branch 'chore/medusa-app-modules-reference' of https://github.c…
carlos-r-l-rodrigues Jan 23, 2024
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/fuzzy-tips-clap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@medusajs/modules-sdk": patch
"@medusajs/types": patch
carlos-r-l-rodrigues marked this conversation as resolved.
Show resolved Hide resolved
---

Medusa App loading modules reference
4 changes: 2 additions & 2 deletions packages/medusa/src/loaders/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ async function loadLegacyModulesEntities(configModules, container) {
continue
}

let modulePath = isString(moduleConfig)
const modulePath = isString(moduleConfig)
? moduleConfig
: (moduleConfig as InternalModuleDeclaration).resolve ??
(definition.defaultPackage as string)
Expand All @@ -69,7 +69,7 @@ async function loadLegacyModulesEntities(configModules, container) {
continue
}

const module = await import(modulePath)
const module = await import(modulePath as string)

if (module.default?.models) {
module.default.models.map((model) =>
Expand Down
2 changes: 2 additions & 0 deletions packages/modules-sdk/src/definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
import { upperCaseFirst } from "@medusajs/utils"

export enum Modules {
LINK = "linkModules",
EVENT_BUS = "eventBus",
STOCK_LOCATION = "stockLocationService",
INVENTORY = "inventoryService",
Expand Down Expand Up @@ -35,6 +36,7 @@ export enum ModuleRegistrationName {
}

export const MODULE_PACKAGE_NAMES = {
[Modules.LINK]: "@medusajs/link-modules",
[Modules.PRODUCT]: "@medusajs/product",
[Modules.EVENT_BUS]: "@medusajs/event-bus-local",
[Modules.STOCK_LOCATION]: "@medusajs/stock-location",
Expand Down
6 changes: 4 additions & 2 deletions packages/modules-sdk/src/loaders/utils/load-internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,13 @@ export async function loadInternalModule(
}

export async function loadModuleMigrations(
resolution: ModuleResolution
resolution: ModuleResolution,
moduleExports?: ModuleExports
): Promise<[Function | undefined, Function | undefined]> {
let loadedModule: ModuleExports
try {
loadedModule = await import(resolution.resolutionPath as string)
loadedModule =
moduleExports ?? (await import(resolution.resolutionPath as string))

return [loadedModule.runMigrations, loadedModule.revertMigration]
} catch {
Expand Down
113 changes: 72 additions & 41 deletions packages/modules-sdk/src/medusa-app.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { mergeTypeDefs } from "@graphql-tools/merge"
import { makeExecutableSchema } from "@graphql-tools/schema"
import { RemoteFetchDataCallback } from "@medusajs/orchestration"
import {
ExternalModuleDeclaration,
InternalModuleDeclaration,
LoadedModule,
LoaderOptions,
MedusaContainer,
MODULE_RESOURCE_TYPE,
MODULE_SCOPE,
ModuleDefinition,
ModuleExports,
ModuleJoinerConfig,
ModuleServiceInitializeOptions,
RemoteJoinerQuery,
Expand All @@ -15,23 +18,21 @@ import {
ContainerRegistrationKeys,
createMedusaContainer,
isObject,
isString,
ModulesSdkUtils,
} from "@medusajs/utils"
import { asValue } from "awilix"
import {
MODULE_PACKAGE_NAMES,
ModuleRegistrationName,
Modules,
} from "./definitions"
import { MedusaModule } from "./medusa-module"
import { RemoteFetchDataCallback } from "@medusajs/orchestration"
import { RemoteLink } from "./remote-link"
import { RemoteQuery } from "./remote-query"
import { cleanGraphQLSchema } from "./utils"
import { asValue } from "awilix"
import { makeExecutableSchema } from "@graphql-tools/schema"
import { mergeTypeDefs } from "@graphql-tools/merge"

const LinkModulePackage = "@medusajs/link-modules"
const LinkModulePackage = MODULE_PACKAGE_NAMES[Modules.LINK]

export type RunMigrationFn = (
options?: ModuleServiceInitializeOptions,
Expand Down Expand Up @@ -71,13 +72,17 @@ async function loadModules(modulesConfig, sharedContainer) {
Object.keys(modulesConfig).map(async (moduleName) => {
const mod = modulesConfig[moduleName]
let path: string
let moduleExports: ModuleExports | undefined = undefined
let declaration: any = {}
let definition: ModuleDefinition | undefined = undefined

if (isObject(mod)) {
const mod_ = mod as unknown as InternalModuleDeclaration
path = mod_.resolve ?? MODULE_PACKAGE_NAMES[moduleName]
definition = mod_.definition
moduleExports = !isString(mod_.resolve)
? (mod_.resolve as ModuleExports)
: undefined
declaration = { ...mod }
delete declaration.definition
} else {
Expand All @@ -98,6 +103,7 @@ async function loadModules(modulesConfig, sharedContainer) {
declaration,
sharedContainer,
moduleDefinition: definition,
moduleExports,
})) as LoadedModule

const service = loaded[moduleName]
Expand All @@ -119,9 +125,16 @@ async function loadModules(modulesConfig, sharedContainer) {
return allModules
}

async function initializeLinks(config, linkModules, injectedDependencies) {
async function initializeLinks({
config,
linkModules,
injectedDependencies,
moduleExports,
}) {
try {
const { initialize, runMigrations } = await import(LinkModulePackage)
const { initialize, runMigrations } =
moduleExports ?? (await import(LinkModulePackage))

const linkResolution = await initialize(
config,
linkModules,
Expand All @@ -140,6 +153,10 @@ async function initializeLinks(config, linkModules, injectedDependencies) {
}
}

function isMedusaModule(mod) {
return typeof mod?.initialize === "function"
}

function cleanAndMergeSchema(loadedSchema) {
const { schema: cleanedSchema, notFound } = cleanGraphQLSchema(loadedSchema)
const mergedSchema = mergeTypeDefs(cleanedSchema)
Expand Down Expand Up @@ -174,32 +191,28 @@ export type MedusaAppOutput = {
runMigrations: RunMigrationFn
}

export async function MedusaApp(
{
sharedContainer,
sharedResourcesConfig,
servicesConfig,
modulesConfigPath,
modulesConfigFileName,
modulesConfig,
linkModules,
remoteFetchData,
injectedDependencies,
}: {
sharedContainer?: MedusaContainer
sharedResourcesConfig?: SharedResources
loadedModules?: LoadedModule[]
servicesConfig?: ModuleJoinerConfig[]
modulesConfigPath?: string
modulesConfigFileName?: string
modulesConfig?: MedusaModuleConfig
linkModules?: ModuleJoinerConfig | ModuleJoinerConfig[]
remoteFetchData?: RemoteFetchDataCallback
injectedDependencies?: any
} = {
injectedDependencies: {},
}
): Promise<{
export async function MedusaApp({
sharedContainer,
sharedResourcesConfig,
servicesConfig,
modulesConfigPath,
modulesConfigFileName,
modulesConfig,
linkModules,
remoteFetchData,
injectedDependencies,
}: {
sharedContainer?: MedusaContainer
sharedResourcesConfig?: SharedResources
loadedModules?: LoadedModule[]
servicesConfig?: ModuleJoinerConfig[]
modulesConfigPath?: string
modulesConfigFileName?: string
modulesConfig?: MedusaModuleConfig
linkModules?: ModuleJoinerConfig | ModuleJoinerConfig[]
remoteFetchData?: RemoteFetchDataCallback
injectedDependencies?: any
} = {}): Promise<{
modules: Record<string, LoadedModule | LoadedModule[]>
link: RemoteLink | undefined
query: (
Expand All @@ -210,6 +223,8 @@ export async function MedusaApp(
notFound?: Record<string, Record<string, string>>
runMigrations: RunMigrationFn
}> {
injectedDependencies ??= {}

const sharedContainer_ = createMedusaContainer({}, sharedContainer)

const modules: MedusaModuleConfig =
Expand Down Expand Up @@ -241,8 +256,10 @@ export async function MedusaApp(
}

// remove the link module from the modules
const linkModule = modules[LinkModulePackage]
const linkModule = modules[LinkModulePackage] ?? modules[Modules.LINK]
delete modules[LinkModulePackage]
delete modules[Modules.LINK]

let linkModuleOptions = {}

if (isObject(linkModule)) {
Expand All @@ -267,11 +284,12 @@ export async function MedusaApp(
remoteLink,
linkResolution,
runMigrations: linkModuleMigration,
} = await initializeLinks(
linkModuleOptions,
} = await initializeLinks({
config: linkModuleOptions,
linkModules,
injectedDependencies
)
injectedDependencies,
moduleExports: isMedusaModule(linkModule) ? linkModule : undefined,
})

const loadedSchema = getLoadedSchema()
const { schema, notFound } = cleanAndMergeSchema(loadedSchema)
Expand All @@ -294,16 +312,29 @@ export async function MedusaApp(
for (const moduleName of Object.keys(allModules)) {
const moduleResolution = MedusaModule.getModuleResolutions(moduleName)

if (!moduleResolution.options?.database) {
moduleResolution.options ??= {}
moduleResolution.options.database = {
...(sharedResourcesConfig?.database ?? {}),
}
}

await MedusaModule.migrateUp(
moduleResolution.definition.key,
moduleResolution.resolutionPath as string,
moduleResolution.options
moduleResolution.options,
moduleResolution.moduleExports
)
}

const linkModuleOpt = { ...linkModuleOptions }
linkModuleOpt.database ??= {
...(sharedResourcesConfig?.database ?? {}),
}

linkModuleMigration &&
(await linkModuleMigration({
options: linkModuleOptions,
options: linkModuleOpt,
injectedDependencies,
}))
}
Expand Down
16 changes: 12 additions & 4 deletions packages/modules-sdk/src/medusa-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,8 @@ export class MedusaModule {
public static async migrateUp(
moduleKey: string,
modulePath: string,
options?: Record<string, any>
options?: Record<string, any>,
moduleExports?: ModuleExports
): Promise<void> {
const moduleResolutions = registerMedusaModule(moduleKey, {
scope: MODULE_SCOPE.INTERNAL,
Expand All @@ -448,7 +449,10 @@ export class MedusaModule {
})

for (const mod in moduleResolutions) {
const [migrateUp] = await loadModuleMigrations(moduleResolutions[mod])
const [migrateUp] = await loadModuleMigrations(
moduleResolutions[mod],
moduleExports
)

if (typeof migrateUp === "function") {
await migrateUp({
Expand All @@ -462,7 +466,8 @@ export class MedusaModule {
public static async migrateDown(
moduleKey: string,
modulePath: string,
options?: Record<string, any>
options?: Record<string, any>,
moduleExports?: ModuleExports
): Promise<void> {
const moduleResolutions = registerMedusaModule(moduleKey, {
scope: MODULE_SCOPE.INTERNAL,
Expand All @@ -472,7 +477,10 @@ export class MedusaModule {
})

for (const mod in moduleResolutions) {
const [, migrateDown] = await loadModuleMigrations(moduleResolutions[mod])
const [, migrateDown] = await loadModuleMigrations(
moduleResolutions[mod],
moduleExports
)

if (typeof migrateDown === "function") {
await migrateDown({
Expand Down
12 changes: 9 additions & 3 deletions packages/types/src/modules-sdk/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export type InternalModuleDeclaration = {
resources: MODULE_RESOURCE_TYPE
dependencies?: string[]
definition?: ModuleDefinition // That represent the definition of the module, such as the one we have for the medusa supported modules. This property is used for custom made modules.
resolve?: string
resolve?: string | ModuleExports
options?: Record<string, unknown>
/**
* If multiple modules are registered with the same key, the alias can be used to differentiate them
Expand Down Expand Up @@ -227,14 +227,20 @@ export declare type ModuleJoinerRelationship = JoinerRelationship & {
export type ModuleExports = {
service: Constructor<any>
loaders?: ModuleLoaderFunction[]
/**
* @deprecated property will be removed in future versions
*/
migrations?: any[]
/**
* @deprecated property will be removed in future versions
*/
models?: Constructor<any>[]
runMigrations?(
options: LoaderOptions,
options: LoaderOptions<any>,
moduleDeclaration?: InternalModuleDeclaration
): Promise<void>
revertMigration?(
options: LoaderOptions,
options: LoaderOptions<any>,
moduleDeclaration?: InternalModuleDeclaration
): Promise<void>
carlos-r-l-rodrigues marked this conversation as resolved.
Show resolved Hide resolved
}
Expand Down