UNPKG

ffbt

Version:

Build a Typescript app without pain

70 lines (69 loc) 2.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EnvironmentRegistry = exports.CIRCULAR_DEPENDENCY_ERROR_TEXT = void 0; exports.CIRCULAR_DEPENDENCY_ERROR_TEXT = "Found circular dependency in environment list"; const DEFAULT_ENV_NAME = "default"; class EnvironmentRegistry { constructor() { this.environments = new Map(); } get size() { return this.environments.size; } add(name, env) { const newEnv = this.extendEnv(env); newEnv._name = name; this.environments.set(name, newEnv); return newEnv; } addMany(environments) { Object.keys(environments).forEach((name) => { const isEnvironmentAlreadyAdded = this.environments.get(name) !== undefined; if (isEnvironmentAlreadyAdded) { return; } this.resolveParentEnvAndAdd(name, environments[name], environments, []); }); } resolveParentEnvAndAdd(name, env, environments, parents) { const parentEnvName = env._extends; if (!parentEnvName) { this.add(name, env); return; } const parentEnv = environments[parentEnvName]; parentEnv._name = parentEnvName; if (!parentEnv) { throw new Error(`Can't extend environment ${name} from ${parentEnvName} because it doesn't exist`); } if (parents.includes(parentEnv)) { const dependencyChain = this.buildDependencyChainString(parents, env); throw new Error(`${exports.CIRCULAR_DEPENDENCY_ERROR_TEXT}: ${dependencyChain}`); } this.resolveParentEnvAndAdd(parentEnvName, parentEnv, environments, [...parents, env]); this.add(name, env); } buildDependencyChainString(parents, env) { const parentNames = parents.map(parent => parent._name); return [...parentNames, env._name, env._extends].join(" -> "); } extendEnv(env) { const extendTarget = env._extends || DEFAULT_ENV_NAME; const parentEnv = this.get(extendTarget); return this.mergeEnvironments(parentEnv, env); } get(name) { const env = this.environments.get(name); if (env) { return env; } if (name === DEFAULT_ENV_NAME) { return {}; } throw new Error(`Environment with name ${name} doesn't exist`); } mergeEnvironments(e1, e2) { return Object.assign(Object.assign({}, e1), e2); } } exports.EnvironmentRegistry = EnvironmentRegistry;