Skip to content

Commit 68d89ff

Browse files
feat(loader): Add promise rejection upon loader error (#94)
BREAKING CHANGES: Webpack >= 2.4 is required for the error callback to be supported with require.ensure BEFORE: Webpack < 2.4 is supported AFTER: Webpack >= 2.4 is supported Closes #75
1 parent df345fc commit 68d89ff

File tree

5 files changed

+89
-42
lines changed

5 files changed

+89
-42
lines changed

Diff for: docs/options.md

+15-7
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ replacement
2929
```ts
3030
{
3131
path: 'lazy',
32-
loadChildren: () => new Promise(function (resolve) {
32+
loadChildren: () => new Promise(function (resolve, reject) {
3333
(require as any).ensure([], function (require: any) {
3434
resolve(require('./lazy/lazy.module')['LazyModule']);
35+
}, function () {
36+
reject({ loadChunkError: true });
3537
});
3638
})
3739
}
@@ -45,19 +47,19 @@ replacement
4547
```ts
4648
{
4749
path: 'lazy',
48-
loadChildren: () => System.import('./lazy/lazy.module').then(module => module['LazyModule'])
50+
loadChildren: () => System.import('./lazy/lazy.module')
51+
.then(module => module['LazyModule'], () => { throw({ loadChunkError: true }); })
4952
}
5053
```
5154

5255
To use `dynamic import`, set the `loader` to `import`
5356

54-
**NOTE:** Using `import` only works with Webpack >= 2.1.0.
55-
5657
replacement
5758
```ts
5859
{
5960
path: 'lazy',
60-
loadChildren: () => import('./lazy/lazy.module').then(module => module['LazyModule'])
61+
loadChildren: () => import('./lazy/lazy.module')
62+
.then(module => module['LazyModule'], () => { throw({ loadChunkError: true }); })
6163
}
6264
```
6365

@@ -144,6 +146,8 @@ replacement
144146
loadChildren: () => new Promise(function (resolve) {
145147
(require as any).ensure([], function (require: any) {
146148
resolve(require('./lazy/lazy.module.ngfactory')['LazyModuleNgFactory']);
149+
}, function () {
150+
reject({ loadChunkError: true });
147151
});
148152
})
149153
}
@@ -170,6 +174,8 @@ replacement (require loader)
170174
loadChildren: () => new Promise(function (resolve) {
171175
(require as any).ensure([], function (require: any) {
172176
resolve(require('./lazy/lazy.module')['LazyModule']);
177+
}, function () {
178+
reject({ loadChunkError: true });
173179
}, 'MyChunk');
174180
})
175181
}
@@ -179,14 +185,16 @@ replacement (system loader)
179185
```ts
180186
{
181187
path: 'lazy',
182-
loadChildren: () => System.import(/* webpackChunkName: "MyChunk" */ './lazy/lazy.module').then(module => module['LazyModule'])
188+
loadChildren: () => System.import(/* webpackChunkName: "MyChunk" */ './lazy/lazy.module')
189+
.then(module => module['LazyModule'], () => { throw({ loadChunkError: true }); })
183190
}
184191
```
185192

186193
replacement (import loader)
187194
```ts
188195
{
189196
path: 'lazy',
190-
loadChildren: () => import(/* webpackChunkName: "MyChunk" */ './lazy/lazy.module').then(module => module['LazyModule'])
197+
loadChildren: () => import(/* webpackChunkName: "MyChunk" */ './lazy/lazy.module')
198+
.then(module => module['LazyModule'], () => { throw({ loadChunkError: true }); })
191199
}
192200
```

Diff for: package.json

+3
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,8 @@
3232
"mocha": "^3.0.2",
3333
"pmock": "^0.2.3",
3434
"should": "^11.1.0"
35+
},
36+
"peerDependencies": {
37+
"webpack": ">=2.4.0"
3538
}
3639
}

Diff for: spec/index.spec.js

+52-24
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ describe('Loader', function() {
4545
it(loadString, function() {
4646

4747
var result = [
48-
'loadChildren: () => new Promise(function (resolve) {',
48+
'loadChildren: () => new Promise(function (resolve, reject) {',
4949
' (require as any).ensure([], function (require: any) {',
5050
' resolve(require(\'./path/to/file.module\')[\'FileModule\']);',
51+
' }, function () {',
52+
' reject({ loadChunkError: true });',
5153
' });',
5254
'})'
5355
];
@@ -73,9 +75,11 @@ describe('Loader', function() {
7375
loadStrings.forEach(function(loadString) {
7476
it(loadString, function() {
7577
var result = [
76-
'loadChildren: () => new Promise(function (resolve) {',
78+
'loadChildren: () => new Promise(function (resolve, reject) {',
7779
' (require as any).ensure([], function (require: any) {',
7880
' resolve(require(\'./path/to/file.module\')[\'FileModule\']);',
81+
' }, function () {',
82+
' reject({ loadChunkError: true });',
7983
' });',
8084
'})'
8185
];
@@ -95,9 +99,11 @@ describe('Loader', function() {
9599

96100
it('should return a loadChildren async require statement', function() {
97101
var result = [
98-
'loadChildren: () => new Promise(function (resolve) {',
102+
'loadChildren: () => new Promise(function (resolve, reject) {',
99103
' (require as any).ensure([], function (require: any) {',
100104
' resolve(require(\'./path/to/file.module\')[\'FileModule\']);',
105+
' }, function () {',
106+
' reject({ loadChunkError: true });',
101107
' });',
102108
'})'
103109
];
@@ -112,9 +118,11 @@ describe('Loader', function() {
112118

113119
it('should return a plain javascript loadChildren async require statement', function() {
114120
var result = [
115-
'loadChildren: () => new Promise(function (resolve) {',
121+
'loadChildren: () => new Promise(function (resolve, reject) {',
116122
' require.ensure([], function (require) {',
117123
' resolve(require(\'./path/to/file.module\')[\'FileModule\']);',
124+
' }, function () {',
125+
' reject({ loadChunkError: true });',
118126
' });',
119127
'})'
120128
];
@@ -144,9 +152,11 @@ describe('Loader', function() {
144152

145153
it('should return a loadChildren chunkName require statement', function() {
146154
var result = [
147-
'loadChildren: () => new Promise(function (resolve) {',
155+
'loadChildren: () => new Promise(function (resolve, reject) {',
148156
' (require as any).ensure([], function (require: any) {',
149157
' resolve(require(\'./path/to/file.module\')[\'FileModule\']);',
158+
' }, function () {',
159+
' reject({ loadChunkError: true });',
150160
' }, \'name\');',
151161
'})'
152162
];
@@ -162,7 +172,7 @@ describe('Loader', function() {
162172
it ('should return a loadChildren System.import statement', function() {
163173
var result = [
164174
'loadChildren: () => System.import(\'./path/to/file.module\')',
165-
' .then(module => module[\'FileModule\'])'
175+
' .then(module => module[\'FileModule\'], () => { throw({ loadChunkError: true }); })'
166176
];
167177

168178
var loadedString = loader.call({
@@ -176,7 +186,7 @@ describe('Loader', function() {
176186
it ('should return a loadChildren chunkName System.import statement', function() {
177187
var result = [
178188
'loadChildren: () => System.import(/* webpackChunkName: "name" */ \'./path/to/file.module\')',
179-
' .then(module => module[\'FileModule\'])'
189+
' .then(module => module[\'FileModule\'], () => { throw({ loadChunkError: true }); })'
180190
];
181191

182192
var loadedString = loader.call({
@@ -190,7 +200,7 @@ describe('Loader', function() {
190200
it ('should return a loadChildren dynamic import statement', function() {
191201
var result = [
192202
'loadChildren: () => import(\'./path/to/file.module\')',
193-
' .then(module => module[\'FileModule\'])'
203+
' .then(module => module[\'FileModule\'], () => { throw({ loadChunkError: true }); })'
194204
];
195205

196206
var loadedString = loader.call({
@@ -204,7 +214,7 @@ describe('Loader', function() {
204214
it ('should return a loadChildren chunkName dynamic import statement', function() {
205215
var result = [
206216
'loadChildren: () => import(/* webpackChunkName: "name" */ \'./path/to/file.module\')',
207-
' .then(module => module[\'FileModule\'])'
217+
' .then(module => module[\'FileModule\'], () => { throw({ loadChunkError: true }); })'
208218
];
209219

210220
var loadedString = loader.call({
@@ -219,9 +229,11 @@ describe('Loader', function() {
219229
var modulePath = './path/to/file.module';
220230

221231
var result = [
222-
'loadChildren: () => new Promise(function (resolve) {',
232+
'loadChildren: () => new Promise(function (resolve, reject) {',
223233
' (require as any).ensure([], function (require: any) {',
224234
' resolve(require(\'./path/to/file.module\')[\'default\']);',
235+
' }, function () {',
236+
' reject({ loadChunkError: true });',
225237
' });',
226238
'})'
227239
];
@@ -236,9 +248,11 @@ describe('Loader', function() {
236248

237249
it('should support a custom delimiter', function() {
238250
var result = [
239-
'loadChildren: () => new Promise(function (resolve) {',
251+
'loadChildren: () => new Promise(function (resolve, reject) {',
240252
' (require as any).ensure([], function (require: any) {',
241253
' resolve(require(\'./path/to/file.module\')[\'FileModule\']);',
254+
' }, function () {',
255+
' reject({ loadChunkError: true });',
242256
' });',
243257
'})'
244258
];
@@ -256,9 +270,11 @@ describe('Loader', function() {
256270
var env = pmock.platform('win32');
257271

258272
var result = [
259-
'loadChildren: () => new Promise(function (resolve) {',
273+
'loadChildren: () => new Promise(function (resolve, reject) {',
260274
' (require as any).ensure([], function (require: any) {',
261275
' resolve(require(\'.\\\\path\\\\to\\\\file.module\')[\'FileModule\']);',
276+
' }, function () {',
277+
' reject({ loadChunkError: true });',
262278
' });',
263279
'})'
264280
];
@@ -275,9 +291,11 @@ describe('Loader', function() {
275291

276292
it('should support non-relative paths', function() {
277293
var result = [
278-
'loadChildren: () => new Promise(function (resolve) {',
294+
'loadChildren: () => new Promise(function (resolve, reject) {',
279295
' (require as any).ensure([], function (require: any) {',
280296
' resolve(require(\'path/to/file.module\')[\'FileModule\']);',
297+
' }, function () {',
298+
' reject({ loadChunkError: true });',
281299
' });',
282300
'})'
283301
];
@@ -297,10 +315,12 @@ describe('Loader', function() {
297315

298316
it('should return a loadChildren async require statement', function() {
299317
var result = [
300-
'loadChildren: () => new Promise(function (resolve) {',
318+
'loadChildren: () => new Promise(function (resolve, reject) {',
301319
' (require as any).ensure([], function (require: any) {',
302320
' resolve(require(\'./path/to/file.module.ngfactory\')[\'FileModuleNgFactory\']);',
303-
' });',
321+
' }, function () {',
322+
' reject({ loadChunkError: true });',
323+
' });',
304324
'})'
305325
];
306326

@@ -330,7 +350,7 @@ describe('Loader', function() {
330350
it ('should return a loadChildren System.import statement', function() {
331351
var result = [
332352
'loadChildren: () => System.import(\'./path/to/file.module.ngfactory\')',
333-
' .then(module => module[\'FileModuleNgFactory\'])'
353+
' .then(module => module[\'FileModuleNgFactory\'], () => { throw({ loadChunkError: true }); })'
334354
];
335355

336356
var loadedString = loader.call({
@@ -344,7 +364,7 @@ describe('Loader', function() {
344364
it ('should return a loadChildren dynamic import statement', function() {
345365
var result = [
346366
'loadChildren: () => import(\'./path/to/file.module.ngfactory\')',
347-
' .then(module => module[\'FileModuleNgFactory\'])'
367+
' .then(module => module[\'FileModuleNgFactory\'], () => { throw({ loadChunkError: true }); })'
348368
];
349369

350370
var loadedString = loader.call({
@@ -359,10 +379,12 @@ describe('Loader', function() {
359379
var moduleSuffix = '.ngfile';
360380

361381
var result = [
362-
'loadChildren: () => new Promise(function (resolve) {',
382+
'loadChildren: () => new Promise(function (resolve, reject) {',
363383
' (require as any).ensure([], function (require: any) {',
364384
' resolve(require(\'./path/to/file.module' + moduleSuffix + '\')[\'FileModuleNgFactory\']);',
365-
' });',
385+
' }, function () {',
386+
' reject({ loadChunkError: true });',
387+
' });',
366388
'})'
367389
];
368390

@@ -378,9 +400,11 @@ describe('Loader', function() {
378400
var factorySuffix = 'NgFact';
379401

380402
var result = [
381-
'loadChildren: () => new Promise(function (resolve) {',
403+
'loadChildren: () => new Promise(function (resolve, reject) {',
382404
' (require as any).ensure([], function (require: any) {',
383405
' resolve(require(\'./path/to/file.module.ngfactory\')[\'FileModule' + factorySuffix + '\']);',
406+
' }, function () {',
407+
' reject({ loadChunkError: true });',
384408
' });',
385409
'})'
386410
];
@@ -395,10 +419,12 @@ describe('Loader', function() {
395419

396420
it('should support non-relative paths', function() {
397421
var result = [
398-
'loadChildren: () => new Promise(function (resolve) {',
422+
'loadChildren: () => new Promise(function (resolve, reject) {',
399423
' (require as any).ensure([], function (require: any) {',
400424
' resolve(require(\'path/to/file.module.ngfactory\')[\'FileModuleNgFactory\']);',
401-
' });',
425+
' }, function () {',
426+
' reject({ loadChunkError: true });',
427+
' });',
402428
'})'
403429
];
404430

@@ -421,10 +447,12 @@ describe('Loader', function() {
421447

422448
it('should return a loadChildren async require statement', function() {
423449
var result = [
424-
'loadChildren: () => new Promise(function (resolve) {',
450+
'loadChildren: () => new Promise(function (resolve, reject) {',
425451
' (require as any).ensure([], function (require: any) {',
426452
' resolve(require(\'../../../compiled/src/app/groups/inventory/index.ngfactory\')[\'InventoryModuleNgFactory\']);',
427-
' });',
453+
' }, function () {',
454+
' reject({ loadChunkError: true });',
455+
' });',
428456
'})'
429457
];
430458

Diff for: spec/utils.spec.js

+14-8
Original file line numberDiff line numberDiff line change
@@ -32,32 +32,38 @@ describe('Utils', function() {
3232

3333
it('should return an asynchronous require loadChildren statement with chunkName parameter', function() {
3434
var result = [
35-
'loadChildren: () => new Promise(function (resolve) {',
35+
'loadChildren: () => new Promise(function (resolve, reject) {',
3636
' (require as any).ensure([], function (require: any) {',
3737
' resolve(' + getRequireString(path, name) + ');',
38-
' }, \'name\');',
38+
' }, function () {',
39+
' reject({ loadChunkError: true });',
40+
' }, \'name\');',
3941
'})'
4042
];
4143
getRequireLoader('path', 'name', 'name', true).should.eql(result.join(''));
4244
});
4345

4446
it('should return an asynchronous require loadChildren statement without chunkName parameter', function() {
4547
var result = [
46-
'loadChildren: () => new Promise(function (resolve) {',
48+
'loadChildren: () => new Promise(function (resolve, reject) {',
4749
' (require as any).ensure([], function (require: any) {',
4850
' resolve(' + getRequireString(path, name) + ');',
49-
' });',
51+
' }, function () {',
52+
' reject({ loadChunkError: true });',
53+
' });',
5054
'})'
5155
];
5256
getRequireLoader('path', undefined, 'name', true).should.eql(result.join(''));
5357
});
5458

5559
it('should return an asynchronous require loadChildren statement with vanilla javascript', function() {
5660
var result = [
57-
'loadChildren: () => new Promise(function (resolve) {',
61+
'loadChildren: () => new Promise(function (resolve, reject) {',
5862
' require.ensure([], function (require) {',
5963
' resolve(' + getRequireString(path, name) + ');',
60-
' }, \'name\');',
64+
' }, function () {',
65+
' reject({ loadChunkError: true });',
66+
' }, \'name\');',
6167
'})'
6268
];
6369
getRequireLoader('path', 'name', 'name', true, true).should.eql(result.join(''));
@@ -71,7 +77,7 @@ describe('Utils', function() {
7177
it('should return an asynchronous System.import loadChildren statement', function() {
7278
var result = [
7379
'loadChildren: () => System.import(\'' + path + '\')',
74-
' .then(module => module[\'' + name + '\'])'
80+
' .then(module => module[\'' + name + '\'], () => { throw({ loadChunkError: true }); })'
7581
];
7682

7783
getSystemLoader('path', 'name', true).should.eql(result.join(''));
@@ -84,7 +90,7 @@ describe('Utils', function() {
8490
it('should return an asynchronous dynamic import loadChildren statement', function() {
8591
var result = [
8692
'loadChildren: () => import(\'' + path + '\')',
87-
' .then(module => module[\'' + name + '\'])'
93+
' .then(module => module[\'' + name + '\'], () => { throw({ loadChunkError: true }); })'
8894
];
8995

9096
getImportLoader('path', 'name', true).should.eql(result.join(''));

0 commit comments

Comments
 (0)