Skip to content

Commit b284eb9

Browse files
committed
fix(AoTPlugin): don't override context module deps
Fix #2496
1 parent 08bb738 commit b284eb9

File tree

3 files changed

+67
-17
lines changed

3 files changed

+67
-17
lines changed

packages/@ngtools/webpack/src/plugin.ts

+22-9
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ export class AotPlugin implements Tapable {
200200
return callback();
201201
}
202202

203+
// alter only request from @angular/core/src/linker
204+
if (!request.context.endsWith(path.join('@angular/core/src/linker'))) {
205+
return callback(null, request);
206+
}
207+
203208
request.request = this.skipCodeGeneration ? this.basePath : this.genDir;
204209
request.recursive = true;
205210
request.dependencies.forEach((d: any) => d.critical = false);
@@ -210,16 +215,24 @@ export class AotPlugin implements Tapable {
210215
return callback();
211216
}
212217

213-
this.done.then(() => {
214-
result.resource = this.skipCodeGeneration ? this.basePath : this.genDir;
215-
result.recursive = true;
216-
result.dependencies.forEach((d: any) => d.critical = false);
217-
result.resolveDependencies = createResolveDependenciesFromContextMap(
218-
(_: any, cb: any) => cb(null, this._lazyRoutes));
219-
218+
// there is no way to find the original request, so try to
219+
// match request from @angular/core/src/linker as best as possible
220+
if (
221+
result.resource == (this.skipCodeGeneration ? this.basePath : this.genDir)
222+
&& result.recursive == true
223+
&& result.dependencies.every((d: any) => d.critical == false)
224+
) {
225+
this.done.then(() => {
226+
result.resolveDependencies = createResolveDependenciesFromContextMap(
227+
this._lazyRoutes,
228+
result.resolveDependencies
229+
);
230+
return callback(null, result);
231+
}, () => callback(null))
232+
.catch(err => callback(err));
233+
} else {
220234
return callback(null, result);
221-
}, () => callback(null))
222-
.catch(err => callback(err));
235+
}
223236
});
224237
});
225238

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
const ContextElementDependency = require('webpack/lib/dependencies/ContextElementDependency');
22

3-
export function createResolveDependenciesFromContextMap(createContextMap: Function) {
3+
export function createResolveDependenciesFromContextMap(
4+
contextMap: { [route: string]: string },
5+
originalResolveDependencies: any
6+
) {
47
return (fs: any, resource: any, recursive: any, regExp: RegExp, callback: any) => {
5-
createContextMap(fs, function(err: Error, map: any) {
8+
const newCallback = (err: any, deps: any) => {
69
if (err) {
710
return callback(err);
811
}
912

10-
const dependencies = Object.keys(map)
11-
.map((key) => new ContextElementDependency(map[key], key));
13+
const dependencies = Object.keys(contextMap)
14+
.map((key) => new ContextElementDependency(contextMap[key], key));
1215

13-
callback(null, dependencies);
14-
});
16+
callback(null, deps.concat(dependencies));
17+
};
18+
19+
// Use original resolver and add in context map to result
20+
originalResolveDependencies(fs, resource, recursive, regExp, newCallback);
1521
};
1622
}

tests/e2e/tests/misc/lazy-module.ts

+33-2
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,12 +22,42 @@ 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/lazy-file.ts', ''))
29+
.then(() => appendToFile('src/main.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/main.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) {
60+
if (oldNumberOfFiles != currentNumberOfDistFiles) {
3061
throw new Error('A bundle for the lazy module was not created.');
3162
}
3263
});

0 commit comments

Comments
 (0)