From 1be5ac2e89035ce98f50edaa8e7c79ba4e974adf Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 22 Apr 2022 20:09:59 +0100 Subject: [PATCH] fix: manually merge runtime config with env (#143) Co-authored-by: Pooya Parsa --- src/runtime/config.ts | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/runtime/config.ts b/src/runtime/config.ts index 0ca7543205..eb9ccd79c1 100644 --- a/src/runtime/config.ts +++ b/src/runtime/config.ts @@ -1,6 +1,5 @@ import destr from 'destr' import { snakeCase } from 'scule' -import { createDefu } from 'defu' // Bundled runtime config (injected by nitro) const _runtimeConfig = process.env.RUNTIME_CONFIG as any @@ -13,18 +12,27 @@ const getEnv = (key: string) => { const envKey = snakeCase(key).toUpperCase() return destr(process.env[ENV_PREFIX + envKey] ?? process.env[ENV_PREFIX_ALT + envKey]) } - -const mergeWithEnvVariables = createDefu((obj: Record, key: string, _value, namespace) => { - // key: { subKey } can be overridden by KEY_SUB_KEY` - const override = getEnv(namespace ? `${namespace}.${key}` : key) - if (override !== undefined) { - obj[key] = override - return true +function isObject (input: unknown) { + return typeof input === 'object' && !Array.isArray(input) +} +function overrideConfig (obj: object, parentKey: string = '') { + for (const key in obj) { + const subKey = parentKey ? `${parentKey}_${key}` : key + const envValue = getEnv(subKey) + if (isObject(obj[key])) { + if (isObject(envValue)) { + obj[key] = { ...obj[key], ...envValue } + } + overrideConfig(obj[key], subKey) + } else { + obj[key] = envValue ?? obj[key] + } } -}) +} +overrideConfig(_runtimeConfig) // Named exports -const config = deepFreeze(mergeWithEnvVariables(_runtimeConfig, _runtimeConfig)) +const config = deepFreeze(_runtimeConfig) export const useRuntimeConfig = () => config export default config