line_push/node_modules/webpack-node-externals/index.js
2022-07-17 13:16:16 +08:00

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();
}
};