@craco/craco
Version:
Create React App Configuration Override, an easy and comprehensible configuration layer for create-react-app.
68 lines (54 loc) • 2.02 kB
JavaScript
const { getLoaders, loaderByName } = require("../../../loaders");
const { log, logError } = require("../../../logger");
const { isString, isFunction, deepMergeWithArray } = require("../../../utils");
function setLoaderProperty(match, key, valueProviders) {
if (isString(match.loader)) {
match.parent[match.index] = {
loader: match.loader,
[key]: valueProviders.whenString()
};
} else {
match.loader[key] = valueProviders.whenObject();
}
}
function applyLoaderOptions(match, loaderOptions, context) {
if (isFunction(loaderOptions)) {
setLoaderProperty(match, "options", {
whenString: () => loaderOptions({}, context),
whenObject: () => loaderOptions(match.loader.options || {}, context)
});
if (!match.loader.options) {
throw new Error("craco: 'style.sass.loaderOptions' function didn't return a loader config object.");
}
} else {
// TODO: ensure is otherwise a plain object, if not, log an error.
setLoaderProperty(match, "options", {
whenString: () => loaderOptions,
whenObject: () => deepMergeWithArray({}, match.loader.options || {}, loaderOptions)
});
}
log("Applied Sass loaders options.");
}
function overrideLoader(match, sassOptions, context) {
const { loaderOptions } = sassOptions;
if (loaderOptions) {
applyLoaderOptions(match, loaderOptions, context);
log("Overrided Sass loader.");
}
}
function overrideSass(styleConfig, webpackConfig, context) {
if (styleConfig.sass) {
const { hasFoundAny, matches } = getLoaders(webpackConfig, loaderByName("sass-loader"));
if (!hasFoundAny) {
logError("Cannot find any Sass loaders.");
return webpackConfig;
}
matches.forEach(x => {
overrideLoader(x, styleConfig.sass, context);
});
}
return webpackConfig;
}
module.exports = {
overrideSass
};