You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.8 KiB
141 lines
4.8 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.generateDotenvFilename = exports.toDotenvFormat = exports.hydrateEnvs = exports.configToEnv = exports.convertKey = exports.hydrateConfigs = exports.getProjectInfos = void 0;
|
|
const clc = require("colorette");
|
|
const env = require("./env");
|
|
const functionsConfig = require("../functionsConfig");
|
|
const error_1 = require("../error");
|
|
const logger_1 = require("../logger");
|
|
const projectUtils_1 = require("../projectUtils");
|
|
const rc_1 = require("../rc");
|
|
const utils_1 = require("../utils");
|
|
const functional_1 = require("../functional");
|
|
function getProjectInfos(options) {
|
|
const result = {};
|
|
const rc = (0, rc_1.loadRC)(options);
|
|
if (rc.projects) {
|
|
for (const [alias, projectId] of Object.entries(rc.projects)) {
|
|
if (Object.keys(result).includes(projectId)) {
|
|
(0, utils_1.logWarning)(`Multiple aliases found for ${clc.bold(projectId)}. ` +
|
|
`Preferring alias (${clc.bold(result[projectId])}) over (${clc.bold(alias)}).`);
|
|
continue;
|
|
}
|
|
result[projectId] = alias;
|
|
}
|
|
}
|
|
const projectId = (0, projectUtils_1.getProjectId)(options);
|
|
if (projectId && !Object.keys(result).includes(projectId)) {
|
|
result[projectId] = projectId;
|
|
}
|
|
return Object.entries(result).map(([k, v]) => {
|
|
const result = { projectId: k };
|
|
if (k !== v) {
|
|
result.alias = v;
|
|
}
|
|
return result;
|
|
});
|
|
}
|
|
exports.getProjectInfos = getProjectInfos;
|
|
async function hydrateConfigs(pInfos) {
|
|
const hydrate = pInfos.map((info) => {
|
|
return functionsConfig
|
|
.materializeAll(info.projectId)
|
|
.then((config) => {
|
|
info.config = config;
|
|
return;
|
|
})
|
|
.catch((err) => {
|
|
logger_1.logger.debug(`Failed to fetch runtime config for project ${info.projectId}: ${err.message}`);
|
|
});
|
|
});
|
|
await Promise.all(hydrate);
|
|
}
|
|
exports.hydrateConfigs = hydrateConfigs;
|
|
function convertKey(configKey, prefix) {
|
|
const baseKey = configKey
|
|
.toUpperCase()
|
|
.replace(/\./g, "_")
|
|
.replace(/-/g, "_");
|
|
let envKey = baseKey;
|
|
try {
|
|
env.validateKey(envKey);
|
|
}
|
|
catch (err) {
|
|
if (err instanceof env.KeyValidationError) {
|
|
envKey = prefix + envKey;
|
|
env.validateKey(envKey);
|
|
}
|
|
}
|
|
return envKey;
|
|
}
|
|
exports.convertKey = convertKey;
|
|
function configToEnv(configs, prefix) {
|
|
const success = [];
|
|
const errors = [];
|
|
for (const [configKey, value] of (0, functional_1.flatten)(configs)) {
|
|
try {
|
|
const envKey = convertKey(configKey, prefix);
|
|
success.push({ origKey: configKey, newKey: envKey, value: value });
|
|
}
|
|
catch (err) {
|
|
if (err instanceof env.KeyValidationError) {
|
|
errors.push({
|
|
origKey: configKey,
|
|
newKey: err.key,
|
|
err: err.message,
|
|
value: value,
|
|
});
|
|
}
|
|
else {
|
|
throw new error_1.FirebaseError("Unexpected error while converting config", {
|
|
exit: 2,
|
|
original: err,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return { success, errors };
|
|
}
|
|
exports.configToEnv = configToEnv;
|
|
function hydrateEnvs(pInfos, prefix) {
|
|
let errMsg = "";
|
|
for (const pInfo of pInfos) {
|
|
const { success, errors } = configToEnv(pInfo.config, prefix);
|
|
if (errors.length > 0) {
|
|
const msg = `${pInfo.projectId} ` +
|
|
`${pInfo.alias ? "(" + pInfo.alias + ")" : ""}:\n` +
|
|
errors.map((err) => `\t${err.origKey} => ${clc.bold(err.newKey)} (${err.err})`).join("\n") +
|
|
"\n";
|
|
errMsg += msg;
|
|
}
|
|
else {
|
|
pInfo.envs = success;
|
|
}
|
|
}
|
|
return errMsg;
|
|
}
|
|
exports.hydrateEnvs = hydrateEnvs;
|
|
const CHARACTERS_TO_ESCAPE_SEQUENCES = {
|
|
"\n": "\\n",
|
|
"\r": "\\r",
|
|
"\t": "\\t",
|
|
"\v": "\\v",
|
|
"\\": "\\\\",
|
|
'"': '\\"',
|
|
"'": "\\'",
|
|
};
|
|
function escape(s) {
|
|
return s.replace(/[\n\r\t\v\\"']/g, (ch) => CHARACTERS_TO_ESCAPE_SEQUENCES[ch]);
|
|
}
|
|
function toDotenvFormat(envs, header = "") {
|
|
const lines = envs.map(({ newKey, value }) => `${newKey}="${escape(value)}"`);
|
|
const maxLineLen = Math.max(...lines.map((l) => l.length));
|
|
return (`${header}\n` +
|
|
lines.map((line, idx) => `${line.padEnd(maxLineLen)} # from ${envs[idx].origKey}`).join("\n"));
|
|
}
|
|
exports.toDotenvFormat = toDotenvFormat;
|
|
function generateDotenvFilename(pInfo) {
|
|
var _a;
|
|
return `.env.${(_a = pInfo.alias) !== null && _a !== void 0 ? _a : pInfo.projectId}`;
|
|
}
|
|
exports.generateDotenvFilename = generateDotenvFilename;
|