@agnostack/env
Version:
Please contact agnoStack via info@agnostack.com for any questions
126 lines • 6.64 kB
JavaScript
;
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.replaceEnvTemplate = exports.getPublicEnvValue = exports.parseEnvData = exports.cleanPublicEnv = exports.cleanLowerEnv = exports.publicKeyValidator = exports.lowerKeyValidator = exports.nextKeyValidator = exports.ENV_PREFIXES = exports.ENV_PREFIX = void 0;
const display_1 = require("./display");
exports.ENV_PREFIX = {
NEXT: 'NEXT_PUBLIC_',
VITE: 'VITE_PUBLIC_',
GATSBY: 'GATSBY_',
DEFAULT: 'PUBLIC_',
};
exports.ENV_PREFIXES = Object.values(exports.ENV_PREFIX);
const nextKeyValidator = (envKey) => (
// NOTE: not allowed by NEXT: https://nextjs.org/docs/messages/env-key-not-allowed
!(envKey.startsWith('__') || envKey.startsWith('NODE_')));
exports.nextKeyValidator = nextKeyValidator;
const lowerKeyValidator = (envKey) => ((0, exports.nextKeyValidator)(envKey) &&
/^[^A-Z]*$/.test(envKey));
exports.lowerKeyValidator = lowerKeyValidator;
const publicKeyValidator = (envKey) => (exports.ENV_PREFIXES.some((envPrefix) => envKey === null || envKey === void 0 ? void 0 : envKey.startsWith(envPrefix)) ||
['NODE_ENV', 'PORT', 'ENVIRONMENT', 'DEBUG', 'SCOPES', 'SHOPIFY_API_SCOPES'].includes(envKey));
exports.publicKeyValidator = publicKeyValidator;
// TODO: move to processBatch???
const stringifyEnv = (_env) => (Object.entries(_env !== null && _env !== void 0 ? _env : {}).reduce((__env, [key, val]) => (Object.assign(Object.assign({}, __env), {
// NOTE: DefinePlugin requires stringified
[key]: JSON.stringify(val) })), {}));
// TODO: move to processBatch???
const cleanEnv = (_env, keyValidator = exports.nextKeyValidator) => (Object.entries(_env !== null && _env !== void 0 ? _env : []).reduce((__env, [key, val]) => (Object.assign(Object.assign({}, __env), keyValidator(key) && {
[key]: val,
})), {}));
const cleanLowerEnv = (_env, keyValidator = exports.lowerKeyValidator) => (cleanEnv(process.env, keyValidator));
exports.cleanLowerEnv = cleanLowerEnv;
const cleanPublicEnv = (_env, keyValidator = exports.publicKeyValidator) => (cleanEnv(_env, keyValidator));
exports.cleanPublicEnv = cleanPublicEnv;
const parseEnvData = (_env = process.env) => {
const { ENVIRONMENT, SITE_ENV, BUILD_ENV, NODE_ENV } = _env;
const _environment = [SITE_ENV, BUILD_ENV, NODE_ENV, 'development'].find((value) => (0, display_1.stringNotEmptyOnly)(value));
const mergedEnv = Object.assign(Object.assign({}, _env), {
// NOTE: intentionally giving precedence to ENVIRONMENT
ENVIRONMENT: ENVIRONMENT || _environment });
const _a = process.argv.reduce(({ args: _args, argParams: _argParams, }, arg) => {
var _a, _b;
const [__param, _value, __value] = (_a = arg === null || arg === void 0 ? void 0 : arg.split('=')) !== null && _a !== void 0 ? _a : [];
const _param = (_b = __param === null || __param === void 0 ? void 0 : __param.replace) === null || _b === void 0 ? void 0 : _b.call(__param, '--', '');
if ((0, display_1.stringEmptyOnly)(_param)) {
return {
args: _args,
argParams: _argParams,
};
}
let entry = [_param, _value];
// NOTE: this handles serverless args similar to "--param=env=development"
if ((_param === 'param') && (0, display_1.stringNotEmptyOnly)(_value) && (0, display_1.stringNotEmptyOnly)(__value)) {
entry = [_value, __value];
}
const [param, value] = entry;
return {
args: [
..._args,
...(value == undefined) ? [__param] : []
],
argParams: Object.assign(Object.assign({}, _argParams), (0, display_1.stringNotEmptyOnly)(value) && {
[param]: value,
}),
};
}, {
args: [],
argParams: {},
}), { argParams } = _a, output = __rest(_a, ["argParams"]);
const nextEnv = cleanEnv(mergedEnv);
const publicEnv = (0, exports.cleanPublicEnv)(mergedEnv);
return Object.assign(Object.assign({}, output), { env: mergedEnv, nextEnv,
publicEnv, stringifiedEnv: stringifyEnv(publicEnv), argParams, params: Object.assign(Object.assign({}, mergedEnv), argParams) });
};
exports.parseEnvData = parseEnvData;
const getPublicEnvValue = (publicEnv, key) => {
let envValue;
if ((0, display_1.stringEmptyOnly)(key) || !publicEnv) {
return envValue;
}
if ((0, display_1.stringNotEmptyOnly)(publicEnv === null || publicEnv === void 0 ? void 0 : publicEnv[key])) {
return publicEnv[key];
}
let baseKey = key;
// NOTE: intentionally using for/of loop instead of map so we can break to exit quickly soon as matched
// eslint-disable-next-line no-restricted-syntax
for (const envPrefix of exports.ENV_PREFIXES) {
if (key.startsWith(envPrefix)) {
const trimmedKey = key.slice(envPrefix.length);
if ((0, display_1.stringNotEmptyOnly)(trimmedKey)) {
baseKey = trimmedKey;
break;
}
}
}
const matchableEnvKeys = exports.ENV_PREFIXES.map((envPrefix) => `${envPrefix}${baseKey}`);
// NOTE: intentionally using for/of loop instead of map so we can break to exit quickly soon as matched
// eslint-disable-next-line no-restricted-syntax
for (const matchableEnvKey of matchableEnvKeys) {
envValue = publicEnv[matchableEnvKey];
if ((0, display_1.stringNotEmptyOnly)(envValue)) {
break;
}
}
return envValue;
};
exports.getPublicEnvValue = getPublicEnvValue;
const replaceEnvTemplate = (replaceable, { env: _env = process.env, template = /\{\{process\.env\.(\w+)\}\}/g, callback = (replacedValue) => replacedValue, } = {}) => ((0, display_1.ensureStringOnly)(replaceable).replace(template, (replaceable, variable) => {
const replacedValue = (0, exports.getPublicEnvValue)(_env, variable.trim());
if ((0, display_1.stringEmptyOnly)(replacedValue)) {
return replaceable;
}
return callback(replacedValue, replaceable);
}));
exports.replaceEnvTemplate = replaceEnvTemplate;
//# sourceMappingURL=env.js.map