Skip to content

Commit a3bc63a

Browse files
committed
feat(bundler): use package.json "module" (es module format) over "main"
Improves compatibility with TypeScript generated code. Try 1.browser > 2.module > 3.main. The order is to target browser. When aurelia-cli introduces multi-targets build in future, it probably should use different order for electron app: For electron 1.module > 2.browser > 3.main
1 parent 15af83f commit a3bc63a

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

lib/build/package-analyzer.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,18 @@ function determineLoaderConfig(project, description) {
130130
let metaMain;
131131

132132
if (metadata) {
133+
// try 1.browser > 2.module > 3.main
134+
// the order is to target browser.
135+
// when aurelia-cli introduces multi-targets build,
136+
// it probably should use different order for electron app
137+
// for electron 1.module > 2.browser > 3.main
133138
if (typeof metadata.browser === 'string') {
134-
// use package.json browser field if possible
139+
// use package.json browser field if possible.
135140
metaMain = metadata.browser;
141+
} else if (metadata.module) {
142+
// prefer es module format over cjs, just like webpack.
143+
// this improves compatibility with TypeScript.
144+
metaMain = metadata.module;
136145
} else {
137146
metaMain = metadata.main;
138147
}

spec/lib/build/package-analyzer.spec.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,10 @@ describe('The PackageAnalyzer', () => {
328328
.catch(e => done.fail(e));
329329
});
330330

331-
it('analyze() reads package.json as package metadata, respect browser field', done => {
331+
it('analyze() reads package.json as package metadata, respect browser field over module/main', done => {
332332
// setup mock package.json
333333
const fsConfig = {};
334-
fsConfig[path.join('node_modules/my-package', 'package.json')] = '{ "name": "my-package", "main": "index.js", "browser": "browser.js" }';
334+
fsConfig[path.join('node_modules/my-package', 'package.json')] = '{ "name": "my-package", "main": "index.js", "browser": "browser.js", "module": "module.js" }';
335335
fsConfig[path.join('node_modules/my-package', 'index.js')] = 'some-content';
336336
fsConfig[path.join('node_modules/my-package', 'browser.js')] = 'some-content';
337337
fsConfig[project.paths.root] = {};
@@ -347,6 +347,26 @@ describe('The PackageAnalyzer', () => {
347347
.catch(e => done.fail(e));
348348
});
349349

350+
it('analyze() reads package.json as package metadata, respect module field over main', done => {
351+
// setup mock package.json
352+
const fsConfig = {};
353+
fsConfig[path.join('node_modules/my-package', 'package.json')] = '{ "name": "my-package", "main": "index.js", "module": "module.js"}';
354+
fsConfig[path.join('node_modules/my-package', 'index.js')] = 'some-content';
355+
fsConfig[path.join('node_modules/my-package', 'browser.js')] = 'some-content';
356+
fsConfig[path.join('node_modules/my-package', 'module.js')] = 'some-content';
357+
fsConfig[project.paths.root] = {};
358+
mockfs(fsConfig);
359+
360+
sut.analyze('my-package')
361+
.then(description => {
362+
expect(description.metadata.name).toBe('my-package');
363+
expect(description.loaderConfig.path).toBe('../node_modules/my-package');
364+
expect(description.loaderConfig.main).toBe('module');
365+
done();
366+
})
367+
.catch(e => done.fail(e));
368+
});
369+
350370
it('analyze() supports parent node_modules folder', done => {
351371
// setup mock package.json
352372
const fsConfig = {};

0 commit comments

Comments
 (0)