@sentre/craco-plugins
Version:
Craco plugins for CRA
137 lines (135 loc) • 7.3 kB
JavaScript
;
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
};