UNPKG

@sentre/craco-plugins

Version:
137 lines (135 loc) 7.3 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /** * Credit https://github.com/DocSpring/craco-less * This modification to let craco-less to work with webpack 5 * file-loader is no longer available in webpack 5 * look for asset/resource instead of file-loader */ var path = require('path'); var _require = require('./utils'), deepClone = _require.deepClone, styleRuleByName = _require.styleRuleByName; var pathSep = path.sep; var lessRegex = /\.less$/; var lessModuleRegex = /\.module\.less$/; var overrideWebpackConfig = function overrideWebpackConfig(_ref) { var context = _ref.context, webpackConfig = _ref.webpackConfig, pluginOptions = _ref.pluginOptions; var _require2 = require('@craco/craco'), throwUnexpectedConfigError = _require2.throwUnexpectedConfigError; var throwError = function throwError(message, githubIssueQuery) { return throwUnexpectedConfigError({ packageName: 'craco-less', githubRepo: 'DocSpring/craco-less', message: message, githubIssueQuery: githubIssueQuery }); }; pluginOptions = pluginOptions || {}; var createLessRule = function createLessRule(_ref2) { var baseRule = _ref2.baseRule, overrideRule = _ref2.overrideRule; baseRule = deepClone(baseRule); var lessRule = _objectSpread(_objectSpread(_objectSpread({}, baseRule), overrideRule), {}, { use: [] }); var loaders = baseRule.use; loaders.forEach(function (ruleOrLoader) { var rule; if (typeof ruleOrLoader === 'string') { rule = { loader: ruleOrLoader, options: {} }; } else { rule = ruleOrLoader; } if ((context.env === 'development' || context.env === 'test') && rule.loader.includes("".concat(pathSep, "style-loader").concat(pathSep))) { lessRule.use.push({ loader: rule.loader, options: _objectSpread(_objectSpread({}, rule.options), pluginOptions.styleLoaderOptions || {}) }); } else if (rule.loader.includes("".concat(pathSep, "css-loader").concat(pathSep))) { lessRule.use.push({ loader: rule.loader, options: _objectSpread(_objectSpread({}, rule.options), pluginOptions.cssLoaderOptions || {}) }); } else if (rule.loader.includes("".concat(pathSep, "postcss-loader").concat(pathSep))) { lessRule.use.push({ loader: rule.loader, options: _objectSpread(_objectSpread({}, rule.options), pluginOptions.postcssLoaderOptions || {}) }); } else if (rule.loader.includes("".concat(pathSep, "resolve-url-loader").concat(pathSep))) { lessRule.use.push({ loader: rule.loader, options: _objectSpread(_objectSpread({}, rule.options), pluginOptions.resolveUrlLoaderOptions || {}) }); } else if (context.env === 'production' && rule.loader.includes("".concat(pathSep, "mini-css-extract-plugin").concat(pathSep))) { lessRule.use.push({ loader: rule.loader, options: _objectSpread(_objectSpread({}, rule.options), pluginOptions.miniCssExtractPluginOptions || {}) }); } else if (rule.loader.includes("".concat(pathSep, "sass-loader").concat(pathSep))) { lessRule.use.push({ loader: require.resolve('less-loader'), options: _objectSpread(_objectSpread({}, rule.options), pluginOptions.lessLoaderOptions) }); } else { throwError("Found an unhandled loader in the ".concat(context.env, " webpack config: ").concat(rule.loader), 'webpack+unknown+rule'); } }); return lessRule; }; var oneOfRule = webpackConfig.module.rules.find(function (rule) { return rule.oneOf; }); if (!oneOfRule) { throwError("Can't find a 'oneOf' rule under module.rules in the " + "".concat(context.env, " webpack config!"), 'webpack+rules+oneOf'); } var sassRule = oneOfRule.oneOf.find(styleRuleByName('scss|sass', false)); if (!sassRule) { throwError("Can't find the webpack rule to match scss/sass files in the " + "".concat(context.env, " webpack config!"), 'webpack+rules+scss+sass'); } var lessRule = createLessRule({ baseRule: sassRule, overrideRule: { test: lessRegex, exclude: [lessModuleRegex, /\.os\.less$/] } }); if (pluginOptions.modifyLessRule) { lessRule = pluginOptions.modifyLessRule(lessRule, context); } var sassModuleRule = oneOfRule.oneOf.find(styleRuleByName('scss|sass', true)); if (!sassModuleRule) { throwError("Can't find the webpack rule to match scss/sass module files in the " + "".concat(context.env, " webpack config!"), 'webpack+rules+scss+sass'); } var lessModuleRule = createLessRule({ baseRule: sassModuleRule, overrideRule: { test: lessModuleRegex, exclude: [/\.os\.module\.less$/] } }); if (pluginOptions.modifyLessModuleRule) { lessModuleRule = pluginOptions.modifyLessModuleRule(lessModuleRule, context); } var assetResourceIndex = oneOfRule.oneOf.findIndex(function (rule) { return rule.type === 'asset/resource'; }); if (assetResourceIndex === -1) { throwError("Can't find asset/resource in the ".concat(context.env, " webpack config!"), 'webpack+asset/resource'); } oneOfRule.oneOf.splice(assetResourceIndex, 0, lessRule, lessModuleRule); return webpackConfig; }; module.exports = { overrideWebpackConfig: overrideWebpackConfig };