diff --git a/src/index.js b/src/index.js index 3a1972e..fae5815 100644 --- a/src/index.js +++ b/src/index.js @@ -24,7 +24,7 @@ export default function npm ( options ) { id += `/${parts.shift()}`; } - if ( ~skip.indexOf(id) ) return null; + if ( skip !== true && ~skip.indexOf( id ) ) return null; // disregard entry module if ( !importer ) return null; @@ -35,23 +35,25 @@ export default function npm ( options ) { { basedir: dirname( importer ), packageFilter ( pkg ) { - const id = pkg[ 'name' ]; if ( options.jsnext ) { const main = pkg[ 'jsnext:main' ]; if ( main ) { pkg[ 'main' ] = main; } else if ( !useMain ) { - reject( Error( `Package ${id} (imported by ${importer}) does not have a jsnext:main field. You should either allow legacy modules with options.main, or skip it with options.skip = ['${id}'])` ) ); + if ( skip === true ) accept( false ); + else reject( Error( `Package ${importee} (imported by ${importer}) does not have a jsnext:main field. You should either allow legacy modules with options.main, or skip it with options.skip = ['${importee}'])` ) ); } } else if ( !useMain ) { - reject( Error( `To import from a package in node_modules (${id}), either options.jsnext or options.main must be true` ) ); + if ( skip === true ) accept( false ); + else reject( Error( `To import from a package in node_modules (${importee}), either options.jsnext or options.main must be true` ) ); } return pkg; } }, ( err, resolved ) => { if ( err ) { - reject( err ); + if ( skip === true ) accept( false ); + else reject( err ); } else { if ( resolved === COMMONJS_BROWSER_EMPTY ) resolved = ES6_BROWSER_EMPTY; if ( ~builtins.indexOf( resolved ) ) resolved = null; diff --git a/test/node_modules/jsnext/entry.js b/test/node_modules/jsnext/entry.js new file mode 100644 index 0000000..b8e8806 --- /dev/null +++ b/test/node_modules/jsnext/entry.js @@ -0,0 +1 @@ +export default 'JSNEXT'; diff --git a/test/node_modules/jsnext/package.json b/test/node_modules/jsnext/package.json new file mode 100644 index 0000000..ce8c9fe --- /dev/null +++ b/test/node_modules/jsnext/package.json @@ -0,0 +1,3 @@ +{ + "jsnext:main": "entry.js" +} diff --git a/test/node_modules/legacy/entry.js b/test/node_modules/legacy/entry.js new file mode 100644 index 0000000..67ad7f6 --- /dev/null +++ b/test/node_modules/legacy/entry.js @@ -0,0 +1 @@ +export default 'LEGACY'; diff --git a/test/node_modules/legacy/package.json b/test/node_modules/legacy/package.json new file mode 100644 index 0000000..6cde76d --- /dev/null +++ b/test/node_modules/legacy/package.json @@ -0,0 +1,3 @@ +{ + "main": "entry.js" +} diff --git a/test/samples/skip-true/main.js b/test/samples/skip-true/main.js new file mode 100644 index 0000000..69e6a2b --- /dev/null +++ b/test/samples/skip-true/main.js @@ -0,0 +1,7 @@ +import jsnext from 'jsnext'; +import legacy from 'legacy'; +import missing from 'missing'; + +console.log( jsnext ); +console.log( legacy ); +console.log( missing ); diff --git a/test/test.js b/test/test.js index 88a9776..a188680 100644 --- a/test/test.js +++ b/test/test.js @@ -210,4 +210,34 @@ describe( 'rollup-plugin-npm', function () { assert.deepEqual( bundle.imports, [ '@scoped/foo' ]); }); }); + + it( 'skip: true allows all unfound non-jsnext:main dependencies to be skipped without error', () => { + return rollup.rollup({ + entry: 'samples/skip-true/main.js', + plugins: [ + npm({ + jsnext: true, + main: false, + skip: true + }) + ] + }).then( bundle => { + assert.deepEqual( bundle.imports, [ 'legacy', 'missing' ]); + }); + }); + + it( 'skip: true allows all unfound dependencies to be skipped without error', () => { + return rollup.rollup({ + entry: 'samples/skip-true/main.js', + plugins: [ + npm({ + jsnext: false, + main: false, + skip: true + }) + ] + }).then( bundle => { + assert.deepEqual( bundle.imports, [ 'jsnext', 'legacy', 'missing' ]); + }); + }); });