forked from daren.hsu/line_push
51 lines
1.9 KiB
JavaScript
51 lines
1.9 KiB
JavaScript
var utils = require('./utils');
|
|
|
|
var scopedModuleRegex = new RegExp('@[a-zA-Z0-9][\\w-.]+\/[a-zA-Z0-9][\\w-.]+([a-zA-Z0-9.\/]+)?', 'g');
|
|
|
|
function getModuleName(request, includeAbsolutePaths) {
|
|
var req = request;
|
|
var delimiter = '/';
|
|
|
|
if (includeAbsolutePaths) {
|
|
req = req.replace(/^.*?\/node_modules\//, '');
|
|
}
|
|
// check if scoped module
|
|
if (scopedModuleRegex.test(req)) {
|
|
// reset regexp
|
|
scopedModuleRegex.lastIndex = 0;
|
|
return req.split(delimiter, 2).join(delimiter);
|
|
}
|
|
return req.split(delimiter)[0];
|
|
}
|
|
|
|
module.exports = function nodeExternals(options) {
|
|
options = options || {};
|
|
var whitelist = [].concat(options.whitelist || []);
|
|
var binaryDirs = [].concat(options.binaryDirs || ['.bin']);
|
|
var importType = options.importType || 'commonjs';
|
|
var modulesDir = options.modulesDir || 'node_modules';
|
|
var modulesFromFile = !!options.modulesFromFile;
|
|
var includeAbsolutePaths = !!options.includeAbsolutePaths;
|
|
|
|
// helper function
|
|
function isNotBinary(x) {
|
|
return !utils.contains(binaryDirs, x);
|
|
}
|
|
|
|
// create the node modules list
|
|
var nodeModules = modulesFromFile ? utils.readFromPackageJson(options.modulesFromFile) : utils.readDir(modulesDir).filter(isNotBinary);
|
|
|
|
// return an externals function
|
|
return function(context, request, callback){
|
|
var moduleName = getModuleName(request, includeAbsolutePaths);
|
|
if (utils.contains(nodeModules, moduleName) && !utils.containsPattern(whitelist, request)) {
|
|
if (typeof importType === 'function') {
|
|
return callback(null, importType(request));
|
|
}
|
|
// mark this module as external
|
|
// https://webpack.js.org/configuration/externals/
|
|
return callback(null, importType + " " + request);
|
|
};
|
|
callback();
|
|
}
|
|
}; |