Skip to content

Commit ebac5db

Browse files
crisbetojasonaden
authored andcommitted
fix(ivy): don't generate code for blank NgModule fields (angular#28387)
Currently `compileNgModule` generates an empty array for optional fields that are omitted from an `NgModule` declaration (e.g. `bootstrap`, `exports`). This isn't necessary, because `defineNgModule` has some code to default these fields to empty arrays at runtime if they aren't defined. The following changes will only output code if there are values for the particular field. PR Close angular#28387
1 parent 2951329 commit ebac5db

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

packages/compiler-cli/test/ngtsc/ngtsc_spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ describe('ngtsc behavioral tests', () => {
275275
expect(jsContents)
276276
.toContain(
277277
'i0.ɵdefineNgModule({ type: TestModule, bootstrap: [TestCmp], ' +
278-
'declarations: [TestCmp], imports: [], exports: [] })');
278+
'declarations: [TestCmp] })');
279279

280280
const dtsContents = env.getContents('test.d.ts');
281281
expect(dtsContents)
@@ -373,7 +373,7 @@ describe('ngtsc behavioral tests', () => {
373373
env.tsconfig();
374374
env.write('test.ts', `
375375
import {Component, NgModule} from '@angular/core';
376-
376+
377377
export class Dep {}
378378
379379
export class Token {
@@ -1562,24 +1562,24 @@ describe('ngtsc behavioral tests', () => {
15621562
env.tsconfig();
15631563
env.write('node_modules/external/index.d.ts', `
15641564
import {ɵDirectiveDefWithMeta, ɵNgModuleDefWithMeta} from '@angular/core';
1565-
1565+
15661566
export declare class ExternalDir {
15671567
static ngDirectiveDef: ɵDirectiveDefWithMeta<ExternalDir, '[test]', never, never, never, never>;
15681568
}
1569-
1569+
15701570
export declare class ExternalModule {
15711571
static ngModuleDef: ɵNgModuleDefWithMeta<ExternalModule, [typeof ExternalDir], never, [typeof ExternalDir]>;
15721572
}
15731573
`);
15741574
env.write('test.ts', `
15751575
import {Component, Directive, NgModule} from '@angular/core';
15761576
import {ExternalModule} from 'external';
1577-
1577+
15781578
@Component({
15791579
template: '<div test></div>',
15801580
})
15811581
class Cmp {}
1582-
1582+
15831583
@NgModule({
15841584
declarations: [Cmp],
15851585
// Multiple imports of the same module used to result in duplicate directive references

packages/compiler/src/render3/r3_module_compiler.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,34 @@ export interface R3NgModuleMetadata {
6464
*/
6565
export function compileNgModule(meta: R3NgModuleMetadata): R3NgModuleDef {
6666
const {type: moduleType, bootstrap, declarations, imports, exports} = meta;
67-
const expression = o.importExpr(R3.defineNgModule).callFn([mapToMapExpression({
68-
type: moduleType,
69-
bootstrap: o.literalArr(bootstrap.map(ref => ref.value)),
70-
declarations: o.literalArr(declarations.map(ref => ref.value)),
71-
imports: o.literalArr(imports.map(ref => ref.value)),
72-
exports: o.literalArr(exports.map(ref => ref.value)),
73-
})]);
74-
67+
const definitionMap = {
68+
type: moduleType
69+
} as{
70+
type: o.Expression,
71+
bootstrap: o.LiteralArrayExpr,
72+
declarations: o.LiteralArrayExpr,
73+
imports: o.LiteralArrayExpr,
74+
exports: o.LiteralArrayExpr
75+
};
76+
77+
// Only generate the keys in the metadata if the arrays have values.
78+
if (bootstrap.length) {
79+
definitionMap.bootstrap = o.literalArr(bootstrap.map(ref => ref.value));
80+
}
81+
82+
if (declarations.length) {
83+
definitionMap.declarations = o.literalArr(declarations.map(ref => ref.value));
84+
}
85+
86+
if (imports.length) {
87+
definitionMap.imports = o.literalArr(imports.map(ref => ref.value));
88+
}
89+
90+
if (exports.length) {
91+
definitionMap.exports = o.literalArr(exports.map(ref => ref.value));
92+
}
93+
94+
const expression = o.importExpr(R3.defineNgModule).callFn([mapToMapExpression(definitionMap)]);
7595
const type = new o.ExpressionType(o.importExpr(R3.NgModuleDefWithMeta, [
7696
new o.ExpressionType(moduleType), tupleTypeOf(declarations), tupleTypeOf(imports),
7797
tupleTypeOf(exports)

0 commit comments

Comments
 (0)