From c34ffd0e7c2aebc20ced003fe22a85f448d18c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Thu, 20 Mar 2025 19:23:20 +0100 Subject: [PATCH] refactor(core): Refactor custom config types, add additional tests (no-changelog) (#14083) --- .../src/configs/external-hooks.config.ts | 10 +------- .../@n8n/config/src/configs/logging.config.ts | 7 +++--- packages/@n8n/config/src/custom-types.ts | 19 ++++++++++++++ packages/@n8n/config/src/index.ts | 1 + packages/@n8n/config/src/utils.ts | 7 ------ .../@n8n/config/test/custom-types.test.ts | 25 +++++++++++++++++++ 6 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 packages/@n8n/config/src/custom-types.ts delete mode 100644 packages/@n8n/config/src/utils.ts create mode 100644 packages/@n8n/config/test/custom-types.test.ts diff --git a/packages/@n8n/config/src/configs/external-hooks.config.ts b/packages/@n8n/config/src/configs/external-hooks.config.ts index 20c8eb8654..0ecb31294d 100644 --- a/packages/@n8n/config/src/configs/external-hooks.config.ts +++ b/packages/@n8n/config/src/configs/external-hooks.config.ts @@ -1,14 +1,6 @@ +import { ColonSeparatedStringArray } from '../custom-types'; import { Config, Env } from '../decorators'; -class ColonSeparatedStringArray extends Array { - constructor(str: string) { - super(); - const parsed = str.split(':') as this; - const filtered = parsed.filter((i) => typeof i === 'string' && i.length); - return filtered.length ? filtered : []; - } -} - @Config export class ExternalHooksConfig { /** Files containing external hooks. Multiple files can be separated by colon (":") */ diff --git a/packages/@n8n/config/src/configs/logging.config.ts b/packages/@n8n/config/src/configs/logging.config.ts index 733278c3e3..75c1836d2d 100644 --- a/packages/@n8n/config/src/configs/logging.config.ts +++ b/packages/@n8n/config/src/configs/logging.config.ts @@ -1,5 +1,5 @@ +import { CommaSeperatedStringArray } from '../custom-types'; import { Config, Env, Nested } from '../decorators'; -import { StringArray } from '../utils'; /** Scopes (areas of functionality) to filter logs by. */ export const LOG_SCOPES = [ @@ -14,6 +14,7 @@ export const LOG_SCOPES = [ 'scaling', 'waiting-executions', 'task-runner', + 'insights', ] as const; export type LogScope = (typeof LOG_SCOPES)[number]; @@ -57,7 +58,7 @@ export class LoggingConfig { * @example `N8N_LOG_OUTPUT=console,file` will output to both console and file. */ @Env('N8N_LOG_OUTPUT') - outputs: StringArray<'console' | 'file'> = ['console']; + outputs: CommaSeperatedStringArray<'console' | 'file'> = ['console']; @Nested file: FileLoggingConfig; @@ -84,5 +85,5 @@ export class LoggingConfig { * `N8N_LOG_SCOPES=license,waiting-executions` */ @Env('N8N_LOG_SCOPES') - scopes: StringArray = []; + scopes: CommaSeperatedStringArray = []; } diff --git a/packages/@n8n/config/src/custom-types.ts b/packages/@n8n/config/src/custom-types.ts new file mode 100644 index 0000000000..b89cad1597 --- /dev/null +++ b/packages/@n8n/config/src/custom-types.ts @@ -0,0 +1,19 @@ +abstract class StringArray extends Array { + constructor(str: string, delimiter: string) { + super(); + const parsed = str.split(delimiter) as this; + return parsed.filter((i) => typeof i === 'string' && i.length); + } +} + +export class CommaSeperatedStringArray extends StringArray { + constructor(str: string) { + super(str, ','); + } +} + +export class ColonSeparatedStringArray extends StringArray { + constructor(str: string) { + super(str, ':'); + } +} diff --git a/packages/@n8n/config/src/index.ts b/packages/@n8n/config/src/index.ts index e86a6ab478..bc7d88ae60 100644 --- a/packages/@n8n/config/src/index.ts +++ b/packages/@n8n/config/src/index.ts @@ -36,6 +36,7 @@ export { S3Config } from './configs/external-storage.config'; export { LOG_SCOPES } from './configs/logging.config'; export type { LogScope } from './configs/logging.config'; export { WorkflowsConfig } from './configs/workflows.config'; +export * from './custom-types'; @Config export class GlobalConfig { diff --git a/packages/@n8n/config/src/utils.ts b/packages/@n8n/config/src/utils.ts deleted file mode 100644 index c90fcb8266..0000000000 --- a/packages/@n8n/config/src/utils.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class StringArray extends Array { - constructor(str: string) { - super(); - const parsed = str.split(',') as StringArray; - return parsed.every((i) => typeof i === 'string') ? parsed : []; - } -} diff --git a/packages/@n8n/config/test/custom-types.test.ts b/packages/@n8n/config/test/custom-types.test.ts new file mode 100644 index 0000000000..0e1ca80872 --- /dev/null +++ b/packages/@n8n/config/test/custom-types.test.ts @@ -0,0 +1,25 @@ +import { CommaSeperatedStringArray, ColonSeparatedStringArray } from '../src/custom-types'; + +describe('CommaSeperatedStringArray', () => { + it('should parse comma-separated string into array', () => { + const result = new CommaSeperatedStringArray('a,b,c'); + expect(result).toEqual(['a', 'b', 'c']); + }); + + it('should handle empty strings', () => { + const result = new CommaSeperatedStringArray('a,b,,,'); + expect(result).toEqual(['a', 'b']); + }); +}); + +describe('ColonSeparatedStringArray', () => { + it('should parse colon-separated string into array', () => { + const result = new ColonSeparatedStringArray('a:b:c'); + expect(result).toEqual(['a', 'b', 'c']); + }); + + it('should handle empty strings', () => { + const result = new ColonSeparatedStringArray('a::b:::'); + expect(result).toEqual(['a', 'b']); + }); +});