From 3a23e0d1d903e115d7de98db1437f950c3684a10 Mon Sep 17 00:00:00 2001 From: Brian Terlson Date: Wed, 12 Jun 2019 11:51:51 -0700 Subject: [PATCH] Support resolve 1.11.1, add built-in test --- src/index.js | 25 ++++++++++++++++++++++--- test/test.js | 22 ++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index df29c44..bb3d9c6 100644 --- a/src/index.js +++ b/src/index.js @@ -234,10 +234,29 @@ export default function nodeResolve ( options = {} ) { resolveOptions.preserveSymlinks = preserveSymlinks; } + const importeeIsBuiltin = builtins.has(importee); + const forceLocalLookup = importeeIsBuiltin && (!preferBuiltins || !isPreferBuiltinsSet); + let importSpecifier = importee; + + if (forceLocalLookup) { + // need to attempt to look up a local module + importSpecifier += '/'; + } + return resolveIdAsync( - importee, + importSpecifier, Object.assign( resolveOptions, customResolveOptions ) ) + .catch(err => { + if (forceLocalLookup && err.code === 'MODULE_NOT_FOUND') { + // didn't find a local module, so fall back to the importee + // (i.e. the builtin's name) + return importee; + } + + // some other error, just forward it + throw err; + }) .then(resolved => { if ( resolved && packageBrowserField ) { if ( packageBrowserField.hasOwnProperty(resolved) ) { @@ -255,9 +274,9 @@ export default function nodeResolve ( options = {} ) { resolved = fs.realpathSync( resolved ); } - if ( builtins.has( resolved ) ) { + if (builtins.has(resolved) && preferBuiltins && isPreferBuiltinsSet) { return null; - } else if ( builtins.has( importee ) && preferBuiltins ) { + } else if (importeeIsBuiltin && preferBuiltins) { if ( !isPreferBuiltinsSet ) { this.warn( `preferring built-in module '${importee}' over local alternative ` + diff --git a/test/test.js b/test/test.js index e647450..d0b52f6 100644 --- a/test/test.js +++ b/test/test.js @@ -29,11 +29,11 @@ function executeBundle ( bundle ) { return bundle.generate({ format: 'cjs' }).then( generated => { - const fn = new Function ( 'module', 'exports', 'assert', generated.output[0].code ); + const fn = new Function ( 'module', 'exports', 'assert', 'require', generated.output[0].code ); const module = { exports: {} }; try { - fn(module, module.exports, assert); + fn(module, module.exports, assert, require); } catch (error) { // eslint-disable-next-line no-console console.log(generated.output[0].code); @@ -337,6 +337,24 @@ describe( 'rollup-plugin-node-resolve', function () { }); }); + it( 'warns when importing builtins', function () { + return rollup.rollup({ + input: 'samples/builtins/main.js', + onwarn: expectWarnings([{ + code: 'UNRESOLVED_IMPORT', + source: 'path' + }]), + plugins: [ + nodeResolve({ + mainFields: ['browser', 'main'], + preferBuiltins: true + }) + ] + }).then(executeBundle).then(module => { + assert.equal(module.exports, require('path').sep); + }); + }); + it( 'allows use of object browser field, resolving nested directories', function () { return rollup.rollup({ input: 'samples/browser-object-nested/main.js',