Skip to content

Commit a2cf32b

Browse files
committed
fix(bundler): don't trace dependencies which have no main file
closes #435 (comment)
1 parent 7f5e84c commit a2cf32b

5 files changed

Lines changed: 140 additions & 15 deletions

File tree

lib/build/dependency-inclusion.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ exports.DependencyInclusion = class {
88
this.description = description;
99
this.items = [];
1010
this.traceDependencies = true;
11-
bundle.bundler.addFile(new DependencyFile(bundle, description), this);
11+
12+
if (description.loaderConfig.main !== false) {
13+
bundle.bundler.addFile(new DependencyFile(bundle, description), this);
14+
}
1215
}
1316

1417
traceResources() {

spec/lib/build/bundle.spec.js

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const BundlerMock = require('../../mocks/bundler');
44
const Bundle = require('../../../lib/build/bundle').Bundle;
55
const CLIOptionsMock = require('../../mocks/cli-options');
6+
const DependencyDescription = require('../../../lib/build/dependency-description').DependencyDescription;
67

78
describe('the Bundle module', () => {
89
let sut;
@@ -118,11 +119,16 @@ describe('the Bundle module', () => {
118119
return true;
119120
});
120121
bundler.configureDependency.and.callFake(dep => {
121-
return Promise.resolve({
122-
loaderConfig: {
123-
name: dep.name || dep
124-
}
125-
});
122+
let depName = dep.name || dep;
123+
let description = new DependencyDescription(depName);
124+
125+
description.loaderConfig = {
126+
name: depName,
127+
path: '../node_modules/' + depName,
128+
main: 'index.js'
129+
};
130+
131+
return Promise.resolve(description);
126132
});
127133

128134
let config = {
@@ -211,10 +217,12 @@ describe('the Bundle module', () => {
211217
let configuredDependencies = [];
212218
bundler.configureDependency.and.callFake(dep => {
213219
let depName = dep.name || dep;
214-
let description = {
215-
loaderConfig: {
216-
name: depName
217-
}
220+
221+
let description = new DependencyDescription(depName);
222+
description.loaderConfig = {
223+
name: depName,
224+
path: '../node_modules/' + depName,
225+
main: 'index.js'
218226
};
219227

220228
return new Promise(resolve => {
@@ -262,11 +270,12 @@ describe('the Bundle module', () => {
262270
it('add dependencies in the same order as they were entered to prevent a wrong module load order', done => {
263271
let bundler = new BundlerMock();
264272
bundler.configureDependency.and.callFake(dep => {
265-
return Promise.resolve({
266-
loaderConfig: {
267-
name: dep.name || dep
268-
}
269-
});
273+
let description = new DependencyDescription(dep.name || dep);
274+
description.loaderConfig = {
275+
name: dep.name || dep
276+
};
277+
278+
return Promise.resolve(description);
270279
});
271280
bundler.itemIncludedInBuild.and.callFake((dep) => true);
272281

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
'use strict';
2+
3+
const BundlerMock = require('../../mocks/bundler');
4+
const DependencyInclusion = require('../../../lib/build/dependency-inclusion').DependencyInclusion;
5+
const DependencyDescription = require('../../../lib/build/dependency-description').DependencyDescription;
6+
const mockfs = require('mock-fs');
7+
8+
describe('the DependencyInclusion module', () => {
9+
let bundler;
10+
11+
beforeEach(() => {
12+
bundler = new BundlerMock();
13+
});
14+
15+
afterEach(() => {
16+
mockfs.restore();
17+
});
18+
19+
it('adds a dependency file to the bundle when there is a main file', () => {
20+
let bundle = {
21+
bundler: bundler
22+
};
23+
24+
let description = new DependencyDescription();
25+
description.loaderConfig = {
26+
path: '../node_modules/my-package',
27+
name: 'my-package',
28+
main: 'index.js'
29+
};
30+
// eslint-disable-next-line no-unused-vars
31+
let sut = new DependencyInclusion(bundle, description);
32+
33+
expect(bundler.addFile).toHaveBeenCalled();
34+
});
35+
36+
it('adds a dependency file to the bundle when the path is a file', () => {
37+
mockfs({
38+
'../node_modules': {
39+
'my-package': {
40+
'index.js': 'some-content'
41+
}
42+
}
43+
});
44+
45+
let bundle = {
46+
bundler: bundler
47+
};
48+
49+
let description = new DependencyDescription();
50+
description.loaderConfig = {
51+
path: '../node_modules/my-package/index.js',
52+
name: 'my-package'
53+
};
54+
55+
// eslint-disable-next-line no-unused-vars
56+
let sut = new DependencyInclusion(bundle, description);
57+
58+
expect(bundler.addFile).toHaveBeenCalled();
59+
});
60+
61+
it('does not add dependency file to the bundle when main is set to false', () => {
62+
mockfs();
63+
64+
let bundle = {
65+
bundler: bundler
66+
};
67+
68+
let description = new DependencyDescription();
69+
description.loaderConfig = {
70+
path: '../node_modules/my-package',
71+
name: 'my-package',
72+
main: false
73+
};
74+
75+
// eslint-disable-next-line no-unused-vars
76+
let sut = new DependencyInclusion(bundle, description);
77+
78+
expect(bundler.addFile).not.toHaveBeenCalled();
79+
});
80+
81+
it('adds dependency file to the bundle when main is set to something other than false', () => {
82+
mockfs();
83+
84+
let bundle = {
85+
bundler: bundler
86+
};
87+
88+
let description = new DependencyDescription();
89+
description.loaderConfig = {
90+
path: '../node_modules/my-package',
91+
name: 'my-package',
92+
main: 'my-main-file.js'
93+
};
94+
95+
// eslint-disable-next-line no-unused-vars
96+
let sut = new DependencyInclusion(bundle, description);
97+
98+
expect(bundler.addFile).toHaveBeenCalled();
99+
});
100+
});

spec/mocks/bundler.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22

33
const Configuration = require('../../lib/configuration').Configuration;
4+
const CLIOptions = require('../../lib/cli-options').CLIOptions;
5+
const ProjectMock = require('./project-mock');
46

57
module.exports = class Bundler {
68
constructor() {
@@ -9,6 +11,8 @@ module.exports = class Bundler {
911
this.configureDependency = jasmine.createSpy('configureDependency');
1012
this.addFile = jasmine.createSpy('addFile');
1113

14+
CLIOptions.instance = new CLIOptions();
1215
this.buildOptions = new Configuration({}, {});
16+
this.project = new ProjectMock();
1317
}
1418
};

spec/mocks/project-mock.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
'use strict';
2+
3+
module.exports = class ProjectMock {
4+
constructor() {
5+
this.paths = {
6+
root: ''
7+
};
8+
}
9+
};

0 commit comments

Comments
 (0)