diff --git a/README.md b/README.md index 762d90a..969d590 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,7 @@ With this `{rootDir}/src/ui/tsconfig.json`: - `locale`: (`string[]=['ru']`) — list of `moment.js` or `day.js` locales to include, e.g. `['de', 'es']`. Locale `En` is always present. - `safari10` (`boolean`) — Enables `safari10` terser's option. [Terser options](https://github.com/terser/terser#minify-options) - `transformCssWithLightningCss` (`boolean`) — use [Lighting CSS](https://lightningcss.dev) to transform and minimize css instead of PostCSS and cssnano +- `terser` (`(options: TerserOptions) => TerserOptions`) - modify or return a custom [Terser options](https://github.com/terser/terser#minify-options). ##### Monaco editor support diff --git a/src/common/models/index.ts b/src/common/models/index.ts index 60e990b..4e0c53f 100644 --- a/src/common/models/index.ts +++ b/src/common/models/index.ts @@ -18,6 +18,7 @@ import type {Options as StatoscopeOptions} from '@statoscope/webpack-plugin'; import type {SentryWebpackPluginOptions} from '@sentry/webpack-plugin'; import type {WebpackMode} from '../webpack/config'; import type {UploadOptions} from '../s3-upload/upload'; +import type {TerserOptions} from 'terser-webpack-plugin'; export interface Entities { data: Record; @@ -134,6 +135,8 @@ export interface ClientConfig { symlinks?: boolean; /** * Enables `safari10` terser's option. [Terser options](https://github.com/terser/terser#minify-options) + * + * @deprecated use `terser` option instead */ safari10?: boolean; /** @@ -201,6 +204,10 @@ export interface ClientConfig { config: Babel.TransformOptions, options: {configType: `${WebpackMode}`}, ) => Babel.TransformOptions | Promise; + /** + * Modify or return a custom [Terser options](https://github.com/terser/terser#minify-options). + */ + terser?: (options: TerserOptions) => TerserOptions; } export interface CdnUploadConfig { diff --git a/src/common/webpack/config.ts b/src/common/webpack/config.ts index 7e5181d..c675abd 100644 --- a/src/common/webpack/config.ts +++ b/src/common/webpack/config.ts @@ -968,15 +968,18 @@ function configureOptimization({config}: HelperOptions): webpack.Configuration[' (compiler) => { // Lazy load the Terser plugin const TerserPlugin: typeof TerserWebpackPlugin = require('terser-webpack-plugin'); - new TerserPlugin({ - terserOptions: { - compress: { - passes: 2, - }, - safari10: config.safari10, - mangle: !config.reactProfiling, + let terserOptions: TerserWebpackPlugin.TerserOptions = { + compress: { + passes: 2, }, - }).apply(compiler); + safari10: config.safari10, + mangle: !config.reactProfiling, + }; + const {terser} = config; + if (typeof terser === 'function') { + terserOptions = terser(terserOptions); + } + new TerserPlugin({terserOptions}).apply(compiler); }, ], };