61 lines
1.5 KiB
JavaScript
61 lines
1.5 KiB
JavaScript
import { fileURLToPath } from "node:url";
|
|
import { loadEnv } from "vite";
|
|
const isValidIdentifierRe = /^[_$a-zA-Z][\w$]*$/;
|
|
function getSecretKeys(envSchema) {
|
|
const secrets = /* @__PURE__ */ new Set();
|
|
for (const [key, options] of Object.entries(envSchema)) {
|
|
if (options.access === "secret") {
|
|
secrets.add(key);
|
|
}
|
|
}
|
|
return secrets;
|
|
}
|
|
function getPrivateEnv({
|
|
fullEnv,
|
|
viteConfig,
|
|
envSchema
|
|
}) {
|
|
let envPrefixes = ["PUBLIC_"];
|
|
if (viteConfig.envPrefix) {
|
|
envPrefixes = Array.isArray(viteConfig.envPrefix) ? viteConfig.envPrefix : [viteConfig.envPrefix];
|
|
}
|
|
const secretKeys = getSecretKeys(envSchema);
|
|
const privateEnv = {};
|
|
for (const key in fullEnv) {
|
|
if (!isValidIdentifierRe.test(key)) {
|
|
continue;
|
|
}
|
|
if (secretKeys.has(key)) {
|
|
privateEnv[key] = JSON.stringify(fullEnv[key]);
|
|
continue;
|
|
}
|
|
if (envPrefixes.some((prefix) => key.startsWith(prefix))) {
|
|
continue;
|
|
}
|
|
privateEnv[key] = JSON.stringify(fullEnv[key]);
|
|
}
|
|
return privateEnv;
|
|
}
|
|
function getEnv({ mode, config }) {
|
|
const loaded = loadEnv(mode, config.vite.envDir ?? fileURLToPath(config.root), "");
|
|
const privateEnv = getPrivateEnv({
|
|
fullEnv: loaded,
|
|
viteConfig: config.vite,
|
|
envSchema: config.env.schema
|
|
});
|
|
return { loaded, privateEnv };
|
|
}
|
|
const createEnvLoader = (options) => {
|
|
let { loaded, privateEnv } = getEnv(options);
|
|
return {
|
|
get: () => {
|
|
({ loaded, privateEnv } = getEnv(options));
|
|
return loaded;
|
|
},
|
|
getPrivateEnv: () => privateEnv
|
|
};
|
|
};
|
|
export {
|
|
createEnvLoader
|
|
};
|