From 0fe2e34f5be14c9948d6fb4db478d47eb1800825 Mon Sep 17 00:00:00 2001 From: Jarreddebeer Date: Fri, 30 Apr 2021 15:52:11 +0200 Subject: [PATCH] feat(node-resolve): Follow up to #843, refining exports and browser field interaction (#866) --- packages/node-resolve/README.md | 2 +- packages/node-resolve/src/index.js | 3 +++ .../src/package/resolvePackageTarget.js | 4 ++-- packages/node-resolve/test/browser.js | 20 +++++++++++++++++++ .../browser-exports-browser-browser.js | 3 +++ .../test/fixtures/browser-exports-browser.js | 3 +++ .../exports-browser-browser/browser.js | 1 + .../exports-browser-browser/index.js | 1 + .../exports-browser-browser/package.json | 13 ++++++++++++ .../exports-browser-browser/require.js | 1 + .../exports-browser/ignored-browser.js | 1 + .../node_modules/exports-browser/package.json | 6 ++++++ .../node_modules/exports-browser/require.js | 1 + 13 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 packages/node-resolve/test/fixtures/browser-exports-browser-browser.js create mode 100644 packages/node-resolve/test/fixtures/browser-exports-browser.js create mode 100644 packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/browser.js create mode 100644 packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/index.js create mode 100644 packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/package.json create mode 100644 packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/require.js create mode 100644 packages/node-resolve/test/fixtures/node_modules/exports-browser/ignored-browser.js create mode 100644 packages/node-resolve/test/fixtures/node_modules/exports-browser/package.json create mode 100644 packages/node-resolve/test/fixtures/node_modules/exports-browser/require.js diff --git a/packages/node-resolve/README.md b/packages/node-resolve/README.md index 5993f3089..3022bcc24 100755 --- a/packages/node-resolve/README.md +++ b/packages/node-resolve/README.md @@ -64,7 +64,7 @@ Setting this option will add extra conditions on top of the default conditions. Type: `Boolean`
Default: `false` -If `true`, instructs the plugin to use the `"browser"` property in `package.json` files to specify alternative files to load for bundling. This is useful when bundling for a browser environment. Alternatively, a value of `'browser'` can be added to the `mainFields` option. If `false`, any `"browser"` properties in package files will be ignored. This option takes precedence over `mainFields`. +If `true`, instructs the plugin to use the browser module resolutions in `package.json` and adds `'browser'` to `exportConditions` if it is not present so browser conditionals in `exports` are applied. If `false`, any browser properties in package files will be ignored. Alternatively, a value of `'browser'` can be added to both the `mainFields` and `exportConditions` options, however this option takes precedence over `mainFields`. > This option does not work when a package is using [package entrypoints](https://nodejs.org/api/packages.html#packages_package_entry_points) diff --git a/packages/node-resolve/src/index.js b/packages/node-resolve/src/index.js index 5b342ca5f..fdb0b6c7f 100644 --- a/packages/node-resolve/src/index.js +++ b/packages/node-resolve/src/index.js @@ -161,6 +161,9 @@ export function nodeResolve(opts = {}) { opts && opts.custom && opts.custom['node-resolve'] && opts.custom['node-resolve'].isRequire; const exportConditions = isRequire ? conditionsCjs : conditionsEsm; + if (useBrowserOverrides && !exportConditions.includes('browser')) + exportConditions.push('browser'); + const resolvedWithoutBuiltins = await resolveImportSpecifiers({ importer, importSpecifierList, diff --git a/packages/node-resolve/src/package/resolvePackageTarget.js b/packages/node-resolve/src/package/resolvePackageTarget.js index 47ead33d5..4deee1a8f 100644 --- a/packages/node-resolve/src/package/resolvePackageTarget.js +++ b/packages/node-resolve/src/package/resolvePackageTarget.js @@ -24,11 +24,11 @@ async function resolvePackageTarget(context, { target, subpath, pattern, interna target.replace(/\*/g, subpath), context.pkgURL.href ); - return result ? pathToFileURL(result.location) : null; + return result ? pathToFileURL(result.location).href : null; } const result = await context.resolveId(`${target}${subpath}`, context.pkgURL.href); - return result ? pathToFileURL(result.location) : null; + return result ? pathToFileURL(result.location).href : null; } throw new InvalidPackageTargetError(context, `Invalid mapping: "${target}".`); } diff --git a/packages/node-resolve/test/browser.js b/packages/node-resolve/test/browser.js index 69a63dfe7..67897ce99 100644 --- a/packages/node-resolve/test/browser.js +++ b/packages/node-resolve/test/browser.js @@ -199,3 +199,23 @@ test('pkg.browser with mapping to prevent bundle by specifying a value of false' t.is(module.exports, 'ok'); }); + +test('exports.browser can be mapped via pkg.browser', async (t) => { + const bundle = await rollup({ + input: 'browser-exports-browser-browser.js', + plugins: [nodeResolve({ browser: true }), commonjs()] + }); + const { module } = await testBundle(t, bundle); + + t.is(module.exports, 'browser'); +}); + +test('browser field does not take precedence over export map result', async (t) => { + const bundle = await rollup({ + input: 'browser-exports-browser.js', + plugins: [nodeResolve({ browser: true }), commonjs()] + }); + const { module } = await testBundle(t, bundle); + + t.is(module.exports, 'require'); +}); diff --git a/packages/node-resolve/test/fixtures/browser-exports-browser-browser.js b/packages/node-resolve/test/fixtures/browser-exports-browser-browser.js new file mode 100644 index 000000000..3a8ff1d92 --- /dev/null +++ b/packages/node-resolve/test/fixtures/browser-exports-browser-browser.js @@ -0,0 +1,3 @@ +import b from 'exports-browser-browser'; + +module.exports = b; diff --git a/packages/node-resolve/test/fixtures/browser-exports-browser.js b/packages/node-resolve/test/fixtures/browser-exports-browser.js new file mode 100644 index 000000000..259175621 --- /dev/null +++ b/packages/node-resolve/test/fixtures/browser-exports-browser.js @@ -0,0 +1,3 @@ +const b = require('exports-browser'); + +module.exports = b; diff --git a/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/browser.js b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/browser.js new file mode 100644 index 000000000..e36fe2f1b --- /dev/null +++ b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/browser.js @@ -0,0 +1 @@ +module.exports = 'browser'; \ No newline at end of file diff --git a/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/index.js b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/index.js new file mode 100644 index 000000000..cde7d6391 --- /dev/null +++ b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/index.js @@ -0,0 +1 @@ +module.exports = "index"; \ No newline at end of file diff --git a/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/package.json b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/package.json new file mode 100644 index 000000000..d079dff29 --- /dev/null +++ b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/package.json @@ -0,0 +1,13 @@ +{ + "main": "index.cjs", + "module": "index.js", + "browser": { + "./index.js": "./browser.js" + }, + "exports": { + ".": { + "browser": "./index.js", + "require": "./require.js" + } + } +} \ No newline at end of file diff --git a/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/require.js b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/require.js new file mode 100644 index 000000000..b7275c575 --- /dev/null +++ b/packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/require.js @@ -0,0 +1 @@ +module.exports = 'require'; \ No newline at end of file diff --git a/packages/node-resolve/test/fixtures/node_modules/exports-browser/ignored-browser.js b/packages/node-resolve/test/fixtures/node_modules/exports-browser/ignored-browser.js new file mode 100644 index 000000000..62f993f21 --- /dev/null +++ b/packages/node-resolve/test/fixtures/node_modules/exports-browser/ignored-browser.js @@ -0,0 +1 @@ +module.exports = 'ignored-browser'; \ No newline at end of file diff --git a/packages/node-resolve/test/fixtures/node_modules/exports-browser/package.json b/packages/node-resolve/test/fixtures/node_modules/exports-browser/package.json new file mode 100644 index 000000000..057166d32 --- /dev/null +++ b/packages/node-resolve/test/fixtures/node_modules/exports-browser/package.json @@ -0,0 +1,6 @@ +{ + "main": "index.cjs", + "module": "index.js", + "browser": "./ignored-browser.js", + "exports": "./require.js" +} \ No newline at end of file diff --git a/packages/node-resolve/test/fixtures/node_modules/exports-browser/require.js b/packages/node-resolve/test/fixtures/node_modules/exports-browser/require.js new file mode 100644 index 000000000..b7275c575 --- /dev/null +++ b/packages/node-resolve/test/fixtures/node_modules/exports-browser/require.js @@ -0,0 +1 @@ +module.exports = 'require'; \ No newline at end of file