Skip to content

Commit 4b9af62

Browse files
filipesilvahansl
authored andcommitted
fix(@ngtools/webpack): don't override context module deps (#4153)
Fix #2496
1 parent 08bb738 commit 4b9af62

File tree

3 files changed

+46
-33
lines changed

3 files changed

+46
-33
lines changed

Diff for: packages/@ngtools/webpack/src/plugin.ts

+12-14
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import * as ts from 'typescript';
44

55
import {__NGTOOLS_PRIVATE_API_2} from '@angular/compiler-cli';
66
import {AngularCompilerOptions} from '@angular/tsc-wrapped';
7+
const ContextElementDependency = require('webpack/lib/dependencies/ContextElementDependency');
78

89
import {WebpackResourceLoader} from './resource_loader';
9-
import {createResolveDependenciesFromContextMap} from './utils';
1010
import {WebpackCompilerHost} from './compiler_host';
1111
import {resolveEntryModuleFromMain} from './entry_resolver';
1212
import {Tapable} from './webpack';
@@ -194,29 +194,27 @@ export class AotPlugin implements Tapable {
194194
apply(compiler: any) {
195195
this._compiler = compiler;
196196

197+
// Add lazy modules to the context module for @angular/core/src/linker
197198
compiler.plugin('context-module-factory', (cmf: any) => {
198-
cmf.plugin('before-resolve', (request: any, callback: (err?: any, request?: any) => void) => {
199-
if (!request) {
200-
return callback();
201-
}
202-
203-
request.request = this.skipCodeGeneration ? this.basePath : this.genDir;
204-
request.recursive = true;
205-
request.dependencies.forEach((d: any) => d.critical = false);
206-
return callback(null, request);
207-
});
208199
cmf.plugin('after-resolve', (result: any, callback: (err?: any, request?: any) => void) => {
209200
if (!result) {
210201
return callback();
211202
}
212203

204+
// alter only request from @angular/core/src/linker
205+
if (!result.resource.endsWith(path.join('@angular/core/src/linker'))) {
206+
return callback(null, result);
207+
}
208+
213209
this.done.then(() => {
214210
result.resource = this.skipCodeGeneration ? this.basePath : this.genDir;
215211
result.recursive = true;
216212
result.dependencies.forEach((d: any) => d.critical = false);
217-
result.resolveDependencies = createResolveDependenciesFromContextMap(
218-
(_: any, cb: any) => cb(null, this._lazyRoutes));
219-
213+
result.resolveDependencies = (p1: any, p2: any, p3: any, p4: RegExp, cb: any ) => {
214+
const dependencies = Object.keys(this._lazyRoutes)
215+
.map((key) => new ContextElementDependency(this._lazyRoutes[key], key));
216+
cb(null, dependencies);
217+
};
220218
return callback(null, result);
221219
}, () => callback(null))
222220
.catch(err => callback(err));

Diff for: packages/@ngtools/webpack/src/utils.ts

-16
This file was deleted.

Diff for: tests/e2e/tests/misc/lazy-module.ts

+34-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {readdirSync} from 'fs';
22
import {oneLine} from 'common-tags';
33

4-
import {ng} from '../../utils/process';
4+
import {ng, npm} from '../../utils/process';
55
import {addImportToModule} from '../../utils/ast';
6+
import {appendToFile, writeFile} from '../../utils/fs';
67

78

89
export default function() {
@@ -21,13 +22,43 @@ export default function() {
2122
if (oldNumberOfFiles >= currentNumberOfDistFiles) {
2223
throw new Error('A bundle for the lazy module was not created.');
2324
}
25+
oldNumberOfFiles = currentNumberOfDistFiles;
26+
})
27+
// verify System.import still works
28+
.then(() => writeFile('src/app/lazy-file.ts', ''))
29+
.then(() => appendToFile('src/app/app.component.ts', `
30+
// verify other System.import still work
31+
declare var System: any;
32+
const lazyFile = 'file';
33+
System.import('./lazy-' + lazyFile);
34+
`))
35+
.then(() => ng('build'))
36+
.then(() => readdirSync('dist').length)
37+
.then(currentNumberOfDistFiles => {
38+
if (oldNumberOfFiles >= currentNumberOfDistFiles) {
39+
throw new Error('A bundle for the lazy file was not created.');
40+
}
41+
oldNumberOfFiles = currentNumberOfDistFiles;
42+
})
43+
// verify 'import *' syntax doesn't break lazy modules
44+
.then(() => npm('install', 'moment'))
45+
.then(() => appendToFile('src/app/app.component.ts', `
46+
import * as moment from 'moment';
47+
console.log(moment);
48+
`))
49+
.then(() => ng('build'))
50+
.then(() => readdirSync('dist').length)
51+
.then(currentNumberOfDistFiles => {
52+
if (oldNumberOfFiles != currentNumberOfDistFiles) {
53+
throw new Error('Bundles were not created after adding \'import *\'.');
54+
}
2455
})
2556
// Check for AoT and lazy routes.
2657
.then(() => ng('build', '--aot'))
2758
.then(() => readdirSync('dist').length)
2859
.then(currentNumberOfDistFiles => {
29-
if (oldNumberOfFiles >= currentNumberOfDistFiles) {
30-
throw new Error('A bundle for the lazy module was not created.');
60+
if (oldNumberOfFiles != currentNumberOfDistFiles) {
61+
throw new Error('AoT build contains a different number of files.');
3162
}
3263
});
3364
}

0 commit comments

Comments
 (0)