Source: DependencyTree.js

/**
 * The dependency tree keeps track of module dependencies.
 * You can see a dependency tree as some kind of dimension.
 * Multiple instances of one module can exist concurrently in
 * different trees. If you don't explicitly define the tree,
 * a module should reside in, it will also be instantiated in
 * the tree of the parent module.
 *
 * @author Wolfgang Felbermeier (@f3lang)
 */
class DependencyTree {

	/**
	 * @param {ObjectManager} objectManager
	 * @param {ModuleResolver} moduleResolver
	 * @param {String} identifier The identifier of this tree
	 */
	constructor(objectManager, moduleResolver, identifier) {
		this.identifier = identifier;
		this.objectManager = objectManager;
		this.moduleResolver = moduleResolver;
	}

	/**
	 * Returns an instance of the current tree
	 * @param {string} moduleName The name of the module
	 * @param {string} requestId The unique request id to detect circular dependencies
	 */
	getInstance(moduleName, requestId) {
		let moduleMeta = this.moduleResolver.getResolvedModules().moduleMap[moduleName];
		if(!moduleMeta) {
			throw new Error('[cdi] Module with identifier "' + moduleName + '" not found');
		}
		let scope = moduleMeta.config.scope;
		let instantiator = this.objectManager.getInstantiator(scope);
		return instantiator.getInstance(moduleMeta.path, moduleMeta.config, this.identifier, requestId);
	}

}

module.exports = DependencyTree;
module.exports.inject = ['ObjectManager', 'ModuleResolver'];