UNPKG

@arco-plugins/webpack-react

Version:
159 lines (158 loc) 5.52 kB
"use strict"; 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;