siegel
Version:
Web application development ecosystem
142 lines (141 loc) • 5.5 kB
JavaScript
import { PATHS, IS_SELF_DEVELOPMENT } from '../../constants.js';
import { loadersKeyMap, webpackModuleRulesRegExp, DEPENDENCIES } from '../constants.js';
const { plugins: { miniCssExtract }, loaders: { swcLoader, cssLoader, sassLoader, styleLoader, sassResourcesLoader, workerLoader, postCssLoader, postCssAutoprefix, postCssSVG2Font } } = DEPENDENCIES;
function getDefaultModulesConfig(config) {
const { build, runMode } = config;
const { isProd, isServer } = runMode;
const { input, output } = build;
const sourceMap = !isProd;
const defaultRules = {
[webpackModuleRulesRegExp.worker]: {
loadersOrder: [loadersKeyMap.workers],
loaders: {
[loadersKeyMap.workers]: {
ident: loadersKeyMap.workers,
loader: workerLoader
}
},
ruleOptions: {
include: [PATHS.clientCoreOutput]
}
},
[webpackModuleRulesRegExp.scripts]: {
loadersOrder: [loadersKeyMap.swcLoader],
loaders: {
[loadersKeyMap.swcLoader]: {
ident: loadersKeyMap.swcLoader,
loader: swcLoader,
options: {
jsc: {
parser: {
syntax: 'typescript',
jsx: true
},
target: output.target
}
}
}
}
},
[webpackModuleRulesRegExp.styles]: {
loadersOrder: [
loadersKeyMap.cssFinal,
loadersKeyMap.cssLoader,
loadersKeyMap.postCssLoader,
loadersKeyMap.sassLoader,
...(input.sassResources ? [loadersKeyMap.sassResources] : [])
],
loaders: {
[loadersKeyMap.cssFinal]: {
ident: loadersKeyMap.cssFinal,
loader: isProd || !isServer
? miniCssExtract.loader
: styleLoader
},
[loadersKeyMap.cssLoader]: {
loader: cssLoader,
ident: loadersKeyMap.cssLoader,
options: {
sourceMap,
// url: url => !url.endsWith('.svg'),
importLoaders: 2,
modules: {
exportLocalsConvention: 'as-is',
namedExport: false,
localIdentName: isProd
? '[hash:base64:4]'
: '[local]--[hash:base64:4]'
}
}
},
[loadersKeyMap.postCssLoader]: {
loader: postCssLoader,
ident: loadersKeyMap.postCssLoader,
options: {
sourceMap,
postcssOptions: {
plugins: [
postCssAutoprefix({ overrideBrowserslist: 'last 1 version' }),
...(input.iconsRoot ? [
postCssSVG2Font({
isWoff2: isProd,
iconsRoot: input.iconsRoot
})
] : [])
]
}
}
},
[loadersKeyMap.sassLoader]: {
loader: sassLoader,
ident: loadersKeyMap.sassLoader,
options: { sourceMap }
},
...(input.sassResources ? {
[loadersKeyMap.sassResources]: {
loader: sassResourcesLoader,
ident: loadersKeyMap.sassResources,
options: {
resources: input.sassResources
}
}
} : {})
},
...(IS_SELF_DEVELOPMENT
? {}
: {
ruleOptions: {
include: [PATHS.clientCoreOutput]
}
})
},
[webpackModuleRulesRegExp.files]: {
ruleOptions: {
type: 'asset/resource'
}
}
};
Object.values(defaultRules)
.forEach(defaultRule => {
defaultRule.ruleOptions ||= {};
const { ruleOptions } = defaultRule;
const { include: _include, exclude: _exclude } = ruleOptions;
ruleOptions.include = _include && input.include
? _include.concat(input.include)
: _include || input.include,
ruleOptions.exclude = _exclude && input.exclude
? _exclude.concat(input.exclude)
: _exclude || input.exclude;
});
const defaultRulesData = {
order: [
webpackModuleRulesRegExp.worker,
webpackModuleRulesRegExp.scripts,
webpackModuleRulesRegExp.styles,
webpackModuleRulesRegExp.files
],
rules: defaultRules
};
return defaultRulesData;
}
export default getDefaultModulesConfig;