Skip to content
This repository has been archived by the owner on Aug 4, 2021. It is now read-only.

Commit

Permalink
Merge pull request #133 from keithamus/fix-browser-resolve-regressions
Browse files Browse the repository at this point in the history
fix(browser-resolve): fix regressions from refactor
  • Loading branch information
Rich-Harris committed Feb 14, 2018
2 parents 1b26066 + 0efbed0 commit 4c35e91
Show file tree
Hide file tree
Showing 24 changed files with 154 additions and 10 deletions.
36 changes: 26 additions & 10 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import fs from 'fs';

const ES6_BROWSER_EMPTY = resolve( __dirname, '../src/empty.js' );
const CONSOLE_WARN = ( ...args ) => console.warn( ...args ); // eslint-disable-line no-console
const exts = [ '.js', '.json', '.node' ];

export default function nodeResolve ( options = {} ) {
const useModule = options.module !== false;
Expand Down Expand Up @@ -37,13 +38,14 @@ export default function nodeResolve ( options = {} ) {
if ( !importer ) return null;

if (options.browser && browserMapCache[importer]) {
const resolvedImportee = resolve( dirname( importer ), importee );
const browser = browserMapCache[importer];
if (browser[importee]) {
importee = browser[importee];
}
if (browser[importee] === false) {
if (browser[importee] === false || browser[resolvedImportee] === false) {
return ES6_BROWSER_EMPTY;
}
if (browser[importee] || browser[resolvedImportee] || browser[resolvedImportee + '.js'] || browser[resolvedImportee + '.json']) {
importee = browser[importee] || browser[resolvedImportee] || browser[resolvedImportee + '.js'] || browser[resolvedImportee + '.json'];
}
}


Expand All @@ -66,19 +68,28 @@ export default function nodeResolve ( options = {} ) {
importee,
Object.assign({
basedir: dirname( importer ),
packageFilter ( pkg ) {
packageFilter ( pkg, pkgPath ) {
const pkgRoot = dirname( pkgPath );
if (options.browser && typeof pkg[ 'browser' ] === 'object') {
packageBrowserField = Object.keys(pkg[ 'browser' ]).reduce((browser, key) => {
browser[ key ] = pkg[ 'browser' ][key];
if (key[0] === '.' && !extname(key)) browser[ key + '.js'] = browser[ key + '.json' ] = browser[ key ];
const resolved = pkg[ 'browser' ][ key ] === false ? false : resolve( pkgRoot, pkg[ 'browser' ][ key ] );
browser[ key ] = resolved;
if ( key[0] === '.' ) {
const absoluteKey = resolve( pkgRoot, key );
browser[ absoluteKey ] = resolved;
if ( !extname(key) ) {
exts.reduce( ( browser, ext ) => {
browser[ absoluteKey + ext ] = browser[ key ];
return browser;
}, browser );
}
}
return browser;
}, {});
}

if (options.browser && typeof pkg[ 'browser' ] === 'string') {
pkg[ 'main' ] = pkg[ 'browser' ];
} else if (options.browser && typeof pkg[ 'browser' ] === 'object' && pkg[ 'browser' ][ pkg[ 'main' ] ]) {
pkg[ 'main' ] = pkg[ 'browser' ][ pkg[ 'main' ] ];
} else if ( useModule && pkg[ 'module' ] ) {
pkg[ 'main' ] = pkg[ 'module' ];
} else if ( useJsnext && pkg[ 'jsnext:main' ] ) {
Expand All @@ -91,7 +102,12 @@ export default function nodeResolve ( options = {} ) {
extensions: options.extensions
}, customResolveOptions ),
( err, resolved ) => {
if (options.browser && packageBrowserField) browserMapCache[resolved] = packageBrowserField;
if (options.browser && packageBrowserField) {
if (packageBrowserField[ resolved ]) {
resolved = packageBrowserField[ resolved ];
}
browserMapCache[resolved] = packageBrowserField;
}

if ( !disregardResult && !err ) {
if ( resolved && fs.existsSync( resolved ) ) {
Expand Down
1 change: 1 addition & 0 deletions test/node_modules/builtins-browser/fs.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions test/node_modules/builtins-browser/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions test/node_modules/builtins-browser/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions test/node_modules/isomorphic-nested/lib/browser-dep.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions test/node_modules/isomorphic-nested/lib/browser-test.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/node_modules/isomorphic-nested/lib/browser.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions test/node_modules/isomorphic-nested/lib/dep.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/node_modules/isomorphic-nested/lib/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions test/node_modules/isomorphic-nested/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions test/node_modules/isomorphic-object-main-implicit/browser.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions test/node_modules/isomorphic-object-main-implicit/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions test/node_modules/isomorphic-object-main/browser-dep.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions test/node_modules/isomorphic-object-main/browser-test.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/node_modules/isomorphic-object-main/browser.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions test/node_modules/isomorphic-object-main/dep.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/node_modules/isomorphic-object-main/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions test/node_modules/isomorphic-object-main/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions test/samples/browser-object-builtin/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import main from 'builtins-browser';
export default main;
2 changes: 2 additions & 0 deletions test/samples/browser-object-main/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { env, dep, test } from 'isomorphic-object-main';
export { env, dep, test };
2 changes: 2 additions & 0 deletions test/samples/browser-object-nested/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { env, dep, test } from 'isomorphic-nested';
export { env, dep, test };
2 changes: 2 additions & 0 deletions test/samples/browser-object/main-implicit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { env } from 'isomorphic-object-main-implicit';
export { env };
60 changes: 60 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,66 @@ describe( 'rollup-plugin-node-resolve', function () {
});
});

it( 'allows use of object browser field, resolving `main`', function () {
return rollup.rollup({
entry: 'samples/browser-object-main/main.js',
plugins: [
nodeResolve({
main: true,
browser: true
})
]
}).then( executeBundle ).then( module => {
assert.equal( module.exports.env, 'browser' );
assert.equal( module.exports.dep, 'browser-dep' );
assert.equal( module.exports.test, 43 );
});
});

it( 'allows use of object browser field, resolving implicit `main`', function () {
return rollup.rollup({
entry: 'samples/browser-object/main-implicit.js',
plugins: [
nodeResolve({
main: true,
browser: true
})
]
}).then( executeBundle ).then( module => {
assert.equal( module.exports.env, 'browser' );
});
});

it( 'allows use of object browser field, resolving replaced builtins', function () {
return rollup.rollup({
entry: 'samples/browser-object-builtin/main.js',
plugins: [
nodeResolve({
main: true,
browser: true
})
]
}).then( executeBundle ).then( module => {
assert.equal( module.exports, 'browser-fs' );
});
});

it( 'allows use of object browser field, resolving nested directories', function () {
return rollup.rollup({
entry: 'samples/browser-object-nested/main.js',
plugins: [
nodeResolve({
main: true,
browser: true
})
]
}).then( executeBundle ).then( module => {
assert.equal( module.exports.env, 'browser' );
assert.equal( module.exports.dep, 'browser-dep' );
assert.equal( module.exports.test, 43 );
});
});

it( 'supports `false` in browser field', function () {
return rollup.rollup({
entry: 'samples/browser-false/main.js',
Expand Down

0 comments on commit 4c35e91

Please sign in to comment.