Skip to content

Commit 8298568

Browse files
Jarreddebeerguybedford
authored andcommitted
feat(node-resolve): Follow up to #843, refining exports and browser field interaction (#866)
1 parent fba0a6b commit 8298568

File tree

13 files changed

+56
-3
lines changed

13 files changed

+56
-3
lines changed

packages/node-resolve/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Setting this option will add extra conditions on top of the default conditions.
6464
Type: `Boolean`<br>
6565
Default: `false`
6666

67-
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`.
67+
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`.
6868

6969
> This option does not work when a package is using [package entrypoints](https://nodejs.org/api/packages.html#packages_package_entry_points)
7070

packages/node-resolve/src/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ export function nodeResolve(opts = {}) {
161161
opts && opts.custom && opts.custom['node-resolve'] && opts.custom['node-resolve'].isRequire;
162162
const exportConditions = isRequire ? conditionsCjs : conditionsEsm;
163163

164+
if (useBrowserOverrides && !exportConditions.includes('browser'))
165+
exportConditions.push('browser');
166+
164167
const resolvedWithoutBuiltins = await resolveImportSpecifiers({
165168
importer,
166169
importSpecifierList,

packages/node-resolve/src/package/resolvePackageTarget.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ async function resolvePackageTarget(context, { target, subpath, pattern, interna
2424
target.replace(/\*/g, subpath),
2525
context.pkgURL.href
2626
);
27-
return result ? pathToFileURL(result.location) : null;
27+
return result ? pathToFileURL(result.location).href : null;
2828
}
2929

3030
const result = await context.resolveId(`${target}${subpath}`, context.pkgURL.href);
31-
return result ? pathToFileURL(result.location) : null;
31+
return result ? pathToFileURL(result.location).href : null;
3232
}
3333
throw new InvalidPackageTargetError(context, `Invalid mapping: "${target}".`);
3434
}

packages/node-resolve/test/browser.js

+20
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,23 @@ test('pkg.browser with mapping to prevent bundle by specifying a value of false'
199199

200200
t.is(module.exports, 'ok');
201201
});
202+
203+
test('exports.browser can be mapped via pkg.browser', async (t) => {
204+
const bundle = await rollup({
205+
input: 'browser-exports-browser-browser.js',
206+
plugins: [nodeResolve({ browser: true }), commonjs()]
207+
});
208+
const { module } = await testBundle(t, bundle);
209+
210+
t.is(module.exports, 'browser');
211+
});
212+
213+
test('browser field does not take precedence over export map result', async (t) => {
214+
const bundle = await rollup({
215+
input: 'browser-exports-browser.js',
216+
plugins: [nodeResolve({ browser: true }), commonjs()]
217+
});
218+
const { module } = await testBundle(t, bundle);
219+
220+
t.is(module.exports, 'require');
221+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import b from 'exports-browser-browser';
2+
3+
module.exports = b;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const b = require('exports-browser');
2+
3+
module.exports = b;

packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/browser.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/index.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/package.json

+13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/node-resolve/test/fixtures/node_modules/exports-browser-browser/require.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/node-resolve/test/fixtures/node_modules/exports-browser/ignored-browser.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/node-resolve/test/fixtures/node_modules/exports-browser/package.json

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/node-resolve/test/fixtures/node_modules/exports-browser/require.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)