41 lines
1.3 KiB
JavaScript
41 lines
1.3 KiB
JavaScript
import destr from "destr";
|
|
import { snakeCase } from "scule";
|
|
const _runtimeConfig = process.env.RUNTIME_CONFIG;
|
|
const ENV_PREFIX = "NITRO_";
|
|
const ENV_PREFIX_ALT = _runtimeConfig.nitro.envPrefix ?? process.env.NITRO_ENV_PREFIX ?? "_";
|
|
const getEnv = (key) => {
|
|
const envKey = snakeCase(key).toUpperCase();
|
|
return destr(process.env[ENV_PREFIX + envKey] ?? process.env[ENV_PREFIX_ALT + envKey]);
|
|
};
|
|
function isObject(input) {
|
|
return typeof input === "object" && !Array.isArray(input);
|
|
}
|
|
function overrideConfig(obj, parentKey = "") {
|
|
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);
|
|
const config = deepFreeze(_runtimeConfig);
|
|
export const useRuntimeConfig = () => config;
|
|
export default config;
|
|
function deepFreeze(object) {
|
|
const propNames = Object.getOwnPropertyNames(object);
|
|
for (const name of propNames) {
|
|
const value = object[name];
|
|
if (value && typeof value === "object") {
|
|
deepFreeze(value);
|
|
}
|
|
}
|
|
return Object.freeze(object);
|
|
}
|