Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(node-resolve): dedupe by package name #99

Merged
merged 11 commits into from
Jan 6, 2020
12 changes: 11 additions & 1 deletion packages/node-resolve/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,14 @@ function resolveImportSpecifiers(importSpecifierList, resolveOptions) {
return p;
}

function getPackageName(id) {
const split = id.split('/');
if (split[0][0] === '@') {
return `${split[0]}/${split[1]}`;
LarsDenBakker marked this conversation as resolved.
Show resolved Hide resolved
}
return split[0];
}

export default function nodeResolve(options = {}) {
const mainFields = getMainFields(options);
const useBrowserOverrides = mainFields.indexOf('browser') !== -1;
Expand Down Expand Up @@ -165,7 +173,9 @@ export default function nodeResolve(options = {}) {
const idToPackageInfo = new Map();

const shouldDedupe =
typeof dedupe === 'function' ? dedupe : (importee) => dedupe.includes(importee);
typeof dedupe === 'function'
? dedupe
: (importee) => dedupe.includes(importee) || dedupe.includes(getPackageName(importee));

function getCachedPackageInfo(pkg, pkgPath) {
if (packageInfoCache.has(pkgPath)) {
Expand Down
28 changes: 28 additions & 0 deletions packages/node-resolve/test/dedupe.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,34 @@ test('single module version is bundled if dedupe is set', async (t) => {
t.snapshot(module.exports);
});

test('dedupes deep imports by package name if dedupe is set', async (t) => {
const bundle = await rollup({
input: 'react-app-deep-import.js',
plugins: [
nodeResolve({
dedupe: ['react']
})
]
});
const { module } = await testBundle(t, bundle);

t.snapshot(module.exports);
});

test('dedupes scoped deep imports by package name if dedupe is set', async (t) => {
const bundle = await rollup({
input: 'scoped-deep-import.js',
plugins: [
nodeResolve({
dedupe: ['@scoped/deduped']
})
]
});
const { module } = await testBundle(t, bundle);

t.snapshot(module.exports);
});

test('single module version is bundled if dedupe is set as a function', async (t) => {
const bundle = await rollup({
input: 'react-app.js',
Expand Down

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.

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.

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.

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import React from 'react/deep.js';
import ReactConsumer from 'react-consumer/deep.js';

export { React, ReactConsumer };
4 changes: 4 additions & 0 deletions packages/node-resolve/test/fixtures/scoped-deep-import.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import ScopedDeduped from '@scoped/deduped/deep.js';
import ScopedDedupedConsumer from 'scoped-deduped-consumer';

export { ScopedDeduped, ScopedDedupedConsumer };
18 changes: 18 additions & 0 deletions packages/node-resolve/test/snapshots/dedupe.js.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,24 @@ The actual snapshot is saved in `dedupe.js.snap`.

Generated by [AVA](https://ava.li).

## dedupes deep imports by package name if dedupe is set

> Snapshot 1

{
React: 'react/deep.js:root',
ReactConsumer: 'react-consumer:react/deep.js:root',
}

## dedupes scoped deep imports by package name if dedupe is set

> Snapshot 1

{
ScopedDeduped: 'scoped-deduped:root',
ScopedDedupedConsumer: 'scoped-deduped-consumer:scoped-deduped:root',
}

## multiple module versions are bundled if dedupe is not set

> Snapshot 1
Expand Down
Binary file modified packages/node-resolve/test/snapshots/dedupe.js.snap
Binary file not shown.