|
'use strict'; |
|
|
|
function _interopDefault(ex) { |
|
return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex; |
|
} |
|
|
|
var path = require('path'); |
|
var builtins = _interopDefault(require('builtin-modules')); |
|
var resolveId = _interopDefault(require('resolve')); |
|
var isModule = _interopDefault(require('is-module')); |
|
var fs = _interopDefault(require('fs')); |
|
|
|
var ES6_BROWSER_EMPTY = path.resolve(__dirname, '../src/empty.js'); |
|
var CONSOLE_WARN = function() { |
|
var args = [], |
|
len = arguments.length; |
|
while (len--) args[len] = arguments[len]; |
|
|
|
return console.warn.apply(console, args); |
|
}; // eslint-disable-line no-console |
|
// It is important that .mjs occur before .js so that Rollup will interpret npm modules |
|
// which deploy both ESM .mjs and CommonJS .js files as ESM. |
|
var DEFAULT_EXTS = ['.mjs', '.js', '.json', '.node']; |
|
|
|
var readFileCache = {}; |
|
var readFileAsync = function(file) { |
|
return new Promise(function(fulfil, reject) { |
|
return fs.readFile(file, function(err, contents) { |
|
return err ? reject(err) : fulfil(contents); |
|
}); |
|
}); |
|
}; |
|
var statAsync = function(file) { |
|
return new Promise(function(fulfil, reject) { |
|
return fs.stat(file, function(err, contents) { |
|
return err ? reject(err) : fulfil(contents); |
|
}); |
|
}); |
|
}; |
|
function cachedReadFile(file, cb) { |
|
if (file in readFileCache === false) { |
|
readFileCache[file] = readFileAsync(file).catch(function(err) { |
|
delete readFileCache[file]; |
|
throw err; |
|
}); |
|
} |
|
readFileCache[file].then(function(contents) { |
|
return cb(null, contents); |
|
}, cb); |
|
} |
|
|
|
var isFileCache = {}; |
|
function cachedIsFile(file, cb) { |
|
if (file in isFileCache === false) { |
|
isFileCache[file] = statAsync(file).then( |
|
function(stat) { |
|
return stat.isFile(); |
|
}, |
|
function(err) { |
|
if (err.code == 'ENOENT') { |
|
return false; |
|
} |
|
delete isFileCache[file]; |
|
throw err; |
|
} |
|
); |
|
} |
|
isFileCache[file].then(function(contents) { |
|
return cb(null, contents); |
|
}, cb); |
|
} |
|
|
|
var resolveIdAsync = function(file, opts) { |
|
return new Promise(function(fulfil, reject) { |
|
return resolveId(file, opts, function(err, contents) { |
|
return err ? reject(err) : fulfil(contents); |
|
}); |
|
}); |
|
}; |
|
|
|
function nodeResolve(options) { |
|
if (options === void 0) options = {}; |
|
|
|
console.log(options); |
|
|
|
var useEsnext = options.esnext !== false; |
|
var useModule = options.module !== false; |
|
var useMain = options.main !== false; |
|
var useJsnext = options.jsnext === true; |
|
var isPreferBuiltinsSet = |
|
options.preferBuiltins === true || options.preferBuiltins === false; |
|
var preferBuiltins = isPreferBuiltinsSet ? options.preferBuiltins : true; |
|
var customResolveOptions = options.customResolveOptions || {}; |
|
var jail = options.jail; |
|
var only = Array.isArray(options.only) |
|
? options.only.map(function(o) { |
|
return o instanceof RegExp |
|
? o |
|
: new RegExp( |
|
'^' + String(o).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&') + '$' |
|
); |
|
}) |
|
: null; |
|
var browserMapCache = {}; |
|
|
|
var onwarn = options.onwarn || CONSOLE_WARN; |
|
|
|
console.log({ useModule, useMain, useJsnext, preferBuiltins, jail, only }); |
|
|
|
if (options.skip) { |
|
throw new Error( |
|
'options.skip is no longer supported — you should use the main Rollup `external` option instead' |
|
); |
|
} |
|
|
|
if (!useModule && !useMain && !useJsnext) { |
|
throw new Error( |
|
'At least one of options.module, options.main or options.jsnext must be true' |
|
); |
|
} |
|
|
|
var preserveSymlinks; |
|
|
|
return { |
|
name: 'node-resolve', |
|
|
|
options: function options(options$1) { |
|
preserveSymlinks = options$1.preserveSymlinks; |
|
}, |
|
|
|
onwrite: function onwrite() { |
|
isFileCache = {}; |
|
readFileCache = {}; |
|
}, |
|
|
|
resolveId: function resolveId$$1(importee, importer) { |
|
if (/\0/.test(importee)) { |
|
return null; |
|
} // ignore IDs with null character, these belong to other plugins |
|
|
|
// disregard entry module |
|
if (!importer) { |
|
return null; |
|
} |
|
|
|
if (options.browser && browserMapCache[importer]) { |
|
var resolvedImportee = path.resolve(path.dirname(importer), importee); |
|
var browser = browserMapCache[importer]; |
|
if ( |
|
browser[importee] === false || |
|
browser[resolvedImportee] === false |
|
) { |
|
return ES6_BROWSER_EMPTY; |
|
} |
|
if ( |
|
browser[importee] || |
|
browser[resolvedImportee] || |
|
browser[resolvedImportee + '.js'] || |
|
browser[resolvedImportee + '.json'] |
|
) { |
|
importee = |
|
browser[importee] || |
|
browser[resolvedImportee] || |
|
browser[resolvedImportee + '.js'] || |
|
browser[resolvedImportee + '.json']; |
|
} |
|
} |
|
|
|
var parts = importee.split(/[/\\]/); |
|
var id = parts.shift(); |
|
|
|
if (id[0] === '@' && parts.length) { |
|
// scoped packages |
|
id += '/' + parts.shift(); |
|
} else if (id[0] === '.') { |
|
// an import relative to the parent dir of the importer |
|
id = path.resolve(importer, '..', importee); |
|
} |
|
|
|
if ( |
|
only && |
|
!only.some(function(pattern) { |
|
return pattern.test(id); |
|
}) |
|
) { |
|
return null; |
|
} |
|
|
|
var disregardResult = false; |
|
var packageBrowserField = false; |
|
var extensions = options.extensions || DEFAULT_EXTS; |
|
|
|
var resolveOptions = { |
|
basedir: path.dirname(importer), |
|
packageFilter: function packageFilter(pkg, pkgPath) { |
|
var pkgRoot = path.dirname(pkgPath); |
|
if (options.browser && typeof pkg['browser'] === 'object') { |
|
console.log({ browser: options.browser }); |
|
packageBrowserField = Object.keys(pkg['browser']).reduce(function( |
|
browser, |
|
key |
|
) { |
|
var resolved = |
|
pkg['browser'][key] === false |
|
? false |
|
: path.resolve(pkgRoot, pkg['browser'][key]); |
|
browser[key] = resolved; |
|
if (key[0] === '.') { |
|
var absoluteKey = path.resolve(pkgRoot, key); |
|
browser[absoluteKey] = resolved; |
|
if (!path.extname(key)) { |
|
extensions.reduce(function(browser, ext) { |
|
browser[absoluteKey + ext] = browser[key]; |
|
return browser; |
|
}, browser); |
|
} |
|
} |
|
return browser; |
|
}, |
|
{}); |
|
} |
|
|
|
if (options.browser && typeof pkg['browser'] === 'string') { |
|
console.log('using browser for', pkg.name); |
|
pkg['main'] = pkg['browser']; |
|
} else if (useEsnext && pkg['esnext']) { |
|
console.log('using esnext for', pkg.name); |
|
pkg['main'] = pkg['esnext']; |
|
} else if (useModule && pkg['module']) { |
|
console.log('using module for', pkg.name); |
|
pkg['main'] = pkg['module']; |
|
} else if (useJsnext && pkg['jsnext:main']) { |
|
console.log('using jsnext for', pkg.name); |
|
pkg['main'] = pkg['jsnext:main']; |
|
} else if ((useJsnext || useModule) && !useMain) { |
|
console.log('disregardResult for', pkg.name); |
|
disregardResult = true; |
|
} else { |
|
console.log('using main for', pkg.name, '?'); |
|
} |
|
return pkg; |
|
}, |
|
readFile: cachedReadFile, |
|
isFile: cachedIsFile, |
|
extensions: extensions |
|
}; |
|
|
|
if (preserveSymlinks !== undefined) { |
|
resolveOptions.preserveSymlinks = preserveSymlinks; |
|
} |
|
|
|
return resolveIdAsync( |
|
importee, |
|
Object.assign(resolveOptions, customResolveOptions) |
|
) |
|
.catch(function() { |
|
return false; |
|
}) |
|
.then(function(resolved) { |
|
if (options.browser && packageBrowserField) { |
|
if (packageBrowserField[resolved]) { |
|
resolved = packageBrowserField[resolved]; |
|
} |
|
browserMapCache[resolved] = packageBrowserField; |
|
} |
|
|
|
if (!disregardResult && resolved !== false) { |
|
if (!preserveSymlinks && resolved && fs.existsSync(resolved)) { |
|
resolved = fs.realpathSync(resolved); |
|
} |
|
|
|
if (~builtins.indexOf(resolved)) { |
|
return null; |
|
} else if (~builtins.indexOf(importee) && preferBuiltins) { |
|
if (!isPreferBuiltinsSet) { |
|
onwarn( |
|
"preferring built-in module '" + |
|
importee + |
|
"' over local alternative " + |
|
"at '" + |
|
resolved + |
|
"', pass 'preferBuiltins: false' to disable this " + |
|
"behavior or 'preferBuiltins: true' to disable this warning" |
|
); |
|
} |
|
return null; |
|
} else if ( |
|
jail && |
|
resolved.indexOf(path.normalize(jail.trim(path.sep))) !== 0 |
|
) { |
|
return null; |
|
} |
|
} |
|
|
|
if (resolved && options.modulesOnly) { |
|
return readFileAsync(resolved, 'utf-8').then(function(code) { |
|
return isModule(code) ? resolved : null; |
|
}); |
|
} else { |
|
return resolved === false ? null : resolved; |
|
} |
|
}); |
|
} |
|
}; |
|
} |
|
|
|
module.exports = nodeResolve; |