From c001e020b09d4bffc66e61f234b6773e49aa9c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 4 Aug 2025 15:24:39 +0200 Subject: [PATCH] fix(core): Address feedback on modules (no-changelog) (#17966) --- .../modules/__tests__/module-registry.test.ts | 24 ++++++++++++++++++- .../src/modules/module-registry.ts | 4 +--- packages/@n8n/decorators/src/module/module.ts | 8 ++++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts b/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts index f4109d9027..cdb761cc34 100644 --- a/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts +++ b/packages/@n8n/backend-common/src/modules/__tests__/module-registry.test.ts @@ -161,7 +161,7 @@ describe('initModules', () => { expect(moduleRegistry.settings.get(moduleName)).toBe(moduleSettings); }); - it('activates the module', async () => { + it('activates module with settings', async () => { // ARRANGE const moduleName = 'test-module'; const moduleSettings = { foo: 1 }; @@ -184,4 +184,26 @@ describe('initModules', () => { expect(moduleRegistry.isActive(moduleName as any)).toBe(true); expect(moduleRegistry.getActiveModules()).toEqual([moduleName]); }); + + it('activates module without settings', async () => { + // ARRANGE + const moduleName = 'test-module'; + const ModuleClass: ModuleInterface = { + init: jest.fn(), + }; + const moduleMetadata = mock({ + getEntries: jest.fn().mockReturnValue([[moduleName, { class: ModuleClass }]]), + }); + Container.get = jest.fn().mockReturnValue(ModuleClass); + + const moduleRegistry = new ModuleRegistry(moduleMetadata, mock(), mock(), mock()); + + // ACT + await moduleRegistry.initModules(); + + // ASSERT + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(moduleRegistry.isActive(moduleName as any)).toBe(true); + expect(moduleRegistry.getActiveModules()).toEqual([moduleName]); + }); }); diff --git a/packages/@n8n/backend-common/src/modules/module-registry.ts b/packages/@n8n/backend-common/src/modules/module-registry.ts index 3cf446a689..d192bc4165 100644 --- a/packages/@n8n/backend-common/src/modules/module-registry.ts +++ b/packages/@n8n/backend-common/src/modules/module-registry.ts @@ -106,9 +106,7 @@ export class ModuleRegistry { const moduleSettings = await Container.get(ModuleClass).settings?.(); - if (!moduleSettings) continue; - - this.settings.set(moduleName, moduleSettings); + if (moduleSettings) this.settings.set(moduleName, moduleSettings); this.logger.debug(`Initialized module "${moduleName}"`); diff --git a/packages/@n8n/decorators/src/module/module.ts b/packages/@n8n/decorators/src/module/module.ts index 7ba91dd68b..3f29e99b29 100644 --- a/packages/@n8n/decorators/src/module/module.ts +++ b/packages/@n8n/decorators/src/module/module.ts @@ -16,7 +16,13 @@ export interface BaseEntity { reload(): Promise; } -export type EntityClass = new () => BaseEntity; +export interface TimestampedEntity { + id: string; + createdAt: Date; + updatedAt: Date; +} + +export type EntityClass = new () => BaseEntity | TimestampedEntity; export type ModuleSettings = Record;