UNPKG

nuxt-safe-runtime-config

Version:

Validate Nuxt runtime config with Standard Schema at build time

55 lines (54 loc) 1.63 kB
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; }