@roots/bud-build
Version:
bud.js core module
106 lines (105 loc) • 3.53 kB
JavaScript
export const module = async ({ build: { rules }, hooks: { filter }, path, }) => filter(`build.module`, {
noParse: filter(`build.module.noParse`, undefined),
rules: getRules({ filter, path, rules }),
unsafeCache: filter(`build.module.unsafeCache`, undefined),
});
/**
* Get all module.rules
*/
const getRules = ({ filter, path, rules }) => {
return [
...filter(`build.module.rules.before`, [
{
include: [path(`@src`)],
parser: { requireEnsure: false },
test: filter(`pattern.js`),
},
rules.image.toWebpack
? {
oneOf: [
rules[`inline-image`]?.toWebpack?.(),
rules.image?.toWebpack?.(),
].filter(Boolean),
test: filter(`pattern.image`),
}
: undefined,
rules.font.toWebpack
? {
oneOf: [
rules[`inline-font`]?.toWebpack?.(),
rules.font?.toWebpack?.(),
].filter(Boolean),
test: filter(`pattern.font`),
}
: undefined,
rules.svg.toWebpack
? {
oneOf: [
rules[`inline-svg`]?.toWebpack?.(),
rules.svg?.toWebpack?.(),
].filter(Boolean),
test: filter(`pattern.svg`),
}
: undefined,
]),
...filter(`build.module.rules.oneOf`, [
...makeDefinedRuleSet({ rules }),
...makeIssuerRuleSet({ filter, path, rules }),
]).filter(Boolean),
...filter(`build.module.rules.after`, []),
].filter(Boolean);
};
/**
* Make defined rule set
*/
const makeDefinedRuleSet = ({ rules }) => {
return Object.entries(rules)
.filter(([key]) => ![
`font`,
`image`,
`inline-font`,
`inline-image`,
`inline-svg`,
`svg`,
].includes(key))
.map(([, rule]) => rule)
.filter(Boolean)
.map(rule => {
return `toWebpack` in rule ? rule.toWebpack() : rule;
});
};
/**
* Get rules for css and css-module imports issued by non-css files.
*/
const makeIssuerRuleSet = ({ filter, path, rules }) => {
const results = [];
rules[`css-module`]?.toWebpack?.().use &&
results.push({
exclude: [path(`@src`)],
issuer: { not: filter(`pattern.cssModule`) },
test: filter(`pattern.cssModule`),
use: rules[`css-module`].toWebpack?.().use,
});
rules[`css`]?.toWebpack?.().use &&
results.push({
exclude: [path(``)],
issuer: { not: filter(`pattern.css`) },
test: filter(`pattern.css`),
use: rules[`css`].toWebpack?.().use,
});
rules[`
sass-module`]?.toWebpack?.().use &&
results.push({
exclude: [path(``)],
issuer: { not: filter(`pattern.sassModule`) },
test: filter(`pattern.sassModule`),
use: rules[`sass-module`].toWebpack?.().use,
});
rules[`sass`]?.toWebpack?.().use &&
results.push({
exclude: [path(``)],
issuer: { not: filter(`pattern.sass`) },
test: filter(`pattern.sass`),
use: rules[`sass`].toWebpack?.().use,
});
return results;
};