From b4598fb892315fe0bff6c97cfecf6ccb4413275f Mon Sep 17 00:00:00 2001 From: Andrew Carpenter Date: Fri, 8 Jun 2018 11:49:03 -0400 Subject: [PATCH] Allow browser to be an array This allows only certain files to respect the browser field. --- README.md | 3 +++ package-lock.json | 18 +++++++++--------- src/index.js | 22 ++++++++++++++-------- test/test.js | 28 ++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index fbb4b40..1592007 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ export default { // for the browser. If that's you, use this option, otherwise // pkg.browser will be ignored browser: true, // Default: false + // browser can also be specified as an array of strings and/or regexps + // so that only modules that match at least one entry use the browser + // field. ex. browser: [ 'some_module', /^@some_scope\/.*$/ ], // not all files you want to resolve are .js files extensions: [ '.mjs', '.js', '.jsx', '.json' ], // Default: [ '.mjs', '.js', '.json', '.node' ] diff --git a/package-lock.json b/package-lock.json index 266dfa9..87225f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1621,6 +1621,15 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "string-capitalize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-capitalize/-/string-capitalize-1.0.1.tgz", @@ -1637,15 +1646,6 @@ "strip-ansi": "4.0.0" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", diff --git a/src/index.js b/src/index.js index 825930a..9654d22 100644 --- a/src/index.js +++ b/src/index.js @@ -38,6 +38,13 @@ function cachedIsFile (file, cb) { isFileCache[file].then(contents => cb(null, contents), cb); } +const moduleFilter = (filter) => Array.isArray(filter) + ? filter.map(o => o instanceof RegExp + ? o + : new RegExp('^' + String(o).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&') + '$') + ) + : null; + export default function nodeResolve ( options = {} ) { const useModule = options.module !== false; const useMain = options.main !== false; @@ -46,12 +53,7 @@ export default function nodeResolve ( options = {} ) { const preferBuiltins = isPreferBuiltinsSet ? options.preferBuiltins : true; const customResolveOptions = options.customResolveOptions || {}; const jail = options.jail; - const only = Array.isArray(options.only) - ? options.only.map(o => o instanceof RegExp - ? o - : new RegExp('^' + String(o).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&') + '$') - ) - : null; + const only = moduleFilter(options.only); const browserMapCache = {}; const onwarn = options.onwarn || CONSOLE_WARN; @@ -118,7 +120,11 @@ export default function nodeResolve ( options = {} ) { basedir: dirname( importer ), packageFilter ( pkg, pkgPath ) { const pkgRoot = dirname( pkgPath ); - if (options.browser && typeof pkg[ 'browser' ] === 'object') { + const browserFilter = moduleFilter(options.browser); + const useBrowser = options.browser && ( + !browserFilter || browserFilter.some(pattern => pattern.test(id)) + ); + if (useBrowser && typeof pkg[ 'browser' ] === 'object') { packageBrowserField = Object.keys(pkg[ 'browser' ]).reduce((browser, key) => { const resolved = pkg[ 'browser' ][ key ] === false ? false : resolve( pkgRoot, pkg[ 'browser' ][ key ] ); browser[ key ] = resolved; @@ -136,7 +142,7 @@ export default function nodeResolve ( options = {} ) { }, {}); } - if (options.browser && typeof pkg[ 'browser' ] === 'string') { + if (useBrowser && typeof pkg[ 'browser' ] === 'string') { pkg[ 'main' ] = pkg[ 'browser' ]; } else if ( useModule && pkg[ 'module' ] ) { pkg[ 'main' ] = pkg[ 'module' ]; diff --git a/test/test.js b/test/test.js index 47d44b8..5f2753e 100644 --- a/test/test.js +++ b/test/test.js @@ -123,6 +123,34 @@ describe( 'rollup-plugin-node-resolve', function () { }); }); + it( 'disregards browser field for modules not in browser array', function () { + return rollup.rollup({ + input: 'samples/browser/main.js', + plugins: [ + nodeResolve({ + main: true, + browser: ['not-a-module'] + }) + ] + }).then( executeBundle ).then( module => { + assert.equal( module.exports, 'node' ); + }); + }); + + it( 'allows use of the browser field for module in browser array', function () { + return rollup.rollup({ + input: 'samples/browser/main.js', + plugins: [ + nodeResolve({ + main: true, + browser: ['isomorphic'] + }) + ] + }).then( executeBundle ).then( module => { + assert.equal( module.exports, 'browser' ); + }); + }); + it( 'disregards object browser field by default', function () { return rollup.rollup({ input: 'samples/browser-object/main.js',