feat(ivy): support bootstrap in ngModuleDef (#25775)

The bootstrap property of @NgModule was not previously compiled by
the compiler in AOT or JIT modes (in Ivy). This commit adds support
for bootstrap.

PR Close #25775
This commit is contained in:
Alex Rickabaugh 2018-08-28 14:19:33 -07:00 committed by Igor Minar
parent a0c4b2d8f0
commit 13ccdfd89d
4 changed files with 12 additions and 5 deletions

View File

@ -87,6 +87,12 @@ export class NgModuleDecoratorHandler implements DecoratorHandler<NgModuleAnalys
ref => this._extractModuleFromModuleWithProvidersFn(ref.node)); ref => this._extractModuleFromModuleWithProvidersFn(ref.node));
exports = this.resolveTypeList(expr, exportsMeta, 'exports'); exports = this.resolveTypeList(expr, exportsMeta, 'exports');
} }
let bootstrap: Reference[] = [];
if (ngModule.has('bootstrap')) {
const expr = ngModule.get('bootstrap') !;
const bootstrapMeta = staticallyResolve(expr, this.reflector, this.checker);
bootstrap = this.resolveTypeList(expr, bootstrapMeta, 'bootstrap');
}
// Register this module's information with the SelectorScopeRegistry. This ensures that during // Register this module's information with the SelectorScopeRegistry. This ensures that during
// the compile() phase, the module's metadata is available for selector scope computation. // the compile() phase, the module's metadata is available for selector scope computation.
@ -96,7 +102,7 @@ export class NgModuleDecoratorHandler implements DecoratorHandler<NgModuleAnalys
const ngModuleDef: R3NgModuleMetadata = { const ngModuleDef: R3NgModuleMetadata = {
type: new WrappedNodeExpr(node.name !), type: new WrappedNodeExpr(node.name !),
bootstrap: [], bootstrap: bootstrap.map(bootstrap => toR3Reference(bootstrap, context)),
declarations: declarations.map(decl => toR3Reference(decl, context)), declarations: declarations.map(decl => toR3Reference(decl, context)),
exports: exports.map(exp => toR3Reference(exp, context)), exports: exports.map(exp => toR3Reference(exp, context)),
imports: imports.map(imp => toR3Reference(imp, context)), imports: imports.map(imp => toR3Reference(imp, context)),

View File

@ -182,6 +182,7 @@ describe('ngtsc behavioral tests', () => {
@NgModule({ @NgModule({
declarations: [TestCmp], declarations: [TestCmp],
bootstrap: [TestCmp],
}) })
export class TestModule {} export class TestModule {}
`); `);
@ -193,7 +194,7 @@ describe('ngtsc behavioral tests', () => {
const jsContents = getContents('test.js'); const jsContents = getContents('test.js');
expect(jsContents) expect(jsContents)
.toContain( .toContain(
'i0.ɵdefineNgModule({ type: TestModule, bootstrap: [], ' + 'i0.ɵdefineNgModule({ type: TestModule, bootstrap: [TestCmp], ' +
'declarations: [TestCmp], imports: [], exports: [] })'); 'declarations: [TestCmp], imports: [], exports: [] })');
const dtsContents = getContents('test.d.ts'); const dtsContents = getContents('test.d.ts');

View File

@ -35,7 +35,7 @@ export interface R3NgModuleMetadata {
/** /**
* An array of expressions representing the bootstrap components specified by the module. * An array of expressions representing the bootstrap components specified by the module.
*/ */
bootstrap: o.Expression[]; bootstrap: R3Reference[];
/** /**
* An array of expressions representing the directives and pipes declared by the module. * An array of expressions representing the directives and pipes declared by the module.
@ -67,7 +67,7 @@ export function compileNgModule(meta: R3NgModuleMetadata): R3NgModuleDef {
const {type: moduleType, bootstrap, declarations, imports, exports} = meta; const {type: moduleType, bootstrap, declarations, imports, exports} = meta;
const expression = o.importExpr(R3.defineNgModule).callFn([mapToMapExpression({ const expression = o.importExpr(R3.defineNgModule).callFn([mapToMapExpression({
type: moduleType, type: moduleType,
bootstrap: o.literalArr(bootstrap), bootstrap: o.literalArr(bootstrap.map(ref => ref.value)),
declarations: o.literalArr(declarations.map(ref => ref.value)), declarations: o.literalArr(declarations.map(ref => ref.value)),
imports: o.literalArr(imports.map(ref => ref.value)), imports: o.literalArr(imports.map(ref => ref.value)),
exports: o.literalArr(exports.map(ref => ref.value)), exports: o.literalArr(exports.map(ref => ref.value)),

View File

@ -40,7 +40,7 @@ export function compileNgModuleDefs(moduleType: Type<any>, ngModule: NgModule):
if (ngModuleDef === null) { if (ngModuleDef === null) {
const meta: R3NgModuleMetadata = { const meta: R3NgModuleMetadata = {
type: wrap(moduleType), type: wrap(moduleType),
bootstrap: flatten(ngModule.bootstrap || EMPTY_ARRAY).map(wrap), bootstrap: flatten(ngModule.bootstrap || EMPTY_ARRAY).map(wrapReference),
declarations: declarations.map(wrapReference), declarations: declarations.map(wrapReference),
imports: flatten(ngModule.imports || EMPTY_ARRAY) imports: flatten(ngModule.imports || EMPTY_ARRAY)
.map(expandModuleWithProviders) .map(expandModuleWithProviders)