2017-05-15 13:12:10 -07:00
|
|
|
/**
|
|
|
|
* @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';
|
2019-01-09 13:49:16 -08:00
|
|
|
import {Type} from '../interface/type';
|
2017-10-27 17:04:11 -07:00
|
|
|
import {ComponentFactory} from '../linker/component_factory';
|
2017-05-15 13:12:10 -07:00
|
|
|
import {NgModuleFactory, NgModuleRef} from '../linker/ng_module_factory';
|
|
|
|
|
|
|
|
import {initServicesIfNeeded} from './services';
|
2018-07-22 00:05:53 -07:00
|
|
|
import {NgModuleDefinition, NgModuleDefinitionFactory, NgModuleProviderDef, ProviderOverride, Services, ViewDefinition} from './types';
|
2017-05-15 13:12:10 -07:00
|
|
|
import {resolveDefinition} from './util';
|
|
|
|
|
|
|
|
export function overrideProvider(override: ProviderOverride) {
|
|
|
|
initServicesIfNeeded();
|
|
|
|
return Services.overrideProvider(override);
|
|
|
|
}
|
|
|
|
|
2017-10-27 17:04:11 -07:00
|
|
|
export function overrideComponentView(comp: Type<any>, componentFactory: ComponentFactory<any>) {
|
2017-05-15 13:12:10 -07:00
|
|
|
initServicesIfNeeded();
|
2017-10-27 17:04:11 -07:00
|
|
|
return Services.overrideComponentView(comp, componentFactory);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function clearOverrides() {
|
|
|
|
initServicesIfNeeded();
|
|
|
|
return Services.clearOverrides();
|
2017-05-15 13:12:10 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Attention: this function is called as top level function.
|
|
|
|
// Putting any logic in here will destroy closure tree shaking!
|
|
|
|
export function createNgModuleFactory(
|
|
|
|
ngModuleType: Type<any>, bootstrapComponents: Type<any>[],
|
|
|
|
defFactory: NgModuleDefinitionFactory): NgModuleFactory<any> {
|
|
|
|
return new NgModuleFactory_(ngModuleType, bootstrapComponents, defFactory);
|
|
|
|
}
|
|
|
|
|
2018-07-22 00:05:53 -07:00
|
|
|
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,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-05-15 13:12:10 -07:00
|
|
|
class NgModuleFactory_ extends NgModuleFactory<any> {
|
|
|
|
constructor(
|
|
|
|
public readonly moduleType: Type<any>, private _bootstrapComponents: Type<any>[],
|
|
|
|
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<any> {
|
|
|
|
initServicesIfNeeded();
|
2018-07-22 00:05:53 -07:00
|
|
|
// 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));
|
2017-05-15 13:12:10 -07:00
|
|
|
return Services.createNgModuleRef(
|
|
|
|
this.moduleType, parentInjector || Injector.NULL, this._bootstrapComponents, def);
|
|
|
|
}
|
|
|
|
}
|