From 1ef86232afe7adad5abd4db7cc4addf08a953ca4 Mon Sep 17 00:00:00 2001 From: Kelly Selden Date: Sat, 10 Feb 2018 23:08:06 -0800 Subject: [PATCH 1/8] update rollup and fix tests --- package-lock.json | 26 +++--------------- package.json | 2 +- test/test.js | 68 +++++++++++++++++++++++------------------------ 3 files changed, 39 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index a1c5db4..52f0235 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1502,13 +1502,10 @@ } }, "rollup": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.41.6.tgz", - "integrity": "sha1-4NBUl4d6OYwQTYFtJzOnGKepTio=", - "dev": true, - "requires": { - "source-map-support": "0.4.18" - } + "version": "0.54.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.54.1.tgz", + "integrity": "sha512-ebUUgUQ7K/sLn67CtO8Jj8H3RgKAoVWrpiJA7enOkwZPZzTCl8GC8CZ00g5jowjX80KgBmzs4Z1MV6cgglT86A==", + "dev": true }, "rollup-plugin-buble": { "version": "0.15.0", @@ -1622,21 +1619,6 @@ "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", diff --git a/package.json b/package.json index dbe40a2..119345b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "es5-ext": "^0.10.11", "eslint": "^3.18.0", "mocha": "^3.0.2", - "rollup": "^0.41.6", + "rollup": "^0.54.1", "rollup-plugin-buble": "^0.15.0", "rollup-plugin-commonjs": "^8.0.2", "string-capitalize": "^1.0.1", diff --git a/test/test.js b/test/test.js index 614a687..0662852 100644 --- a/test/test.js +++ b/test/test.js @@ -9,22 +9,22 @@ const fs = require( 'fs' ); process.chdir( __dirname ); function executeBundle ( bundle ) { - const generated = bundle.generate({ + return bundle.generate({ format: 'cjs' + }).then( generated => { + const fn = new Function ( 'module', 'exports', 'assert', generated.code ); + const module = { exports: {} }; + + fn( module, module.exports, assert ); + + return module; }); - - const fn = new Function ( 'module', 'exports', 'assert', generated.code ); - const module = { exports: {} }; - - fn( module, module.exports, assert ); - - return module; } describe( 'rollup-plugin-node-resolve', function () { it( 'finds a module with jsnext:main', function () { return rollup.rollup({ - entry: 'samples/jsnext/main.js', + input: 'samples/jsnext/main.js', plugins: [ nodeResolve({ jsnext: true }) ] @@ -35,7 +35,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'finds and converts a basic CommonJS module', function () { return rollup.rollup({ - entry: 'samples/commonjs/main.js', + input: 'samples/commonjs/main.js', plugins: [ nodeResolve({ main: true }), commonjs() @@ -47,7 +47,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'handles a trailing slash', function () { return rollup.rollup({ - entry: 'samples/trailing-slash/main.js', + input: 'samples/trailing-slash/main.js', plugins: [ nodeResolve({ main: true }), commonjs() @@ -59,7 +59,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'finds a file inside a package directory', function () { return rollup.rollup({ - entry: 'samples/granular/main.js', + input: 'samples/granular/main.js', plugins: [ nodeResolve(), buble() @@ -71,7 +71,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'loads local directories by finding index.js within them', function () { return rollup.rollup({ - entry: 'samples/local-index/main.js', + input: 'samples/local-index/main.js', plugins: [ nodeResolve() ] @@ -82,22 +82,22 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'loads package directories by finding index.js within them', function () { return rollup.rollup({ - entry: 'samples/package-index/main.js', + input: 'samples/package-index/main.js', plugins: [ nodeResolve() ] }).then( function ( bundle ) { - const generated = bundle.generate({ + return bundle.generate({ format: 'cjs' }); - + }).then( generated => { assert.ok( ~generated.code.indexOf( 'setPrototypeOf' ) ); }); }); it( 'disregards top-level browser field by default', function () { return rollup.rollup({ - entry: 'samples/browser/main.js', + input: 'samples/browser/main.js', plugins: [ nodeResolve({ main: true, @@ -111,7 +111,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'allows use of the top-level browser field', function () { return rollup.rollup({ - entry: 'samples/browser/main.js', + input: 'samples/browser/main.js', plugins: [ nodeResolve({ main: true, @@ -125,7 +125,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'disregards object browser field by default', function () { return rollup.rollup({ - entry: 'samples/browser-object/main.js', + input: 'samples/browser-object/main.js', plugins: [ nodeResolve({ main: true, @@ -141,7 +141,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'allows use of the object browser field', function () { return rollup.rollup({ - entry: 'samples/browser-object/main.js', + input: 'samples/browser-object/main.js', plugins: [ nodeResolve({ main: true, @@ -157,7 +157,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'supports `false` in browser field', function () { return rollup.rollup({ - entry: 'samples/browser-false/main.js', + input: 'samples/browser-false/main.js', plugins: [ nodeResolve({ main: true, @@ -169,7 +169,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'preferBuiltins: true allows preferring a builtin to a local module of the same name', () => { return rollup.rollup({ - entry: 'samples/prefer-builtin/main.js', + input: 'samples/prefer-builtin/main.js', plugins: [ nodeResolve({ preferBuiltins: true @@ -182,7 +182,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'preferBuiltins: false allows resolving a local module with the same name as a builtin module', () => { return rollup.rollup({ - entry: 'samples/prefer-builtin/main.js', + input: 'samples/prefer-builtin/main.js', plugins: [ nodeResolve({ preferBuiltins: false @@ -196,7 +196,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'issues a warning when preferring a builtin module without having explicit configuration', () => { let warning = null; return rollup.rollup({ - entry: 'samples/prefer-builtin/main.js', + input: 'samples/prefer-builtin/main.js', plugins: [ nodeResolve({ onwarn ( message ) { @@ -219,7 +219,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'supports non-standard extensions', () => { return rollup.rollup({ - entry: 'samples/extensions/main.js', + input: 'samples/extensions/main.js', plugins: [ nodeResolve({ extensions: [ '.js', '.wut' ] @@ -236,7 +236,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'finds a module with module field', () => { return rollup.rollup({ - entry: 'samples/module/main.js', + input: 'samples/module/main.js', plugins: [ nodeResolve({ preferBuiltins: false }) ] @@ -247,7 +247,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'prefers module field over jsnext:main and main', () => { return rollup.rollup({ - entry: 'samples/prefer-module/main.js', + input: 'samples/prefer-module/main.js', plugins: [ nodeResolve({ jsnext: true, preferBuiltins: false }) ] @@ -261,7 +261,7 @@ describe( 'rollup-plugin-node-resolve', function () { linkDirectories(); return rollup.rollup({ - entry: 'samples/symlinked/first/index.js', + input: 'samples/symlinked/first/index.js', plugins: [ nodeResolve() ] @@ -301,7 +301,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'prefers jsnext:main field over main', () => { return rollup.rollup({ - entry: 'samples/prefer-jsnext/main.js', + input: 'samples/prefer-jsnext/main.js', plugins: [ nodeResolve({ jsnext: true, module: false, preferBuiltins: false }) ] @@ -312,7 +312,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'supports ./ in entry filename', () => { return rollup.rollup({ - entry: './samples/jsnext/main.js', + input: './samples/jsnext/main.js', plugins: [ nodeResolve({ jsnext: true }) ] @@ -337,7 +337,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'mark as external to module outside the jail', () => { return rollup.rollup({ - entry: 'samples/jail/main.js', + input: 'samples/jail/main.js', plugins: [ nodeResolve({ jail: `${__dirname}/samples/` }) ] @@ -348,7 +348,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'bundle module defined inside the jail', () => { return rollup.rollup({ - entry: 'samples/jail/main.js', + input: 'samples/jail/main.js', plugins: [ nodeResolve({ jail: `${__dirname}/` }) ] @@ -359,7 +359,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'allows custom options', () => { return rollup.rollup({ - entry: 'samples/custom-resolve-options/main.js', + input: 'samples/custom-resolve-options/main.js', plugins: [ nodeResolve({ customResolveOptions: { moduleDirectory: 'js_modules' @@ -375,7 +375,7 @@ describe( 'rollup-plugin-node-resolve', function () { it( 'ignores deep-import non-modules', () => { return rollup.rollup({ - entry: 'samples/deep-import-non-module/main.js', + input: 'samples/deep-import-non-module/main.js', plugins: [ nodeResolve({ modulesOnly: true }) ] From 7648c3ec609523329c5c0e69a343b6b43fbd84dc Mon Sep 17 00:00:00 2001 From: Keith Cirkel Date: Mon, 15 Jan 2018 11:57:20 +0000 Subject: [PATCH 2/8] fix(browser-resolve): fix regressions from refactor --- src/index.js | 26 +++++++---- test/node_modules/builtins-browser/fs.js | 1 + test/node_modules/builtins-browser/index.js | 2 + .../builtins-browser/package.json | 6 +++ .../isomorphic-nested/lib/browser-dep.js | 1 + .../isomorphic-nested/lib/browser-test.js | 1 + .../isomorphic-nested/lib/browser.js | 5 ++ .../node_modules/isomorphic-nested/lib/dep.js | 1 + .../isomorphic-nested/lib/index.js | 5 ++ .../isomorphic-nested/package.json | 8 ++++ .../isomorphic-object-main/browser-dep.js | 1 + .../isomorphic-object-main/browser-test.js | 1 + .../isomorphic-object-main/browser.js | 5 ++ .../isomorphic-object-main/dep.js | 1 + .../isomorphic-object-main/index.js | 5 ++ .../isomorphic-object-main/package.json | 8 ++++ test/samples/browser-object-builtin/main.js | 2 + test/samples/browser-object-main/main.js | 2 + test/samples/browser-object-nested/main.js | 2 + test/test.js | 46 +++++++++++++++++++ 20 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 test/node_modules/builtins-browser/fs.js create mode 100644 test/node_modules/builtins-browser/index.js create mode 100644 test/node_modules/builtins-browser/package.json create mode 100644 test/node_modules/isomorphic-nested/lib/browser-dep.js create mode 100644 test/node_modules/isomorphic-nested/lib/browser-test.js create mode 100644 test/node_modules/isomorphic-nested/lib/browser.js create mode 100644 test/node_modules/isomorphic-nested/lib/dep.js create mode 100644 test/node_modules/isomorphic-nested/lib/index.js create mode 100644 test/node_modules/isomorphic-nested/package.json create mode 100644 test/node_modules/isomorphic-object-main/browser-dep.js create mode 100644 test/node_modules/isomorphic-object-main/browser-test.js create mode 100644 test/node_modules/isomorphic-object-main/browser.js create mode 100644 test/node_modules/isomorphic-object-main/dep.js create mode 100644 test/node_modules/isomorphic-object-main/index.js create mode 100644 test/node_modules/isomorphic-object-main/package.json create mode 100644 test/samples/browser-object-builtin/main.js create mode 100644 test/samples/browser-object-main/main.js create mode 100644 test/samples/browser-object-nested/main.js diff --git a/src/index.js b/src/index.js index d9778e9..a708e73 100644 --- a/src/index.js +++ b/src/index.js @@ -37,13 +37,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']; + } } @@ -66,19 +67,26 @@ 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)) browser[ absoluteKey + '.js'] = browser[ absoluteKey+ '.json' ] = browser[ key ]; + } return browser; }, {}); } + const absoluteMain = pkg[ 'main' ] ? resolve( pkgRoot, pkg[ 'main' ] ) : false; 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 (options.browser && packageBrowserField && (packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ])) { + pkg[ 'main' ] = packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ]; } else if ( useModule && pkg[ 'module' ] ) { pkg[ 'main' ] = pkg[ 'module' ]; } else if ( useJsnext && pkg[ 'jsnext:main' ] ) { diff --git a/test/node_modules/builtins-browser/fs.js b/test/node_modules/builtins-browser/fs.js new file mode 100644 index 0000000..ff4756e --- /dev/null +++ b/test/node_modules/builtins-browser/fs.js @@ -0,0 +1 @@ +export default 'browser-fs'; diff --git a/test/node_modules/builtins-browser/index.js b/test/node_modules/builtins-browser/index.js new file mode 100644 index 0000000..f0a6c3c --- /dev/null +++ b/test/node_modules/builtins-browser/index.js @@ -0,0 +1,2 @@ +import fs from 'fs'; +export default fs; diff --git a/test/node_modules/builtins-browser/package.json b/test/node_modules/builtins-browser/package.json new file mode 100644 index 0000000..5486738 --- /dev/null +++ b/test/node_modules/builtins-browser/package.json @@ -0,0 +1,6 @@ +{ + "main": "./index.js", + "browser": { + "fs": "./fs.js" + } +} diff --git a/test/node_modules/isomorphic-nested/lib/browser-dep.js b/test/node_modules/isomorphic-nested/lib/browser-dep.js new file mode 100644 index 0000000..35ba3db --- /dev/null +++ b/test/node_modules/isomorphic-nested/lib/browser-dep.js @@ -0,0 +1 @@ +export default 'browser-dep'; diff --git a/test/node_modules/isomorphic-nested/lib/browser-test.js b/test/node_modules/isomorphic-nested/lib/browser-test.js new file mode 100644 index 0000000..8efc729 --- /dev/null +++ b/test/node_modules/isomorphic-nested/lib/browser-test.js @@ -0,0 +1 @@ +export default 43; diff --git a/test/node_modules/isomorphic-nested/lib/browser.js b/test/node_modules/isomorphic-nested/lib/browser.js new file mode 100644 index 0000000..7b14d9a --- /dev/null +++ b/test/node_modules/isomorphic-nested/lib/browser.js @@ -0,0 +1,5 @@ +import dep from './dep.js'; +import test from './test'; + +var env = 'browser'; +export { env, dep, test }; diff --git a/test/node_modules/isomorphic-nested/lib/dep.js b/test/node_modules/isomorphic-nested/lib/dep.js new file mode 100644 index 0000000..2089e19 --- /dev/null +++ b/test/node_modules/isomorphic-nested/lib/dep.js @@ -0,0 +1 @@ +export default 'node-dep'; diff --git a/test/node_modules/isomorphic-nested/lib/index.js b/test/node_modules/isomorphic-nested/lib/index.js new file mode 100644 index 0000000..12299ac --- /dev/null +++ b/test/node_modules/isomorphic-nested/lib/index.js @@ -0,0 +1,5 @@ +import dep from './dep.js'; +import test from 'test'; + +var env = 'node'; +export { env, dep, test }; diff --git a/test/node_modules/isomorphic-nested/package.json b/test/node_modules/isomorphic-nested/package.json new file mode 100644 index 0000000..976f6d3 --- /dev/null +++ b/test/node_modules/isomorphic-nested/package.json @@ -0,0 +1,8 @@ +{ + "main": "./lib/index.js", + "browser": { + "./lib/index.js": "./lib/browser.js", + "./lib/dep.js": "./lib/browser-dep.js", + "./lib/test": "./lib/browser-test.js" + } +} diff --git a/test/node_modules/isomorphic-object-main/browser-dep.js b/test/node_modules/isomorphic-object-main/browser-dep.js new file mode 100644 index 0000000..35ba3db --- /dev/null +++ b/test/node_modules/isomorphic-object-main/browser-dep.js @@ -0,0 +1 @@ +export default 'browser-dep'; diff --git a/test/node_modules/isomorphic-object-main/browser-test.js b/test/node_modules/isomorphic-object-main/browser-test.js new file mode 100644 index 0000000..8efc729 --- /dev/null +++ b/test/node_modules/isomorphic-object-main/browser-test.js @@ -0,0 +1 @@ +export default 43; diff --git a/test/node_modules/isomorphic-object-main/browser.js b/test/node_modules/isomorphic-object-main/browser.js new file mode 100644 index 0000000..136fdc4 --- /dev/null +++ b/test/node_modules/isomorphic-object-main/browser.js @@ -0,0 +1,5 @@ +import dep from './dep.js'; +import test from 'test'; + +var env = 'browser'; +export { env, dep, test }; diff --git a/test/node_modules/isomorphic-object-main/dep.js b/test/node_modules/isomorphic-object-main/dep.js new file mode 100644 index 0000000..2089e19 --- /dev/null +++ b/test/node_modules/isomorphic-object-main/dep.js @@ -0,0 +1 @@ +export default 'node-dep'; diff --git a/test/node_modules/isomorphic-object-main/index.js b/test/node_modules/isomorphic-object-main/index.js new file mode 100644 index 0000000..12299ac --- /dev/null +++ b/test/node_modules/isomorphic-object-main/index.js @@ -0,0 +1,5 @@ +import dep from './dep.js'; +import test from 'test'; + +var env = 'node'; +export { env, dep, test }; diff --git a/test/node_modules/isomorphic-object-main/package.json b/test/node_modules/isomorphic-object-main/package.json new file mode 100644 index 0000000..39bbc8b --- /dev/null +++ b/test/node_modules/isomorphic-object-main/package.json @@ -0,0 +1,8 @@ +{ + "main": "index.js", + "browser": { + "./index.js": "./browser.js", + "./dep.js": "./browser-dep.js", + "test": "./browser-test.js" + } +} diff --git a/test/samples/browser-object-builtin/main.js b/test/samples/browser-object-builtin/main.js new file mode 100644 index 0000000..6b1126e --- /dev/null +++ b/test/samples/browser-object-builtin/main.js @@ -0,0 +1,2 @@ +import main from 'builtins-browser'; +export default main; diff --git a/test/samples/browser-object-main/main.js b/test/samples/browser-object-main/main.js new file mode 100644 index 0000000..eac1b42 --- /dev/null +++ b/test/samples/browser-object-main/main.js @@ -0,0 +1,2 @@ +import { env, dep, test } from 'isomorphic-object-main'; +export { env, dep, test }; diff --git a/test/samples/browser-object-nested/main.js b/test/samples/browser-object-nested/main.js new file mode 100644 index 0000000..4ffdd23 --- /dev/null +++ b/test/samples/browser-object-nested/main.js @@ -0,0 +1,2 @@ +import { env, dep, test } from 'isomorphic-nested'; +export { env, dep, test }; diff --git a/test/test.js b/test/test.js index 0662852..c7124f2 100644 --- a/test/test.js +++ b/test/test.js @@ -155,6 +155,52 @@ 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 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({ input: 'samples/browser-false/main.js', From 1d8af1a3eb9de39bc6cfff362eab1f6b99cf39e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 14 Feb 2018 15:17:45 +0100 Subject: [PATCH 3/8] Respect `browser` field configuration in case of implicit `main` --- src/index.js | 10 ++++++---- .../isomorphic-object-main-implicit/browser.js | 2 ++ .../isomorphic-object-main-implicit/index.js | 2 ++ .../isomorphic-object-main-implicit/package.json | 5 +++++ test/samples/browser-object/main-implicit.js | 2 ++ test/test.js | 14 ++++++++++++++ 6 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 test/node_modules/isomorphic-object-main-implicit/browser.js create mode 100644 test/node_modules/isomorphic-object-main-implicit/index.js create mode 100644 test/node_modules/isomorphic-object-main-implicit/package.json create mode 100644 test/samples/browser-object/main-implicit.js diff --git a/src/index.js b/src/index.js index a708e73..a232c31 100644 --- a/src/index.js +++ b/src/index.js @@ -82,11 +82,8 @@ export default function nodeResolve ( options = {} ) { }, {}); } - const absoluteMain = pkg[ 'main' ] ? resolve( pkgRoot, pkg[ 'main' ] ) : false; if (options.browser && typeof pkg[ 'browser' ] === 'string') { pkg[ 'main' ] = pkg[ 'browser' ]; - } else if (options.browser && packageBrowserField && (packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ])) { - pkg[ 'main' ] = packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ]; } else if ( useModule && pkg[ 'module' ] ) { pkg[ 'main' ] = pkg[ 'module' ]; } else if ( useJsnext && pkg[ 'jsnext:main' ] ) { @@ -99,7 +96,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 ) ) { diff --git a/test/node_modules/isomorphic-object-main-implicit/browser.js b/test/node_modules/isomorphic-object-main-implicit/browser.js new file mode 100644 index 0000000..866654a --- /dev/null +++ b/test/node_modules/isomorphic-object-main-implicit/browser.js @@ -0,0 +1,2 @@ +var env = 'browser'; +export { env }; diff --git a/test/node_modules/isomorphic-object-main-implicit/index.js b/test/node_modules/isomorphic-object-main-implicit/index.js new file mode 100644 index 0000000..6a845dc --- /dev/null +++ b/test/node_modules/isomorphic-object-main-implicit/index.js @@ -0,0 +1,2 @@ +var env = 'node'; +export { env }; diff --git a/test/node_modules/isomorphic-object-main-implicit/package.json b/test/node_modules/isomorphic-object-main-implicit/package.json new file mode 100644 index 0000000..dadb70d --- /dev/null +++ b/test/node_modules/isomorphic-object-main-implicit/package.json @@ -0,0 +1,5 @@ +{ + "browser": { + "./index.js": "./browser.js" + } +} diff --git a/test/samples/browser-object/main-implicit.js b/test/samples/browser-object/main-implicit.js new file mode 100644 index 0000000..01d728f --- /dev/null +++ b/test/samples/browser-object/main-implicit.js @@ -0,0 +1,2 @@ +import { env } from 'isomorphic-object-main-implicit'; +export { env }; diff --git a/test/test.js b/test/test.js index c7124f2..31fc02d 100644 --- a/test/test.js +++ b/test/test.js @@ -171,6 +171,20 @@ describe( 'rollup-plugin-node-resolve', function () { }); }); + 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', From d9ff8c1e50589d7fadd0b48065d898f5533c4c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 14 Feb 2018 15:18:34 +0100 Subject: [PATCH 4/8] Handle `.node` extension when resolving `browser` entries --- src/index.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index a232c31..7947c2b 100644 --- a/src/index.js +++ b/src/index.js @@ -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; @@ -76,7 +77,12 @@ export default function nodeResolve ( options = {} ) { if ( key[0] === '.' ) { const absoluteKey = resolve( pkgRoot, key ); browser[ absoluteKey ] = resolved; - if (!extname(key)) browser[ absoluteKey + '.js'] = browser[ absoluteKey+ '.json' ] = browser[ key ]; + if ( !extname(key) ) { + exts.reduce( ( browser, ext ) => { + browser[ absoluteKey + ext ] = browser[ key ]; + return browser; + }, browser ); + } } return browser; }, {}); From 69948ba8904329c1a5374164769b34410b38e2a7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 14 Feb 2018 09:54:36 -0500 Subject: [PATCH 5/8] -> v3.0.3 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a60c15..ddaed68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # rollup-plugin-node-resolve changelog +## 3.0.3 + +* Fix [#130](https://github.com/rollup/rollup-plugin-node-resolve/issues/130) and [#131](https://github.com/rollup/rollup-plugin-node-resolve/issues/131) + ## 3.0.2 * Ensure `pkg.browser` is an object if necessary ([#129](https://github.com/rollup/rollup-plugin-node-resolve/pull/129)) diff --git a/package.json b/package.json index 119345b..d855686 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rollup-plugin-node-resolve", "description": "Bundle third-party dependencies in node_modules", - "version": "3.0.2", + "version": "3.0.3", "devDependencies": { "buble": "^0.15.2", "es5-ext": "^0.10.11", From 1f308d5c66710c816e5fc9a058de42c47832b120 Mon Sep 17 00:00:00 2001 From: Keith Cirkel Date: Mon, 15 Jan 2018 11:57:20 +0000 Subject: [PATCH 6/8] fix(browser-resolve): fix regressions from refactor --- src/index.js | 18 +++++------------- test/test.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/index.js b/src/index.js index 7947c2b..a708e73 100644 --- a/src/index.js +++ b/src/index.js @@ -6,7 +6,6 @@ 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; @@ -77,19 +76,17 @@ export default function nodeResolve ( options = {} ) { 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 ); - } + if (!extname(key)) browser[ absoluteKey + '.js'] = browser[ absoluteKey+ '.json' ] = browser[ key ]; } return browser; }, {}); } + const absoluteMain = pkg[ 'main' ] ? resolve( pkgRoot, pkg[ 'main' ] ) : false; if (options.browser && typeof pkg[ 'browser' ] === 'string') { pkg[ 'main' ] = pkg[ 'browser' ]; + } else if (options.browser && packageBrowserField && (packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ])) { + pkg[ 'main' ] = packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ]; } else if ( useModule && pkg[ 'module' ] ) { pkg[ 'main' ] = pkg[ 'module' ]; } else if ( useJsnext && pkg[ 'jsnext:main' ] ) { @@ -102,12 +99,7 @@ export default function nodeResolve ( options = {} ) { extensions: options.extensions }, customResolveOptions ), ( err, resolved ) => { - if (options.browser && packageBrowserField) { - if (packageBrowserField[ resolved ]) { - resolved = packageBrowserField[ resolved ]; - } - browserMapCache[resolved] = packageBrowserField; - } + if (options.browser && packageBrowserField) browserMapCache[resolved] = packageBrowserField; if ( !disregardResult && !err ) { if ( resolved && fs.existsSync( resolved ) ) { diff --git a/test/test.js b/test/test.js index 31fc02d..e6817f3 100644 --- a/test/test.js +++ b/test/test.js @@ -215,6 +215,52 @@ 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 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({ input: 'samples/browser-false/main.js', From 1895d7376121614d6da71fcf0b882a6ee59b635e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 14 Feb 2018 15:17:45 +0100 Subject: [PATCH 7/8] Respect `browser` field configuration in case of implicit `main` --- src/index.js | 10 ++++++---- test/test.js | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index a708e73..a232c31 100644 --- a/src/index.js +++ b/src/index.js @@ -82,11 +82,8 @@ export default function nodeResolve ( options = {} ) { }, {}); } - const absoluteMain = pkg[ 'main' ] ? resolve( pkgRoot, pkg[ 'main' ] ) : false; if (options.browser && typeof pkg[ 'browser' ] === 'string') { pkg[ 'main' ] = pkg[ 'browser' ]; - } else if (options.browser && packageBrowserField && (packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ])) { - pkg[ 'main' ] = packageBrowserField[ pkg[ 'main' ] ] || packageBrowserField[ absoluteMain ]; } else if ( useModule && pkg[ 'module' ] ) { pkg[ 'main' ] = pkg[ 'module' ]; } else if ( useJsnext && pkg[ 'jsnext:main' ] ) { @@ -99,7 +96,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 ) ) { diff --git a/test/test.js b/test/test.js index e6817f3..3cfacae 100644 --- a/test/test.js +++ b/test/test.js @@ -231,6 +231,20 @@ describe( 'rollup-plugin-node-resolve', function () { }); }); + 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', From 077f7ae32a47c7569bafe64b241c159550cdc9b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 14 Feb 2018 15:18:34 +0100 Subject: [PATCH 8/8] Handle `.node` extension when resolving `browser` entries --- src/index.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index a232c31..7947c2b 100644 --- a/src/index.js +++ b/src/index.js @@ -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; @@ -76,7 +77,12 @@ export default function nodeResolve ( options = {} ) { if ( key[0] === '.' ) { const absoluteKey = resolve( pkgRoot, key ); browser[ absoluteKey ] = resolved; - if (!extname(key)) browser[ absoluteKey + '.js'] = browser[ absoluteKey+ '.json' ] = browser[ key ]; + if ( !extname(key) ) { + exts.reduce( ( browser, ext ) => { + browser[ absoluteKey + ext ] = browser[ key ]; + return browser; + }, browser ); + } } return browser; }, {});