astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
52 lines (51 loc) • 1.53 kB
JavaScript
import { fileURLToPath } from "node:url";
import { loadEnv } from "vite";
const isValidIdentifierRe = /^[_$a-zA-Z][\w$]*$/;
function getPrivateEnv({
fullEnv,
viteConfig,
useStatic
}) {
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.some((prefix) => key.startsWith(prefix))) {
continue;
}
if (!useStatic && 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;
}
function getEnv({ mode, config, useStatic }) {
const loaded = loadEnv(mode, config.vite.envDir ?? fileURLToPath(config.root), "");
const privateEnv = getPrivateEnv({ fullEnv: loaded, viteConfig: config.vite, useStatic });
return { loaded, privateEnv };
}
const createEnvLoader = (options) => {
let { loaded, privateEnv } = getEnv(options);
return {
get: () => {
({ loaded, privateEnv } = getEnv(options));
return loaded;
},
getPrivateEnv: () => privateEnv
};
};
export {
createEnvLoader
};