/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import {Injector} from '../di/injector'; import {Type} from '../interface/type'; import {ComponentFactory} from '../linker/component_factory'; import {NgModuleFactory, NgModuleRef} from '../linker/ng_module_factory'; import {initServicesIfNeeded} from './services'; import {NgModuleDefinition, NgModuleDefinitionFactory, NgModuleProviderDef, ProviderOverride, Services, ViewDefinition} from './types'; import {resolveDefinition} from './util'; export function overrideProvider(override: ProviderOverride) { initServicesIfNeeded(); return Services.overrideProvider(override); } export function overrideComponentView(comp: Type, componentFactory: ComponentFactory) { initServicesIfNeeded(); return Services.overrideComponentView(comp, componentFactory); } export function clearOverrides() { initServicesIfNeeded(); return Services.clearOverrides(); } // Attention: this function is called as top level function. // Putting any logic in here will destroy closure tree shaking! export function createNgModuleFactory( ngModuleType: Type, bootstrapComponents: Type[], defFactory: NgModuleDefinitionFactory): NgModuleFactory { return new NgModuleFactory_(ngModuleType, bootstrapComponents, defFactory); } function cloneNgModuleDefinition(def: NgModuleDefinition): NgModuleDefinition { const providers = Array.from(def.providers); const modules = Array.from(def.modules); const providersByKey: {[tokenKey: string]: NgModuleProviderDef} = {}; for (const key in def.providersByKey) { providersByKey[key] = def.providersByKey[key]; } return { factory: def.factory, isRoot: def.isRoot, providers, modules, providersByKey, }; } class NgModuleFactory_ extends NgModuleFactory { constructor( public readonly moduleType: Type, private _bootstrapComponents: Type[], private _ngModuleDefFactory: NgModuleDefinitionFactory) { // Attention: this ctor is called as top level function. // Putting any logic in here will destroy closure tree shaking! super(); } create(parentInjector: Injector|null): NgModuleRef { initServicesIfNeeded(); // Clone the NgModuleDefinition so that any tree shakeable provider definition // added to this instance of the NgModuleRef doesn't affect the cached copy. // See https://github.com/angular/angular/issues/25018. const def = cloneNgModuleDefinition(resolveDefinition(this._ngModuleDefFactory)); return Services.createNgModuleRef( this.moduleType, parentInjector || Injector.NULL, this._bootstrapComponents, def); } }