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:
parent
a0c4b2d8f0
commit
13ccdfd89d
|
@ -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)),
|
||||||
|
|
|
@ -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');
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue