UNPKG

siegel

Version:

Web application development ecosystem

107 lines (106 loc) 3.94 kB
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;