next-page-tester
Version:
Enable DOM integration testing on Next.js pages
79 lines (78 loc) • 3.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cleanupEnvVars = exports.loadBaseEnvironment = exports.setEnvVars = void 0;
const path_1 = __importDefault(require("path"));
const fs_1 = require("fs");
const dotenv_1 = __importDefault(require("dotenv"));
const dotenv_expand_1 = __importDefault(require("dotenv-expand"));
const nextConfig_1 = require("./nextConfig");
const constants_1 = require("./constants");
const { SERVER, CLIENT } = constants_1.RuntimeEnvironment;
const CLIENT_PASSTHROUGH_VARS = new Set(['NODE_ENV']);
function getEnvVarsByEnvironment(vars) {
const serverVars = { ...vars };
const clientVars = { ...vars };
for (const varName in vars) {
if (CLIENT_PASSTHROUGH_VARS.has(varName)) {
continue;
}
// @NOTE __NEXT_* vars are used internally by Next.js
if (!varName.startsWith('NEXT_PUBLIC_') && !varName.startsWith('__NEXT')) {
delete clientVars[varName];
}
}
return { [SERVER]: serverVars, [CLIENT]: clientVars };
}
// @NOTE Next.js env var handling implementation is available here:
// https://github.com/vercel/next.js/tree/v10.0.5/test/integration/env-config
// We can't use it as long as this doesn't get fixed:
// https://github.com/vercel/next.js/issues/21296
function loadDotFile({ nextRoot, dotenvFile: dotenvFileRelativePath, }) {
if (!dotenvFileRelativePath) {
return {};
}
const dotenvFilePath = path_1.default.resolve(nextRoot, dotenvFileRelativePath);
if ((0, fs_1.existsSync)(dotenvFilePath)) {
const dotenvResult = (0, dotenv_expand_1.default)({
parsed: dotenv_1.default.parse((0, fs_1.readFileSync)(dotenvFilePath)),
// @ts-expect-error dotenv-expand type definition is out of date
ignoreProcessEnv: true,
});
/* istanbul ignore if */
if (!dotenvResult.parsed) {
return {};
}
return dotenvResult.parsed;
}
else {
console.warn(`[next-page-tester] Cannot find env file at path: ${dotenvFilePath}`);
return {};
}
}
const originalEnvVars = process.env;
let baseEnvVars = originalEnvVars;
function setEnvVars({ runtimeEnv, }) {
const { env: envVarsFromConfig } = (0, nextConfig_1.getNextConfig)();
// Runtime and dotfile env vars are scoped by environment (via NEXT_PUBLIC_ prefix),
// while env vars coming from next.config.js are available in both environments
process.env = {
...getEnvVarsByEnvironment(baseEnvVars)[runtimeEnv],
...envVarsFromConfig,
};
}
exports.setEnvVars = setEnvVars;
function loadBaseEnvironment({ nextRoot, dotenvFile, }) {
const dotenv = loadDotFile({ nextRoot, dotenvFile });
baseEnvVars = { ...dotenv, ...process.env };
process.env = baseEnvVars;
}
exports.loadBaseEnvironment = loadBaseEnvironment;
function cleanupEnvVars() {
if (process.env !== originalEnvVars) {
process.env = originalEnvVars;
}
}
exports.cleanupEnvVars = cleanupEnvVars;