diff --git a/index.d.ts b/index.d.ts index 125d0c4..2be1fea 100644 --- a/index.d.ts +++ b/index.d.ts @@ -85,7 +85,7 @@ export interface Options { * to prevent bundling the same package multiple times if package is * imported from dependencies. */ - dedupe?: string[]; + dedupe?: string[] | ((importee: string) => boolean); /** * Any additional options that should be passed through diff --git a/src/index.js b/src/index.js index d2f75b5..9e6fb5a 100644 --- a/src/index.js +++ b/src/index.js @@ -100,6 +100,10 @@ export default function nodeResolve ( options = {} ) { const extensions = options.extensions || DEFAULT_EXTS; const packageInfoCache = new Map(); + const shouldDedupe = typeof dedupe === 'function' + ? dedupe + : importee => dedupe.includes(importee); + function getCachedPackageInfo (pkg, pkgPath) { if (packageInfoCache.has(pkgPath)) { return packageInfoCache.get(pkgPath); @@ -187,7 +191,7 @@ export default function nodeResolve ( options = {} ) { const basedir = importer ? dirname( importer ) : process.cwd(); - if (dedupe.indexOf(importee) !== -1) { + if (shouldDedupe(importee)) { importee = join(process.cwd(), 'node_modules', importee); } diff --git a/test/test.js b/test/test.js index d0b52f6..0a25341 100644 --- a/test/test.js +++ b/test/test.js @@ -866,6 +866,22 @@ describe( 'rollup-plugin-node-resolve', function () { }); }); + it( 'single module version is bundle if dedupe is set as a function', () => { + return rollup.rollup({ + input: 'samples/react-app/main.js', + plugins: [ + nodeResolve({ + dedupe: (dep) => dep === 'react' + }) + ] + }).then( executeBundle ).then( module => { + assert.deepEqual(module.exports, { + React: 'react:root', + ReactConsumer: 'react-consumer:react:root' + }); + }); + }); + it( 'multiple module versions are bundled if dedupe is not set', () => { return rollup.rollup({ input: 'samples/react-app/main.js',