diff --git a/packages/cli/src/commands/base-command.ts b/packages/cli/src/commands/base-command.ts index 91600bbdd0..a7ba2a3a0c 100644 --- a/packages/cli/src/commands/base-command.ts +++ b/packages/cli/src/commands/base-command.ts @@ -11,7 +11,6 @@ import { ObjectStoreService, DataDeduplicationService, ErrorReporter, - ExternalSecretsProxy, } from 'n8n-core'; import { ensureError, sleep, UserError } from 'n8n-workflow'; @@ -26,7 +25,6 @@ import { TestRunCleanupService } from '@/evaluation.ee/test-runner/test-run-clea import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; import { TelemetryEventRelay } from '@/events/relays/telemetry.event-relay'; import { ExternalHooks } from '@/external-hooks'; -import { ExternalSecretsManager } from '@/external-secrets.ee/external-secrets-manager.ee'; import { License } from '@/license'; import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { ModuleRegistry } from '@/modules/module-registry'; @@ -88,7 +86,6 @@ export abstract class BaseCommand extends Command { instance: this.instanceSettings, }) ) { - // register module in the registry for the dependency injection await import(`../modules/${moduleName}/${moduleName}.module`); this.modulesConfig.addLoadedModule(moduleName); @@ -276,12 +273,6 @@ export abstract class BaseCommand extends Command { } } - async initExternalSecrets() { - const secretsManager = Container.get(ExternalSecretsManager); - await secretsManager.init(); - Container.get(ExternalSecretsProxy).setManager(secretsManager); - } - initWorkflowHistory() { Container.get(WorkflowHistoryManager).init(); } diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index acfce1e123..c821e1b040 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -232,8 +232,6 @@ export class Start extends BaseCommand { this.logger.debug('Data deduplication service init complete'); await this.initExternalHooks(); this.logger.debug('External hooks init complete'); - await this.initExternalSecrets(); - this.logger.debug('External secrets init complete'); this.initWorkflowHistory(); this.logger.debug('Workflow history init complete'); diff --git a/packages/cli/src/commands/webhook.ts b/packages/cli/src/commands/webhook.ts index e4c01eb283..f51b289fd2 100644 --- a/packages/cli/src/commands/webhook.ts +++ b/packages/cli/src/commands/webhook.ts @@ -77,8 +77,6 @@ export class Webhook extends BaseCommand { this.logger.debug('Data deduplication service init complete'); await this.initExternalHooks(); this.logger.debug('External hooks init complete'); - await this.initExternalSecrets(); - this.logger.debug('External secrets init complete'); await this.loadModules(); } diff --git a/packages/cli/src/commands/worker.ts b/packages/cli/src/commands/worker.ts index 630c3ce8f3..9d662f4842 100644 --- a/packages/cli/src/commands/worker.ts +++ b/packages/cli/src/commands/worker.ts @@ -94,8 +94,6 @@ export class Worker extends BaseCommand { this.logger.debug('Data deduplication service init complete'); await this.initExternalHooks(); this.logger.debug('External hooks init complete'); - await this.initExternalSecrets(); - this.logger.debug('External secrets init complete'); await this.initEventBus(); this.logger.debug('Event bus init complete'); await this.initScalingService(); diff --git a/packages/cli/src/modules/__tests__/modules.config.test.ts b/packages/cli/src/modules/__tests__/modules.config.test.ts index 5136f9b65b..135031dd6c 100644 --- a/packages/cli/src/modules/__tests__/modules.config.test.ts +++ b/packages/cli/src/modules/__tests__/modules.config.test.ts @@ -12,19 +12,19 @@ describe('ModulesConfig', () => { it('should initialize with insights modules if no environment variable is set', () => { const config = Container.get(ModulesConfig); - expect(config.modules).toEqual(['insights']); + expect(config.modules).toEqual(['insights', 'external-secrets.ee']); }); it('should parse valid module names from environment variable', () => { process.env.N8N_ENABLED_MODULES = 'insights'; const config = Container.get(ModulesConfig); - expect(config.modules).toEqual(['insights']); + expect(config.modules).toEqual(['insights', 'external-secrets.ee']); }); it('should disable valid module names from environment variable', () => { process.env.N8N_DISABLED_MODULES = 'insights'; const config = Container.get(ModulesConfig); - expect(config.modules).toEqual([]); + expect(config.modules).toEqual(['external-secrets.ee']); }); it('should throw UnexpectedError for invalid module names', () => { diff --git a/packages/cli/src/external-secrets.ee/__tests__/external-secrets-manager.ee.test.ts b/packages/cli/src/modules/external-secrets.ee/__tests__/external-secrets-manager.ee.test.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/__tests__/external-secrets-manager.ee.test.ts rename to packages/cli/src/modules/external-secrets.ee/__tests__/external-secrets-manager.ee.test.ts diff --git a/packages/cli/src/external-secrets.ee/constants.ts b/packages/cli/src/modules/external-secrets.ee/constants.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/constants.ts rename to packages/cli/src/modules/external-secrets.ee/constants.ts diff --git a/packages/cli/src/external-secrets.ee/errors/unknown-auth-type.error.ts b/packages/cli/src/modules/external-secrets.ee/errors/unknown-auth-type.error.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/errors/unknown-auth-type.error.ts rename to packages/cli/src/modules/external-secrets.ee/errors/unknown-auth-type.error.ts diff --git a/packages/cli/src/external-secrets.ee/external-secrets-manager.ee.ts b/packages/cli/src/modules/external-secrets.ee/external-secrets-manager.ee.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/external-secrets-manager.ee.ts rename to packages/cli/src/modules/external-secrets.ee/external-secrets-manager.ee.ts diff --git a/packages/cli/src/external-secrets.ee/external-secrets-providers.ee.ts b/packages/cli/src/modules/external-secrets.ee/external-secrets-providers.ee.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/external-secrets-providers.ee.ts rename to packages/cli/src/modules/external-secrets.ee/external-secrets-providers.ee.ts diff --git a/packages/cli/src/external-secrets.ee/external-secrets.config.ts b/packages/cli/src/modules/external-secrets.ee/external-secrets.config.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/external-secrets.config.ts rename to packages/cli/src/modules/external-secrets.ee/external-secrets.config.ts diff --git a/packages/cli/src/external-secrets.ee/external-secrets.controller.ee.ts b/packages/cli/src/modules/external-secrets.ee/external-secrets.controller.ee.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/external-secrets.controller.ee.ts rename to packages/cli/src/modules/external-secrets.ee/external-secrets.controller.ee.ts diff --git a/packages/cli/src/modules/external-secrets.ee/external-secrets.ee.module.ts b/packages/cli/src/modules/external-secrets.ee/external-secrets.ee.module.ts new file mode 100644 index 0000000000..55ce55f6a3 --- /dev/null +++ b/packages/cli/src/modules/external-secrets.ee/external-secrets.ee.module.ts @@ -0,0 +1,20 @@ +import type { BaseN8nModule } from '@n8n/decorators'; +import { N8nModule } from '@n8n/decorators'; +import { ExternalSecretsProxy } from 'n8n-core'; + +import { ExternalSecretsManager } from './external-secrets-manager.ee'; +import './external-secrets.controller.ee'; + +@N8nModule() +export class ExternalSecretsModule implements BaseN8nModule { + constructor( + private readonly manager: ExternalSecretsManager, + private readonly externalSecretsProxy: ExternalSecretsProxy, + ) {} + + async initialize() { + const { externalSecretsProxy, manager } = this; + await manager.init(); + externalSecretsProxy.setManager(manager); + } +} diff --git a/packages/cli/src/external-secrets.ee/external-secrets.service.ee.ts b/packages/cli/src/modules/external-secrets.ee/external-secrets.service.ee.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/external-secrets.service.ee.ts rename to packages/cli/src/modules/external-secrets.ee/external-secrets.service.ee.ts diff --git a/packages/cli/src/external-secrets.ee/providers/__tests__/aws-secrets-manager.test.ts b/packages/cli/src/modules/external-secrets.ee/providers/__tests__/aws-secrets-manager.test.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/__tests__/aws-secrets-manager.test.ts rename to packages/cli/src/modules/external-secrets.ee/providers/__tests__/aws-secrets-manager.test.ts diff --git a/packages/cli/src/external-secrets.ee/providers/__tests__/azure-key-vault.test.ts b/packages/cli/src/modules/external-secrets.ee/providers/__tests__/azure-key-vault.test.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/__tests__/azure-key-vault.test.ts rename to packages/cli/src/modules/external-secrets.ee/providers/__tests__/azure-key-vault.test.ts diff --git a/packages/cli/src/external-secrets.ee/providers/__tests__/gcp-secrets-manager.test.ts b/packages/cli/src/modules/external-secrets.ee/providers/__tests__/gcp-secrets-manager.test.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/__tests__/gcp-secrets-manager.test.ts rename to packages/cli/src/modules/external-secrets.ee/providers/__tests__/gcp-secrets-manager.test.ts diff --git a/packages/cli/src/external-secrets.ee/providers/aws-secrets-manager.ts b/packages/cli/src/modules/external-secrets.ee/providers/aws-secrets-manager.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/aws-secrets-manager.ts rename to packages/cli/src/modules/external-secrets.ee/providers/aws-secrets-manager.ts diff --git a/packages/cli/src/external-secrets.ee/providers/azure-key-vault/azure-key-vault.ts b/packages/cli/src/modules/external-secrets.ee/providers/azure-key-vault/azure-key-vault.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/azure-key-vault/azure-key-vault.ts rename to packages/cli/src/modules/external-secrets.ee/providers/azure-key-vault/azure-key-vault.ts diff --git a/packages/cli/src/external-secrets.ee/providers/azure-key-vault/types.ts b/packages/cli/src/modules/external-secrets.ee/providers/azure-key-vault/types.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/azure-key-vault/types.ts rename to packages/cli/src/modules/external-secrets.ee/providers/azure-key-vault/types.ts diff --git a/packages/cli/src/external-secrets.ee/providers/gcp-secrets-manager/gcp-secrets-manager.ts b/packages/cli/src/modules/external-secrets.ee/providers/gcp-secrets-manager/gcp-secrets-manager.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/gcp-secrets-manager/gcp-secrets-manager.ts rename to packages/cli/src/modules/external-secrets.ee/providers/gcp-secrets-manager/gcp-secrets-manager.ts diff --git a/packages/cli/src/external-secrets.ee/providers/gcp-secrets-manager/types.ts b/packages/cli/src/modules/external-secrets.ee/providers/gcp-secrets-manager/types.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/gcp-secrets-manager/types.ts rename to packages/cli/src/modules/external-secrets.ee/providers/gcp-secrets-manager/types.ts diff --git a/packages/cli/src/external-secrets.ee/providers/infisical.ts b/packages/cli/src/modules/external-secrets.ee/providers/infisical.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/infisical.ts rename to packages/cli/src/modules/external-secrets.ee/providers/infisical.ts diff --git a/packages/cli/src/external-secrets.ee/providers/vault.ts b/packages/cli/src/modules/external-secrets.ee/providers/vault.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/providers/vault.ts rename to packages/cli/src/modules/external-secrets.ee/providers/vault.ts diff --git a/packages/cli/src/external-secrets.ee/types.ts b/packages/cli/src/modules/external-secrets.ee/types.ts similarity index 100% rename from packages/cli/src/external-secrets.ee/types.ts rename to packages/cli/src/modules/external-secrets.ee/types.ts diff --git a/packages/cli/src/modules/modules.config.ts b/packages/cli/src/modules/modules.config.ts index 9f94280d8d..6d3fa5e3b8 100644 --- a/packages/cli/src/modules/modules.config.ts +++ b/packages/cli/src/modules/modules.config.ts @@ -10,7 +10,7 @@ export type ModulePreInit = { shouldLoadModule: (ctx: ModulePreInitContext) => boolean; }; -const moduleNames = ['insights'] as const; +const moduleNames = ['insights', 'external-secrets.ee'] as const; export type ModuleName = (typeof moduleNames)[number]; class Modules extends CommaSeparatedStringArray { @@ -36,7 +36,7 @@ export class ModulesConfig { disabledModules: Modules = []; // Default modules are always enabled unless explicitly disabled - private readonly defaultModules: ModuleName[] = ['insights']; + private readonly defaultModules: ModuleName[] = ['insights', 'external-secrets.ee']; // Loaded modules are the ones that have been loaded so far by the instance readonly loadedModules = new Set(); diff --git a/packages/cli/src/server.ts b/packages/cli/src/server.ts index 09064d7ce5..26022a663c 100644 --- a/packages/cli/src/server.ts +++ b/packages/cli/src/server.ts @@ -56,7 +56,6 @@ import '@/credentials/credentials.controller'; import '@/eventbus/event-bus.controller'; import '@/events/events.controller'; import '@/executions/executions.controller'; -import '@/external-secrets.ee/external-secrets.controller.ee'; import '@/license/license.controller'; import '@/evaluation.ee/test-runs.controller.ee'; import '@/workflows/workflow-history.ee/workflow-history.controller.ee'; diff --git a/packages/cli/test/integration/commands/worker.cmd.test.ts b/packages/cli/test/integration/commands/worker.cmd.test.ts index cb7c46146c..b8c767b1dd 100644 --- a/packages/cli/test/integration/commands/worker.cmd.test.ts +++ b/packages/cli/test/integration/commands/worker.cmd.test.ts @@ -9,7 +9,6 @@ import config from '@/config'; import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; import { LogStreamingEventRelay } from '@/events/relays/log-streaming.event-relay'; import { ExternalHooks } from '@/external-hooks'; -import { ExternalSecretsManager } from '@/external-secrets.ee/external-secrets-manager.ee'; import { License } from '@/license'; import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials'; import { Push } from '@/push'; @@ -31,7 +30,6 @@ mockInstance(LoadNodesAndCredentials); const binaryDataService = mockInstance(BinaryDataService); const communityPackagesService = mockInstance(CommunityPackagesService); const externalHooks = mockInstance(ExternalHooks); -const externalSecretsManager = mockInstance(ExternalSecretsManager); const license = mockInstance(License, { loadCertStr: async () => '' }); const messageEventBus = mockInstance(MessageEventBus); const logStreamingEventRelay = mockInstance(LogStreamingEventRelay); @@ -54,7 +52,6 @@ test('worker initializes all its components', async () => { expect(binaryDataService.init).toHaveBeenCalledTimes(1); expect(communityPackagesService.init).toHaveBeenCalledTimes(1); expect(externalHooks.init).toHaveBeenCalledTimes(1); - expect(externalSecretsManager.init).toHaveBeenCalledTimes(1); expect(messageEventBus.initialize).toHaveBeenCalledTimes(1); expect(scalingService.setupQueue).toHaveBeenCalledTimes(1); expect(scalingService.setupWorker).toHaveBeenCalledTimes(1); diff --git a/packages/cli/test/integration/external-secrets/external-secrets.api.test.ts b/packages/cli/test/integration/external-secrets/external-secrets.api.test.ts index ae58970133..ef549db13a 100644 --- a/packages/cli/test/integration/external-secrets/external-secrets.api.test.ts +++ b/packages/cli/test/integration/external-secrets/external-secrets.api.test.ts @@ -7,10 +7,13 @@ import type { IDataObject } from 'n8n-workflow'; import config from '@/config'; import { CREDENTIAL_BLANKING_VALUE } from '@/constants'; import type { EventService } from '@/events/event.service'; -import { ExternalSecretsManager } from '@/external-secrets.ee/external-secrets-manager.ee'; -import { ExternalSecretsProviders } from '@/external-secrets.ee/external-secrets-providers.ee'; -import type { ExternalSecretsSettings, SecretsProviderState } from '@/external-secrets.ee/types'; import { License } from '@/license'; +import { ExternalSecretsManager } from '@/modules/external-secrets.ee/external-secrets-manager.ee'; +import { ExternalSecretsProviders } from '@/modules/external-secrets.ee/external-secrets-providers.ee'; +import type { + ExternalSecretsSettings, + SecretsProviderState, +} from '@/modules/external-secrets.ee/types'; import { DummyProvider, diff --git a/packages/cli/test/integration/shared/utils/test-server.ts b/packages/cli/test/integration/shared/utils/test-server.ts index 926b9ea672..6084402216 100644 --- a/packages/cli/test/integration/shared/utils/test-server.ts +++ b/packages/cli/test/integration/shared/utils/test-server.ts @@ -250,10 +250,6 @@ export const setupTestServer = ({ await import('@/controllers/tags.controller'); break; - case 'externalSecrets': - await import('@/external-secrets.ee/external-secrets.controller.ee'); - break; - case 'workflowHistory': await import('@/workflows/workflow-history.ee/workflow-history.controller.ee'); break; @@ -292,8 +288,11 @@ export const setupTestServer = ({ case 'folder': await import('@/controllers/folder.controller'); + case 'externalSecrets': + await import('@/modules/external-secrets.ee/external-secrets.ee.module'); + case 'insights': - await import('@/modules/insights/insights.controller'); + await import('@/modules/insights/insights.module'); } } diff --git a/packages/cli/test/shared/external-secrets/utils.ts b/packages/cli/test/shared/external-secrets/utils.ts index ff379c24c9..8df1b90f09 100644 --- a/packages/cli/test/shared/external-secrets/utils.ts +++ b/packages/cli/test/shared/external-secrets/utils.ts @@ -1,7 +1,10 @@ import type { IDataObject, INodeProperties } from 'n8n-workflow'; -import { SecretsProvider } from '@/external-secrets.ee/types'; -import type { SecretsProviderSettings, SecretsProviderState } from '@/external-secrets.ee/types'; +import { SecretsProvider } from '@/modules/external-secrets.ee/types'; +import type { + SecretsProviderSettings, + SecretsProviderState, +} from '@/modules/external-secrets.ee/types'; export class MockProviders { providers: Record = {