config-overrides.js (39 lines of code) (raw):
const { loaderNameMatches, getLoader } = require('react-app-rewired')
const rewireTypescript = require('react-app-rewire-typescript')
const ruleTestMatches = (rule, value) =>
rule.test &&
((rule.test instanceof RegExp && value.match(rule.test)) ||
(typeof rule.test === 'string' && value.indexOf(rule.test) !== -1))
const ruleChildren = rule =>
rule.use || rule.oneOf || (Array.isArray(rule.loader) && rule.loader) || []
const findIndexAndRules = (rulesSource, ruleMatcher) => {
let result
const rules = Array.isArray(rulesSource)
? rulesSource
: ruleChildren(rulesSource)
rules.some(
(rule, index) =>
(result = ruleMatcher(rule)
? { index, rules }
: findIndexAndRules(ruleChildren(rule), ruleMatcher))
)
return result
}
const addBeforeRule = (rulesSource, ruleMatcher, value) => {
const { index, rules } = findIndexAndRules(rulesSource, ruleMatcher)
rules.splice(index, 0, value)
}
module.exports = (config, env) => {
config = rewireTypescript(config, env)
const cssMatcher = r => ruleTestMatches(r, '.css')
const cssLoader = getLoader(config.module.rules, cssMatcher)
const scssRules = {
test: /\.scss$/,
use: (cssLoader.use || cssLoader.loader).concat([{
loader: 'sass-loader'
}])
}
const fileLoaderMatcher = r => loaderNameMatches(r, 'file-loader')
addBeforeRule(config.module.rules, fileLoaderMatcher, scssRules)
return config
}