@arco-plugins/webpack-react
Version:
arco webpack plugin
159 lines (158 loc) • 5.52 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getContext = exports.printError = exports.rewriteLessLoaderOptions = exports.injectBabelPlugin = exports.deleteBabelPlugin = exports.getLoaderIndex = exports.getLoader = exports.hookNormalModuleLoader = void 0;
var webpack_1 = __importDefault(require("webpack"));
var lodash_1 = require("lodash");
var utils_1 = require("@arco-plugins/utils");
var path_1 = require("path");
/**
* 获取指定路径的值,没有的时候将其设置为指定默认值
* @param {object} src
* @param {string} path
* @param {function} checkFn
* @param {any} defaultValue
* @return {any}
*/
function getAndSetWhen(src, path, checkFn, defaultValue) {
if (!(0, lodash_1.isObject)(src))
return;
var res = (0, lodash_1.get)(src, path);
if (!checkFn(res)) {
(0, lodash_1.set)(src, path, defaultValue);
return (0, lodash_1.get)(src, path);
}
return res;
}
/**
* 勾入 normalModuleLoader
* @param {Compiler} compiler
* @param {string} pluginName
* @param {Function} callback
*/
function hookNormalModuleLoader(compiler, pluginName, callback) {
var hookHandler = function (context, module) {
var resource = module.resource;
if (!resource)
return;
var i = resource.indexOf('?');
callback(context, module, i < 0 ? resource : resource.substr(0, i));
};
var webpackImplementation = global.arcoDesignPlugin.options.webpackImplementation ||
webpack_1.default;
compiler.hooks.compilation.tap(pluginName, function (compilation) {
if (webpackImplementation.NormalModule &&
webpackImplementation.NormalModule.getCompilationHooks) {
// for webpack 5
webpackImplementation.NormalModule.getCompilationHooks(compilation).loader.tap(pluginName, hookHandler);
}
else if (compilation.hooks) {
// for webpack 4
compilation.hooks.normalModuleLoader.tap(pluginName, hookHandler);
}
else if (compilation.plugin) {
// for webpack 3
compilation.plugin('normal-module-loader', hookHandler);
}
});
}
exports.hookNormalModuleLoader = hookNormalModuleLoader;
/**
* 返回指定的名称的loader配置
* @param {loader[]} loaders
* @param {string} loaderName
* @returns {loader}
*/
function getLoader(loaders, loaderName) {
if (!Array.isArray(loaders) || !loaders.length)
return;
return loaders.find(function (item) { return item.loader.indexOf(loaderName) > -1; });
}
exports.getLoader = getLoader;
/**
* 返回指定的名称的loader的位置
* @param {loader[]} loaders
* @param {string} loaderName
* @returns {number}
*/
function getLoaderIndex(loaders, loaderName) {
if (!Array.isArray(loaders) || !loaders.length)
return -1;
return loaders.findIndex(function (item) { return item.loader.indexOf(loaderName) > -1; });
}
exports.getLoaderIndex = getLoaderIndex;
/**
* 删除一个 babel 插件
* @param {LoaderConfig} babelLoader
* @param {Function} filterMethod
*/
function deleteBabelPlugin(babelLoader, match) {
if (!babelLoader)
return;
var plugins = (0, lodash_1.get)(babelLoader, 'options.plugins');
if (!plugins)
return;
for (var i = 0; i < plugins.length; i++) {
var plugin = plugins[i];
if (match(plugin)) {
plugins.splice(i, 1);
i--;
}
}
}
exports.deleteBabelPlugin = deleteBabelPlugin;
/**
* 插入一个 babel 插件
* @param {LoaderConfig} babelLoader
* @param {loader plugin options} pluginOptions
*/
function injectBabelPlugin(babelLoader, pluginOptions) {
if (!babelLoader)
return;
var plugins = getAndSetWhen(babelLoader, 'options.plugins', Array.isArray, []);
var pluginOptionsName = pluginOptions[2];
if (plugins.every(function (plugin) { return plugin[2] !== pluginOptionsName; })) {
plugins.push(pluginOptions);
}
}
exports.injectBabelPlugin = injectBabelPlugin;
/**
* 给 less-loader 加上主题变量
* @param {loaderConfig} lessLoader
* @param {lessLoader.options} options
*/
function rewriteLessLoaderOptions(lessLoader, options) {
if (!lessLoader)
return;
// less-loader 6.0 之后 less 的配置放到了 options.lessOptions。这边简单的通过判断原本的配置中是否存在 lessOptions 来决定用谁
var useLessOptions = !!(0, lodash_1.get)(lessLoader, 'options.lessOptions');
var lessOptions = getAndSetWhen(lessLoader, useLessOptions ? 'options.lessOptions' : 'options', lodash_1.isObject, {});
Object.assign(lessOptions, options);
}
exports.rewriteLessLoaderOptions = rewriteLessLoaderOptions;
/**
* 打印错误信息
*/
function printError(error) {
if (error) {
utils_1.print.error("[arco-design/webpack-plugin]: ".concat(error));
}
}
exports.printError = printError;
/**
* 获取上下文的决对路径,默认为 compiler.context 即 webpackConfig.context
* @param {Compiler} compiler
* @returns {string}
*/
function getContext(compiler, context) {
if (!context) {
return String(compiler.options.context);
}
if (!(0, path_1.isAbsolute)(context)) {
return (0, path_1.join)(String(compiler.options.context), context);
}
return context;
}
exports.getContext = getContext;