astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
46 lines (45 loc) • 1.38 kB
JavaScript
import { fileURLToPath } from "node:url";
import { loadEnv } from "vite";
const isValidIdentifierRe = /^[_$a-zA-Z][\w$]*$/;
function getPrivateEnv(fullEnv, astroConfig) {
const viteConfig = astroConfig.vite;
let envPrefixes = ["PUBLIC_"];
if (viteConfig.envPrefix) {
envPrefixes = Array.isArray(viteConfig.envPrefix) ? viteConfig.envPrefix : [viteConfig.envPrefix];
}
const privateEnv = {};
for (const key in fullEnv) {
if (isValidIdentifierRe.test(key) && envPrefixes.every((prefix) => !key.startsWith(prefix))) {
if (typeof process.env[key] !== "undefined") {
let value = process.env[key];
if (typeof value !== "string") {
value = `${value}`;
}
if (value === "0" || value === "1" || value === "true" || value === "false") {
privateEnv[key] = value;
} else {
privateEnv[key] = `process.env.${key}`;
}
} else {
privateEnv[key] = JSON.stringify(fullEnv[key]);
}
}
}
return privateEnv;
}
const createEnvLoader = () => {
let privateEnv = {};
return {
load: (mode, config) => {
const loaded = loadEnv(mode, config.vite.envDir ?? fileURLToPath(config.root), "");
privateEnv = getPrivateEnv(loaded, config);
return loaded;
},
getPrivateEnv: () => {
return privateEnv;
}
};
};
export {
createEnvLoader
};