siegel
Version:
Web application development ecosystem
107 lines (106 loc) • 3.94 kB
JavaScript
import path from 'path';
import isExists from '../../../common/is/exists/index.js';
import { COMMONS, DEPENDENCIES, pluginsKeysMap } from '../constants.js';
const { webpack, plugins: { HTMLPlugin, fileCopyPlugin, compressionPlugin, miniCssExtract, reactRefresh, serviceWorkerPlugin, eslint } } = DEPENDENCIES;
const { ESLintExtensions } = COMMONS;
const resolvePluginDefaultOptions = (defaultOptions, userOptions) => (typeof userOptions == 'object'
? userOptions
: typeof userOptions == 'function'
? userOptions(defaultOptions)
: defaultOptions);
function getDefaultPluginsConfig(config) {
const { build, runMode, publicDir } = config;
const { isProd, isServer } = runMode;
const { eslint: eslintOptions, input, output } = build;
const outputFilenames = output.filenames;
const compressionInstanceCommonOptions = {
test: /\.*$/,
threshold: 10240,
deleteOriginalAssets: false
};
const defaults = {
[pluginsKeysMap.compression]: {
plugin: compressionPlugin,
enabled: isProd,
instances: {
br: {
options: {
...compressionInstanceCommonOptions,
filename: outputFilenames.brotli,
algorithm: 'brotliCompress',
compressionOptions: {
level: 11
}
}
},
gzip: {
options: {
...compressionInstanceCommonOptions,
filename: outputFilenames.gzip
}
}
}
},
[pluginsKeysMap.copy]: {
plugin: fileCopyPlugin,
enabled: !!input.copyFiles,
options: {
patterns: typeof input.copyFiles == 'string'
? [{
from: input.copyFiles,
to: path.join(publicDir, path.relative(path.dirname(isExists(input.html.template)
|| typeof input.html == 'string'
? typeof input.html == 'string'
? input.html
: input.html.template
: input.js), input.copyFiles))
}]
: input.copyFiles
}
},
[pluginsKeysMap.sw]: {
plugin: serviceWorkerPlugin,
enabled: !!input.sw,
options: input.sw
},
[pluginsKeysMap.cssExtract]: {
plugin: miniCssExtract,
enabled: isProd || !isServer,
options: {
experimentalUseImportModule: true,
filename: outputFilenames.styles,
chunkFilename: outputFilenames.styles_chunk
}
},
[pluginsKeysMap.html]: {
plugin: HTMLPlugin,
enabled: !!input.html,
options: resolvePluginDefaultOptions({
// scriptLoading: 'defer',
template: input.html,
minify: {
collapseWhitespace: true
}
}, input.html)
},
[pluginsKeysMap.hot]: {
plugin: webpack.HotModuleReplacementPlugin,
enabled: !isProd
},
[pluginsKeysMap.reactRefresh]: {
plugin: reactRefresh,
enabled: !isProd
},
[pluginsKeysMap.eslint]: {
plugin: eslint,
enabled: !!eslintOptions,
options: resolvePluginDefaultOptions({
extensions: ESLintExtensions,
emitWarning: true,
configType: 'flat'
}, eslintOptions)
}
};
return defaults;
}
export default getDefaultPluginsConfig;