UNPKG

1.92 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.LazyModuleLoader = void 0;
4const module_ref_1 = require("./module-ref");
5class LazyModuleLoader {
6 constructor(dependenciesScanner, instanceLoader, moduleCompiler, modulesContainer) {
7 this.dependenciesScanner = dependenciesScanner;
8 this.instanceLoader = instanceLoader;
9 this.moduleCompiler = moduleCompiler;
10 this.modulesContainer = modulesContainer;
11 }
12 async load(loaderFn) {
13 const moduleClassOrDynamicDefinition = await loaderFn();
14 const moduleInstances = await this.dependenciesScanner.scanForModules(moduleClassOrDynamicDefinition);
15 if (moduleInstances.length === 0) {
16 // The module has been loaded already. In this case, we must
17 // retrieve a module reference from the exising container.
18 const { token } = await this.moduleCompiler.compile(moduleClassOrDynamicDefinition);
19 const moduleInstance = this.modulesContainer.get(token);
20 return moduleInstance && this.getTargetModuleRef(moduleInstance);
21 }
22 const lazyModulesContainer = this.createLazyModulesContainer(moduleInstances);
23 await this.dependenciesScanner.scanModulesForDependencies(lazyModulesContainer);
24 await this.instanceLoader.createInstancesOfDependencies(lazyModulesContainer);
25 const [targetModule] = moduleInstances;
26 return this.getTargetModuleRef(targetModule);
27 }
28 createLazyModulesContainer(moduleInstances) {
29 moduleInstances = Array.from(new Set(moduleInstances));
30 return new Map(moduleInstances.map(ref => [ref.token, ref]));
31 }
32 getTargetModuleRef(moduleInstance) {
33 const moduleRefInstanceWrapper = moduleInstance.getProviderByKey(module_ref_1.ModuleRef);
34 return moduleRefInstanceWrapper.instance;
35 }
36}
37exports.LazyModuleLoader = LazyModuleLoader;