From 98a293f79bf822bca5f97db9155ee30ddaa03632 Mon Sep 17 00:00:00 2001 From: Fathy Boundjadj Date: Sun, 6 May 2018 18:33:19 +0200 Subject: [PATCH] Fix browser entry-point resolution (#1284) Fixes #1283 --- src/Resolver.js | 8 +++++++- .../resolve-entries/browser-multiple.js | 12 +++++++++--- .../pkg-browser-multiple/browser-entry.js | 3 +++ .../pkg-browser-multiple/package.json | 3 ++- test/javascript.js | 14 ++++++++++---- 5 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 test/integration/resolve-entries/pkg-browser-multiple/browser-entry.js diff --git a/src/Resolver.js b/src/Resolver.js index 56f7f03d8fa..245f5287e6e 100644 --- a/src/Resolver.js +++ b/src/Resolver.js @@ -267,10 +267,16 @@ class Resolver { } getPackageMain(pkg) { + let {browser} = pkg; + + if (typeof browser === 'object' && browser[pkg.name]) { + browser = browser[pkg.name]; + } + // libraries like d3.js specifies node.js specific files in the "main" which breaks the build // we use the "module" or "browser" field to get the full dependency tree if available. // If this is a linked module with a `source` field, use that as the entry point. - let main = [pkg.source, pkg.module, pkg.browser, pkg.main].find( + let main = [pkg.source, pkg.module, browser, pkg.main].find( entry => typeof entry === 'string' ); diff --git a/test/integration/resolve-entries/browser-multiple.js b/test/integration/resolve-entries/browser-multiple.js index 92950ec4248..c45bb19d085 100644 --- a/test/integration/resolve-entries/browser-multiple.js +++ b/test/integration/resolve-entries/browser-multiple.js @@ -1,7 +1,13 @@ -const required = require('./pkg-browser-multiple/projected') +const projected = require('./pkg-browser-multiple/projected') -if(required.test() !== 'pkg-browser-multiple') { +if(projected.test() !== 'pkg-browser-multiple') { throw new Error('Invalid module') } -export const test = required.test +const entry = require('./pkg-browser-multiple') + +if(entry.test() !== 'pkg-browser-multiple browser-entry') { + throw new Error('Invalid module') +} + +export const test = {projected, entry} diff --git a/test/integration/resolve-entries/pkg-browser-multiple/browser-entry.js b/test/integration/resolve-entries/pkg-browser-multiple/browser-entry.js new file mode 100644 index 00000000000..8388cdbe9ad --- /dev/null +++ b/test/integration/resolve-entries/pkg-browser-multiple/browser-entry.js @@ -0,0 +1,3 @@ +export function test() { + return 'pkg-browser-multiple browser-entry' +} diff --git a/test/integration/resolve-entries/pkg-browser-multiple/package.json b/test/integration/resolve-entries/pkg-browser-multiple/package.json index e3e274d981e..15a3ab99b29 100644 --- a/test/integration/resolve-entries/pkg-browser-multiple/package.json +++ b/test/integration/resolve-entries/pkg-browser-multiple/package.json @@ -2,6 +2,7 @@ "name": "pkg-browser-multiple", "main": "./does-not-exist.js", "browser": { - "./projected.js": "./projected-module.js" + "./projected.js": "./projected-module.js", + "pkg-browser-multiple": "browser-entry.js" } } \ No newline at end of file diff --git a/test/javascript.js b/test/javascript.js index addaf4df21c..d061981604f 100644 --- a/test/javascript.js +++ b/test/javascript.js @@ -507,7 +507,11 @@ describe('javascript', function() { assertBundleTree(b, { name: 'browser-multiple.js', - assets: ['browser-multiple.js', 'projected-module.js'], + assets: [ + 'browser-multiple.js', + 'projected-module.js', + 'browser-entry.js' + ], childBundles: [ { type: 'map' @@ -515,10 +519,12 @@ describe('javascript', function() { ] }); - let output = run(b); + let {test: output} = run(b); - assert.equal(typeof output.test, 'function'); - assert.equal(output.test(), 'pkg-browser-multiple'); + assert.equal(typeof output.projected.test, 'function'); + assert.equal(typeof output.entry.test, 'function'); + assert.equal(output.projected.test(), 'pkg-browser-multiple'); + assert.equal(output.entry.test(), 'pkg-browser-multiple browser-entry'); }); it('should resolve the module field before main', async function() {