rollup-plugin-node-resolve.es.js 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { dirname, normalize, resolve, sep } from 'path';
  2. import builtins from 'builtin-modules';
  3. import _nodeResolve from 'resolve';
  4. import browserResolve from 'browser-resolve';
  5. import isModule from 'is-module';
  6. import fs from 'fs';
  7. var COMMONJS_BROWSER_EMPTY = _nodeResolve.sync( 'browser-resolve/empty.js', __dirname );
  8. var ES6_BROWSER_EMPTY = resolve( __dirname, '../src/empty.js' );
  9. var CONSOLE_WARN = function () {
  10. var args = [], len = arguments.length;
  11. while ( len-- ) args[ len ] = arguments[ len ];
  12. return console.warn.apply( console, args );
  13. }; // eslint-disable-line no-console
  14. function nodeResolve ( options ) {
  15. if ( options === void 0 ) options = {};
  16. var useModule = options.module !== false;
  17. var useMain = options.main !== false;
  18. var useJsnext = options.jsnext === true;
  19. var isPreferBuiltinsSet = options.preferBuiltins === true || options.preferBuiltins === false;
  20. var preferBuiltins = isPreferBuiltinsSet ? options.preferBuiltins : true;
  21. var customResolveOptions = options.customResolveOptions || {};
  22. var jail = options.jail;
  23. var onwarn = options.onwarn || CONSOLE_WARN;
  24. var resolveId = options.browser ? browserResolve : _nodeResolve;
  25. if ( options.skip ) {
  26. throw new Error( 'options.skip is no longer supported — you should use the main Rollup `externals` option instead' );
  27. }
  28. if ( !useModule && !useMain && !useJsnext ) {
  29. throw new Error( "At least one of options.module, options.main or options.jsnext must be true" );
  30. }
  31. return {
  32. name: 'node-resolve',
  33. resolveId: function resolveId$1 ( importee, importer ) {
  34. if ( /\0/.test( importee ) ) { return null; } // ignore IDs with null character, these belong to other plugins
  35. // disregard entry module
  36. if ( !importer ) { return null; }
  37. var parts = importee.split( /[\/\\]/ );
  38. var id = parts.shift();
  39. if ( id[0] === '@' && parts.length ) {
  40. // scoped packages
  41. id += "/" + (parts.shift());
  42. } else if ( id[0] === '.' ) {
  43. // an import relative to the parent dir of the importer
  44. id = resolve( importer, '..', importee );
  45. }
  46. return new Promise( function ( fulfil, reject ) {
  47. var disregardResult = false;
  48. resolveId(
  49. importee,
  50. Object.assign({
  51. basedir: dirname( importer ),
  52. packageFilter: function packageFilter ( pkg ) {
  53. if ( useModule && pkg[ 'module' ] ) {
  54. pkg[ 'main' ] = pkg[ 'module' ];
  55. } else if ( useJsnext && pkg[ 'jsnext:main' ] ) {
  56. pkg[ 'main' ] = pkg[ 'jsnext:main' ];
  57. } else if ( ( useJsnext || useModule ) && !useMain ) {
  58. disregardResult = true;
  59. }
  60. return pkg;
  61. },
  62. extensions: options.extensions
  63. }, customResolveOptions ),
  64. function ( err, resolved ) {
  65. if ( !disregardResult && !err ) {
  66. if ( resolved && fs.existsSync( resolved ) ) {
  67. resolved = fs.realpathSync( resolved );
  68. }
  69. if ( resolved === COMMONJS_BROWSER_EMPTY ) {
  70. fulfil( ES6_BROWSER_EMPTY );
  71. } else if ( ~builtins.indexOf( resolved ) ) {
  72. fulfil( null );
  73. } else if ( ~builtins.indexOf( importee ) && preferBuiltins ) {
  74. if ( !isPreferBuiltinsSet ) {
  75. onwarn(
  76. "preferring built-in module '" + importee + "' over local alternative " +
  77. "at '" + resolved + "', pass 'preferBuiltins: false' to disable this " +
  78. "behavior or 'preferBuiltins: true' to disable this warning"
  79. );
  80. }
  81. fulfil( null );
  82. } else if ( jail && resolved.indexOf( normalize( jail.trim( sep ) ) ) !== 0 ) {
  83. fulfil( null );
  84. }
  85. }
  86. if ( resolved && options.modulesOnly ) {
  87. fs.readFile( resolved, 'utf-8', function ( err, code ) {
  88. if ( err ) {
  89. reject( err );
  90. } else {
  91. var valid = isModule( code );
  92. fulfil( valid ? resolved : null );
  93. }
  94. });
  95. } else {
  96. fulfil( resolved );
  97. }
  98. }
  99. );
  100. });
  101. }
  102. };
  103. }
  104. export default nodeResolve;