ffbt
Version:
Build a Typescript app without pain
70 lines (69 loc) • 2.57 kB
JavaScript
;
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;