From 2e2e3ce22df957461e1bb687b76b9b03a5371e26 Mon Sep 17 00:00:00 2001 From: David de Kloet Date: Thu, 9 Jul 2026 10:33:47 +0200 Subject: [PATCH] Add getEnvVarName to variable env vars --- src/config/index.ts | 22 +++++++++++++++++----- test/config.test.ts | 21 +++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/config/index.ts b/src/config/index.ts index f6e72c95..1e7fac07 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -532,6 +532,7 @@ type VariableEnvVarEntry = { export interface Getter { get(variable: string): T + getEnvVarName(variable: string): string entries(): VariableEnvVarEntry>[] } @@ -593,8 +594,12 @@ export class EnvGetter< ) } + private getCanonicalVariable(variable: string): string { + return variable.replace(/\W/g, '_').toUpperCase() + } + get(variable: string): SettingType { - const canonicalVariable = variable.replace(/\W/g, '_').toUpperCase() + const canonicalVariable = this.getCanonicalVariable(variable) if (canonicalVariable in this.variableMap) { return this.variableMap[canonicalVariable].value as SettingType } @@ -604,16 +609,23 @@ export class EnvGetter< if (!this.settingsDefinition.required) { return undefined as SettingType } - const envName = getEnvName( - this.name.replace(this.settingsDefinition.variablePlaceholder, canonicalVariable), - this.prefix, - ) + const envName = this.getEnvVarName(variable) throw new AdapterError({ statusCode: 500, message: `Missing required environment variable: ${envName}`, }) } + getEnvVarName(variable: string): string { + return getEnvName( + this.name.replace( + this.settingsDefinition.variablePlaceholder, + this.getCanonicalVariable(variable), + ), + this.prefix, + ) + } + entries(): VariableEnvVarEntry>[] { return Object.values(this.variableMap) } diff --git a/test/config.test.ts b/test/config.test.ts index 3a7278b0..332de5c6 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -526,6 +526,27 @@ test.serial('Get variable env var entries', async (t) => { ]) }) +test.serial('Get variable env var name', async (t) => { + const envVarsPrefix = 'PREFIX' + const customSettings = { + NETWORK_NETWORK_TYPE: { + description: 'Network type for the given blockchain', + type: 'enum', + options: ['mainnet', 'testnet'], + variablePlaceholder: 'NETWORK', + }, + } as const + + const config = new AdapterConfig(customSettings, { envVarsPrefix }) + config.initialize() + config.validate() + t.is( + config.settings.NETWORK_NETWORK_TYPE.getEnvVarName('ethereum'), + 'PREFIX_ETHEREUM_NETWORK_TYPE', + ) + t.is(config.settings.NETWORK_NETWORK_TYPE.getEnvVarName('a.b$c'), 'PREFIX_A_B_C_NETWORK_TYPE') +}) + test.serial('Setting name must not have invalid characters', async (t) => { const customSettings = { 'NETWORK-RPC-URL': {