@forestadmin/forest-cloud
Version:
Utility to bootstrap and publish forest admin cloud projects customization
126 lines • 9.86 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultEnvs = void 0;
exports.getEnvironmentVariables = getEnvironmentVariables;
exports.validateServerUrl = validateServerUrl;
exports.validateSubscriptionUrl = validateSubscriptionUrl;
exports.validateMissingForestEnvSecret = validateMissingForestEnvSecret;
exports.validateEnvironmentVariables = validateEnvironmentVariables;
const fs = __importStar(require("fs"));
const promises_1 = require("node:fs/promises");
const node_os_1 = require("node:os");
const path_1 = __importDefault(require("path"));
const errors_1 = require("../errors");
const getTokenFromToolbelt = async (baseTokenPath) => {
const tokenPath = path_1.default.join(baseTokenPath, '.forest.d', '.forestrc');
if (fs.existsSync(tokenPath))
return (0, promises_1.readFile)(tokenPath, 'utf8');
return null;
};
exports.defaultEnvs = Object.freeze({
FOREST_SERVER_URL: 'https://api.forestadmin.com',
FOREST_SUBSCRIPTION_URL: 'wss://api.forestadmin.com/subscriptions',
NODE_TLS_REJECT_UNAUTHORIZED: '1',
TOKEN_PATH: (0, node_os_1.homedir)(),
});
async function getEnvironmentVariables() {
const tokenPath = process.env.TOKEN_PATH || exports.defaultEnvs.TOKEN_PATH;
const FOREST_SERVER_URL = process.env.FOREST_SERVER_URL || process.env.FOREST_URL || exports.defaultEnvs.FOREST_SERVER_URL;
let FOREST_SUBSCRIPTION_URL;
if (FOREST_SERVER_URL !== exports.defaultEnvs.FOREST_SERVER_URL && !process.env.FOREST_SUBSCRIPTION_URL) {
// for lumberjacks: if FOREST_SERVER_URL is not default, we can guess the subscription url
FOREST_SUBSCRIPTION_URL = `${FOREST_SERVER_URL.replace(/^https?:\/\//, 'wss://').replace(/\/$/, '')}/subscriptions`;
}
else {
FOREST_SUBSCRIPTION_URL =
process.env.FOREST_SUBSCRIPTION_URL || exports.defaultEnvs.FOREST_SUBSCRIPTION_URL;
}
return {
FOREST_ENV_SECRET: process.env.FOREST_ENV_SECRET,
TOKEN_PATH: tokenPath,
FOREST_SERVER_URL,
FOREST_SUBSCRIPTION_URL,
FOREST_AUTH_TOKEN: process.env.FOREST_AUTH_TOKEN || (await getTokenFromToolbelt(tokenPath)),
NODE_TLS_REJECT_UNAUTHORIZED: process.env.NODE_TLS_REJECT_UNAUTHORIZED || exports.defaultEnvs.NODE_TLS_REJECT_UNAUTHORIZED,
};
}
function validateUrl(url, variableName, protocols) {
if (!url) {
throw new errors_1.BusinessError(`Missing ${variableName}. Please check your .env file.`);
}
let givenUrl;
try {
givenUrl = new URL(url);
}
catch (err) {
throw new errors_1.BusinessError(`${variableName} is invalid. Please check your .env file.\n${err.message}`);
}
if (!protocols.includes(givenUrl.protocol)) {
throw new errors_1.BusinessError(`${variableName} is invalid, it must start with '${protocols
.map(protocol => `${protocol}//`)
.join("' or '")}'. Please check your .env file.`);
}
}
function validateServerUrl(serverUrl) {
validateUrl(serverUrl, 'FOREST_SERVER_URL', ['http:', 'https:']);
}
function validateSubscriptionUrl(subscriptionUrl) {
validateUrl(subscriptionUrl, 'FOREST_SUBSCRIPTION_URL', ['wss:']);
}
function validateMissingForestEnvSecret(forestEnvSecret, fromCommand) {
if (!forestEnvSecret) {
throw new errors_1.BusinessError('Your forest env secret is missing.' +
` Please provide it with the \`${fromCommand} --env-secret <your-secret-key>\` command or` +
' add it to your .env file or in environment variables.');
}
}
function validateEnvironmentVariables(env) {
if (!env.FOREST_ENV_SECRET) {
throw new errors_1.BusinessError('Missing FOREST_ENV_SECRET. Please check your .env file.');
}
if (typeof env.FOREST_ENV_SECRET !== 'string' || !/^[0-9a-f]{64}$/.test(env.FOREST_ENV_SECRET)) {
throw new errors_1.BusinessError('FOREST_ENV_SECRET is invalid. Please check your .env file.\n\tYou can retrieve its value from environment settings on Forest Admin.');
}
if (!env.FOREST_AUTH_TOKEN) {
throw new errors_1.BusinessError('Missing authentication token. Your TOKEN_PATH is probably wrong on .env file.');
}
validateServerUrl(env.FOREST_SERVER_URL);
validateSubscriptionUrl(env.FOREST_SUBSCRIPTION_URL);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtdmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudmlyb25tZW50LXZhcmlhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkEsMERBNEJDO0FBMEJELDhDQUVDO0FBRUQsMERBRUM7QUFFRCx3RUFXQztBQUVELG9FQW1CQztBQXBIRCx1Q0FBeUI7QUFDekIsK0NBQTRDO0FBQzVDLHFDQUFrQztBQUNsQyxnREFBd0I7QUFFeEIsc0NBQTBDO0FBRTFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUFFLGFBQXFCLEVBQTBCLEVBQUU7SUFDbkYsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXJFLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLElBQUEsbUJBQVEsRUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFakUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFVyxRQUFBLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLGlCQUFpQixFQUFFLDZCQUE2QjtJQUNoRCx1QkFBdUIsRUFBRSx5Q0FBeUM7SUFDbEUsNEJBQTRCLEVBQUUsR0FBRztJQUNqQyxVQUFVLEVBQUUsSUFBQSxpQkFBTyxHQUFFO0NBQ3RCLENBQUMsQ0FBQztBQUVJLEtBQUssVUFBVSx1QkFBdUI7SUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksbUJBQVcsQ0FBQyxVQUFVLENBQUM7SUFFbkUsTUFBTSxpQkFBaUIsR0FDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFB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