diff --git a/packages/medusa/src/loaders/__tests__/module.spec.ts b/packages/medusa/src/loaders/__tests__/module.spec.ts index d8a544cb00..f07ba400d9 100644 --- a/packages/medusa/src/loaders/__tests__/module.spec.ts +++ b/packages/medusa/src/loaders/__tests__/module.spec.ts @@ -95,6 +95,10 @@ describe("modules loader", () => { resources: MODULE_RESOURCE_TYPE.SHARED, }, }, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resources: MODULE_RESOURCE_TYPE.SHARED, + }, }, } @@ -123,6 +127,10 @@ describe("modules loader", () => { resources: MODULE_RESOURCE_TYPE.SHARED, }, }, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resources: MODULE_RESOURCE_TYPE.SHARED, + }, }, } @@ -162,6 +170,10 @@ describe("modules loader", () => { resources: MODULE_RESOURCE_TYPE.SHARED, }, }, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resources: MODULE_RESOURCE_TYPE.SHARED, + }, }, } @@ -194,6 +206,10 @@ describe("modules loader", () => { resources: MODULE_RESOURCE_TYPE.SHARED, }, }, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resources: MODULE_RESOURCE_TYPE.SHARED, + }, }, } @@ -228,6 +244,10 @@ describe("modules loader", () => { resources: MODULE_RESOURCE_TYPE.SHARED, }, }, + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resources: MODULE_RESOURCE_TYPE.SHARED, + }, }, } @@ -242,4 +262,74 @@ describe("modules loader", () => { ) } }) + + it("throws error if no scope is defined to the module", async () => { + expect.assertions(1) + const moduleResolutions: Record = { + testService: { + resolutionPath: "@modules/no-service", + definition: { + registrationName: "testService", + key: "testService", + defaultPackage: "testService", + label: "TestService", + isRequired: true, + defaultModuleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resources: MODULE_RESOURCE_TYPE.SHARED, + }, + }, + // @ts-ignore + moduleDeclaration: { + resources: MODULE_RESOURCE_TYPE.SHARED, + }, + }, + } + + const configModule = buildConfigModule({ + moduleResolutions, + }) + try { + await registerModules({ container, configModule, logger: Logger }) + } catch (err) { + expect(err.message).toEqual( + "The module TestService has to define its scope (internal | external)" + ) + } + }) + + it("throws error if resources is not set when scope is defined as internal", async () => { + expect.assertions(1) + const moduleResolutions: Record = { + testService: { + resolutionPath: "@modules/no-service", + definition: { + registrationName: "testService", + key: "testService", + defaultPackage: "testService", + label: "TestService", + isRequired: true, + defaultModuleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + resources: MODULE_RESOURCE_TYPE.SHARED, + }, + }, + // @ts-ignore + moduleDeclaration: { + scope: MODULE_SCOPE.INTERNAL, + }, + }, + } + + const configModule = buildConfigModule({ + moduleResolutions, + }) + try { + await registerModules({ container, configModule, logger: Logger }) + } catch (err) { + expect(err.message).toEqual( + "The module TestService is missing its resources config" + ) + } + }) }) diff --git a/packages/medusa/src/loaders/module.ts b/packages/medusa/src/loaders/module.ts index f5071e88aa..8c882c1429 100644 --- a/packages/medusa/src/loaders/module.ts +++ b/packages/medusa/src/loaders/module.ts @@ -22,9 +22,27 @@ const registerModule = async ( configModule: ConfigModule, logger: Logger ): Promise<{ error?: Error } | void> => { + const constainerName = resolution.definition.registrationName + + const { scope, resources } = resolution.moduleDeclaration ?? {} + if (!scope || (scope === MODULE_SCOPE.INTERNAL && !resources)) { + let message = `The module ${resolution.definition.label} has to define its scope (internal | external)` + if (scope && !resources) { + message = `The module ${resolution.definition.label} is missing its resources config` + } + + container.register({ + [constainerName]: asValue(false), + }) + + return { + error: new Error(message), + } + } + if (!resolution.resolutionPath) { container.register({ - [resolution.definition.registrationName]: asValue(false), + [constainerName]: asValue(false), }) return @@ -48,8 +66,8 @@ const registerModule = async ( } if ( - resolution.moduleDeclaration?.scope === MODULE_SCOPE.INTERNAL && - resolution.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.SHARED + scope === MODULE_SCOPE.INTERNAL && + resources === MODULE_RESOURCE_TYPE.SHARED ) { const moduleModels = loadedModule?.models || null if (moduleModels) { @@ -61,7 +79,7 @@ const registerModule = async ( // TODO: "cradle" should only contain dependent Modules and the EntityManager if module scope is shared container.register({ - [resolution.definition.registrationName]: asFunction((cradle) => { + [constainerName]: asFunction((cradle) => { return new moduleService( cradle, resolution.options,