nuxt-safe-runtime-config
Version:
Validate Nuxt runtime config with Standard Schema at build time
55 lines (54 loc) • 1.63 kB
JavaScript
export function toCamelCase(str) {
return str.toLowerCase().replace(/_([a-z])/g, (_, c) => c.toUpperCase());
}
export function getPrefix(key) {
const parts = key.split("_");
return parts.length > 1 ? parts[0] : null;
}
function countPrefixes(keys) {
const counts = /* @__PURE__ */ new Map();
for (const key of keys) {
const prefix = getPrefix(key);
if (prefix)
counts.set(prefix, (counts.get(prefix) || 0) + 1);
}
return counts;
}
function resolveConfigPath(key, prefixCounts) {
if (key.startsWith("PUBLIC_"))
return ["public", toCamelCase(key.slice(7))];
if (key.startsWith("NUXT_PUBLIC_"))
return ["public", toCamelCase(key.slice(12))];
const prefix = getPrefix(key);
if (prefix && (prefixCounts.get(prefix) || 0) >= 2) {
return [toCamelCase(prefix), toCamelCase(key.slice(prefix.length + 1))];
}
return [toCamelCase(key)];
}
function assignPath(target, path, value) {
if (path.length === 1) {
target[path[0]] = value;
return;
}
const [head, ...tail] = path;
target[head] ??= {};
assignPath(target[head], tail, value);
}
export function buildConfigStructureFromEnvKeys(keys) {
const result = {};
const prefixCounts = countPrefixes(keys);
for (const key of keys) {
const path = resolveConfigPath(key, prefixCounts);
assignPath(result, path, true);
}
return result;
}
export function transformEnvVars(vars) {
const result = {};
const prefixCounts = countPrefixes(vars.map((v) => v.key));
for (const { key, value } of vars) {
const path = resolveConfigPath(key, prefixCounts);
assignPath(result, path, value);
}
return result;
}