Enable jqhtml data caching with automatic ES6 class registration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-12-07 18:24:12 +00:00
parent c4a338fe7c
commit 12e676f317
54 changed files with 3187 additions and 1007 deletions

0
node_modules/terser-webpack-plugin/LICENSE generated vendored Executable file → Normal file
View File

138
node_modules/terser-webpack-plugin/README.md generated vendored Executable file → Normal file
View File

@@ -17,7 +17,9 @@ This plugin uses [terser](https://github.com/terser/terser) to minify/minimize y
## Getting Started
Webpack v5 comes with the latest `terser-webpack-plugin` out of the box. If you are using Webpack v5 or above and wish to customize the options, you will still need to install `terser-webpack-plugin`. Using Webpack v4, you have to install `terser-webpack-plugin` v4.
Webpack v5 comes with the latest `terser-webpack-plugin` out of the box.
If you are using Webpack v5 or above and wish to customize the options, you will still need to install `terser-webpack-plugin`.
Using Webpack v4, you have to install `terser-webpack-plugin` v4.
To begin, you'll need to install `terser-webpack-plugin`:
@@ -37,7 +39,7 @@ or
pnpm add -D terser-webpack-plugin
```
Then add the plugin to your `webpack` config. For example:
Then add the plugin to your `webpack` configuration. For example:
**webpack.config.js**
@@ -52,7 +54,7 @@ module.exports = {
};
```
And run `webpack` via your preferred method.
Finally, run `webpack` using the method you normally use (e.g., via CLI or an npm script).
## Note about source maps
@@ -61,7 +63,7 @@ And run `webpack` via your preferred method.
Why?
- `eval` wraps modules in `eval("string")` and the minimizer does not handle strings.
- `cheap` has not column information and minimizer generate only a single line, which leave only a single mapping.
- `cheap` has no column information and the minimizer generates only a single line, which leaves only a single mapping.
Using supported `devtool` values enable source map generation.
@@ -80,7 +82,7 @@ Using supported `devtool` values enable source map generation.
Type:
```ts
type test = string | RegExp | Array<string | RegExp>;
type test = string | RegExp | (string | RegExp)[];
```
Default: `/\.m?js(\?.*)?$/i`
@@ -107,7 +109,7 @@ module.exports = {
Type:
```ts
type include = string | RegExp | Array<string | RegExp>;
type include = string | RegExp | (string | RegExp)[];
```
Default: `undefined`
@@ -134,7 +136,7 @@ module.exports = {
Type:
```ts
type exclude = string | RegExp | Array<string | RegExp>;
type exclude = string | RegExp | (string | RegExp)[];
```
Default: `undefined`
@@ -167,6 +169,7 @@ type parallel = boolean | number;
Default: `true`
Use multi-process parallel running to improve the build speed.
Default number of concurrent runs: `os.cpus().length - 1` or `os.availableParallelism() - 1` (if this function is supported).
> **Note**
@@ -175,7 +178,7 @@ Default number of concurrent runs: `os.cpus().length - 1` or `os.availableParall
> **Warning**
>
> If you use **Circle CI** or any other environment that doesn't provide real available count of CPUs then you need to setup explicitly number of CPUs to avoid `Error: Call retries were exceeded` (see [#143](https://github.com/webpack-contrib/terser-webpack-plugin/issues/143), [#202](https://github.com/webpack-contrib/terser-webpack-plugin/issues/202)).
> If you use **Circle CI** or any other environment that doesn't provide the real available count of CPUs then you need to explicitly set up the number of CPUs to avoid `Error: Call retries were exceeded` (see [#143](https://github.com/webpack/terser-webpack-plugin/issues/143), [#202](https://github.com/webpack/terser-webpack-plugin/issues/202)).
#### `boolean`
@@ -221,9 +224,7 @@ Type:
```ts
type minify = (
input: {
[file: string]: string;
},
input: Record<string, string>,
sourceMap: import("@jridgewell/trace-mapping").SourceMapInput | undefined,
minifyOptions: {
module?: boolean | undefined;
@@ -242,7 +243,7 @@ type minify = (
pos: number;
line: number;
col: number;
}
},
) => boolean)
| {
condition?:
@@ -258,7 +259,7 @@ type minify = (
pos: number;
line: number;
col: number;
}
},
) => boolean)
| undefined;
filename?: string | ((fileData: any) => string) | undefined;
@@ -268,7 +269,7 @@ type minify = (
| ((commentsFile: string) => string)
| undefined;
}
| undefined
| undefined,
) => Promise<{
code: string;
map?: import("@jridgewell/trace-mapping").SourceMapInput | undefined;
@@ -280,7 +281,7 @@ type minify = (
Default: `TerserPlugin.terserMinify`
Allows you to override default minify function.
Allows you to override the default minify function.
By default plugin uses [terser](https://github.com/terser/terser) package.
Useful for using and testing unpublished versions or forks.
@@ -313,7 +314,6 @@ minify.getMinimizerVersion = () => {
let packageJson;
try {
// eslint-disable-next-line global-require, import/no-extraneous-dependencies
packageJson = require("uglify-module/package.json");
} catch (error) {
// Ignore
@@ -342,7 +342,7 @@ module.exports = {
Type:
```ts
type terserOptions = {
interface terserOptions {
compress?: boolean | CompressOptions;
ecma?: ECMA;
enclose?: boolean | string;
@@ -359,7 +359,7 @@ type terserOptions = {
safari10?: boolean;
sourceMap?: boolean | SourceMapOptions;
toplevel?: boolean;
};
}
```
Default: [default](https://github.com/terser/terser#minify-options)
@@ -413,7 +413,7 @@ type extractComments =
pos: number;
line: number;
col: number;
}
},
) => boolean)
| {
condition?:
@@ -429,7 +429,7 @@ type extractComments =
pos: number;
line: number;
col: number;
}
},
) => boolean)
| undefined;
filename?: string | ((fileData: any) => string) | undefined;
@@ -444,9 +444,12 @@ type extractComments =
Default: `true`
Whether comments shall be extracted to a separate file, (see [details](https://github.com/webpack/webpack/commit/71933e979e51c533b432658d5e37917f9e71595a)).
By default extract only comments using `/^\**!|@preserve|@license|@cc_on/i` regexp condition and remove remaining comments.
By default, extract only comments using `/^\**!|@preserve|@license|@cc_on/i` RegExp condition and remove remaining comments.
If the original file is named `foo.js`, then the comments will be stored to `foo.js.LICENSE.txt`.
The `terserOptions.format.comments` option specifies whether the comment will be preserved, i.e. it is possible to preserve some comments (e.g. annotations) while extracting others or even preserving comments that have been extracted.
The `terserOptions.format.comments` option specifies whether the comment will be preserved - i.e., it is possible to preserve some comments (e.g. annotations) while extracting others, or even preserve comments that have already been extracted.
#### `boolean`
@@ -469,7 +472,7 @@ module.exports = {
#### `string`
Extract `all` or `some` (use `/^\**!|@preserve|@license|@cc_on/i` RegExp) comments.
Extract `all` or `some` (use the `/^\**!|@preserve|@license|@cc_on/i` RegExp) comments.
**webpack.config.js**
@@ -488,7 +491,7 @@ module.exports = {
#### `RegExp`
All comments that match the given expression will be extracted to the separate file.
All comments that match the given expression will be extracted to a separate file.
**webpack.config.js**
@@ -507,7 +510,7 @@ module.exports = {
#### `function`
All comments that match the given expression will be extracted to the separate file.
All comments that match the given expression will be extracted to a separate file.
**webpack.config.js**
@@ -532,7 +535,7 @@ module.exports = {
#### `object`
Allow to customize condition for extract comments, specify extracted file name and banner.
Allows you to customize condition for extracting comments, and specify the extracted file name and banner.
**webpack.config.js**
@@ -544,13 +547,11 @@ module.exports = {
new TerserPlugin({
extractComments: {
condition: /^\**!|@preserve|@license|@cc_on/i,
filename: (fileData) => {
filename: (fileData) =>
// The "fileData" argument contains object with "filename", "basename", "query" and "hash"
return `${fileData.filename}.LICENSE.txt${fileData.query}`;
},
banner: (licenseFile) => {
return `License information can be found in ${licenseFile}`;
},
`${fileData.filename}.LICENSE.txt${fileData.query}`,
banner: (licenseFile) =>
`License information can be found in ${licenseFile}`,
},
}),
],
@@ -576,12 +577,12 @@ type condition =
pos: number;
line: number;
col: number;
}
},
) => boolean)
| undefined;
```
Condition what comments you need extract.
The condition that determines which comments should be extracted.
**webpack.config.js**
@@ -593,13 +594,11 @@ module.exports = {
new TerserPlugin({
extractComments: {
condition: "some",
filename: (fileData) => {
filename: (fileData) =>
// The "fileData" argument contains object with "filename", "basename", "query" and "hash"
return `${fileData.filename}.LICENSE.txt${fileData.query}`;
},
banner: (licenseFile) => {
return `License information can be found in ${licenseFile}`;
},
`${fileData.filename}.LICENSE.txt${fileData.query}`,
banner: (licenseFile) =>
`License information can be found in ${licenseFile}`,
},
}),
],
@@ -620,11 +619,12 @@ Default: `[file].LICENSE.txt[query]`
Available placeholders: `[file]`, `[query]` and `[filebase]` (`[base]` for webpack 5).
The file where the extracted comments will be stored.
Default is to append the suffix `.LICENSE.txt` to the original filename.
> **Warning**
>
> We highly recommend using the `txt` extension. Using `js`/`cjs`/`mjs` extensions may conflict with existing assets which leads to broken code.
> We highly recommend using the `.txt` extension. Using `.js`/`.cjs`/`.mjs` extensions may conflict with existing assets, which leads to broken code.
**webpack.config.js**
@@ -637,9 +637,8 @@ module.exports = {
extractComments: {
condition: /^\**!|@preserve|@license|@cc_on/i,
filename: "extracted-comments.js",
banner: (licenseFile) => {
return `License information can be found in ${licenseFile}`;
},
banner: (licenseFile) =>
`License information can be found in ${licenseFile}`,
},
}),
],
@@ -657,9 +656,11 @@ type banner = string | boolean | ((commentsFile: string) => string) | undefined;
Default: `/*! For license information please see ${commentsFile} */`
The banner text that points to the extracted file and will be added on top of the original file.
Can be `false` (no banner), a `String`, or a `Function<(string) -> String>` that will be called with the filename where extracted comments have been stored.
Will be wrapped into comment.
The banner text that points to the extracted file and will be added at the top of the original file.
It can be `false` (no banner), a `String`, or a `function<(string) -> String>` that will be called with the filename where the extracted comments have been stored.
The banner will be wrapped in a comment.
**webpack.config.js**
@@ -671,13 +672,11 @@ module.exports = {
new TerserPlugin({
extractComments: {
condition: true,
filename: (fileData) => {
filename: (fileData) =>
// The "fileData" argument contains object with "filename", "basename", "query" and "hash"
return `${fileData.filename}.LICENSE.txt${fileData.query}`;
},
banner: (commentsFile) => {
return `My custom banner about license information ${commentsFile}`;
},
`${fileData.filename}.LICENSE.txt${fileData.query}`,
banner: (commentsFile) =>
`My custom banner about license information ${commentsFile}`,
},
}),
],
@@ -713,7 +712,7 @@ module.exports = {
### Remove Comments
If you avoid building with comments, use this config:
If you want to build without comments, use this config:
**webpack.config.js**
@@ -759,11 +758,11 @@ module.exports = {
### [`swc`](https://github.com/swc-project/swc)
[`swc`](https://github.com/swc-project/swc) is a super-fast compiler written in rust; producing widely-supported javascript from modern standards and typescript.
[`swc`](https://github.com/swc-project/swc) is a super-fast compiler written in `Rust`, producing widely supported JavaScript from modern standards and TypeScript.
> **Warning**
>
> the `extractComments` option is not supported and all comments will be removed by default, it will be fixed in future
> The `extractComments` option is not supported, and all comments will be removed by default. This will be fixed in future
**webpack.config.js**
@@ -789,7 +788,7 @@ module.exports = {
> **Warning**
>
> the `extractComments` option is not supported and all legal comments (i.e. copyright, licenses and etc) will be preserved
> The `extractComments` option is not supported, and all legal comments (i.e. copyright, licenses and etc) will be preserved.
**webpack.config.js**
@@ -818,7 +817,7 @@ module.exports = {
### Custom Minify Function
Override default minify function - use `uglify-js` for minification.
Override the default minify function - use `uglify-js` for minification.
**webpack.config.js**
@@ -850,7 +849,7 @@ module.exports = {
### Typescript
With default terser minify function:
With default Terser minify function:
```ts
module.exports = {
@@ -870,10 +869,10 @@ module.exports = {
With built-in minify functions:
```ts
import type { JsMinifyOptions as SwcOptions } from "@swc/core";
import type { MinifyOptions as UglifyJSOptions } from "uglify-js";
import type { TransformOptions as EsbuildOptions } from "esbuild";
import type { MinifyOptions as TerserOptions } from "terser";
import { type JsMinifyOptions as SwcOptions } from "@swc/core";
import { type TransformOptions as EsbuildOptions } from "esbuild";
import { type MinifyOptions as TerserOptions } from "terser";
import { type MinifyOptions as UglifyJSOptions } from "uglify-js";
module.exports = {
optimization: {
@@ -912,9 +911,10 @@ module.exports = {
## Contributing
Please take a moment to read our contributing guidelines if you haven't yet done so.
We welcome all contributions!
If you're new here, please take a moment to review our contributing guidelines before submitting issues or pull requests.
[CONTRIBUTING](./.github/CONTRIBUTING.md)
[CONTRIBUTING](https://github.com/webpack/terser-webpack-plugin?tab=contributing-ov-file#contributing)
## License
@@ -924,10 +924,10 @@ Please take a moment to read our contributing guidelines if you haven't yet done
[npm-url]: https://npmjs.com/package/terser-webpack-plugin
[node]: https://img.shields.io/node/v/terser-webpack-plugin.svg
[node-url]: https://nodejs.org
[tests]: https://github.com/webpack-contrib/terser-webpack-plugin/workflows/terser-webpack-plugin/badge.svg
[tests-url]: https://github.com/webpack-contrib/terser-webpack-plugin/actions
[cover]: https://codecov.io/gh/webpack-contrib/terser-webpack-plugin/branch/master/graph/badge.svg
[cover-url]: https://codecov.io/gh/webpack-contrib/terser-webpack-plugin
[tests]: https://github.com/webpack/terser-webpack-plugin/workflows/terser-webpack-plugin/badge.svg
[tests-url]: https://github.com/webpack/terser-webpack-plugin/actions
[cover]: https://codecov.io/gh/webpack/terser-webpack-plugin/branch/main/graph/badge.svg
[cover-url]: https://codecov.io/gh/webpack/terser-webpack-plugin
[discussion]: https://img.shields.io/github/discussions/webpack/webpack
[discussion-url]: https://github.com/webpack/webpack/discussions
[size]: https://packagephobia.now.sh/badge?p=terser-webpack-plugin

333
node_modules/terser-webpack-plugin/dist/index.js generated vendored Executable file → Normal file
View File

@@ -1,46 +1,49 @@
"use strict";
const path = require("path");
const os = require("os");
const path = require("path");
const {
validate
} = require("schema-utils");
const {
throttleAll,
memoize,
terserMinify,
uglifyJsMinify,
swcMinify,
esbuildMinify
} = require("./utils");
const schema = require("./options.json");
const {
minify
} = require("./minify");
const schema = require("./options.json");
const {
esbuildMinify,
memoize,
swcMinify,
terserMinify,
throttleAll,
uglifyJsMinify
} = require("./utils");
/** @typedef {import("schema-utils/declarations/validate").Schema} Schema */
/** @typedef {import("webpack").Compiler} Compiler */
/** @typedef {import("webpack").Compilation} Compilation */
/** @typedef {import("webpack").WebpackError} WebpackError */
/** @typedef {import("webpack").Configuration} Configuration */
/** @typedef {import("webpack").Asset} Asset */
/** @typedef {import("webpack").AssetInfo} AssetInfo */
/** @typedef {import("jest-worker").Worker} JestWorker */
/** @typedef {import("@jridgewell/trace-mapping").SourceMapInput} SourceMapInput */
/** @typedef {import("@jridgewell/trace-mapping").EncodedSourceMap & { sources: string[], sourcesContent?: string[], file: string }} RawSourceMap */
/** @typedef {import("@jridgewell/trace-mapping").TraceMap} TraceMap */
/** @typedef {RegExp | string} Rule */
/** @typedef {Rule[] | Rule} Rules */
// eslint-disable-next-line jsdoc/no-restricted-syntax
/**
* @callback ExtractCommentsFunction
* @param {any} astNode
* @param {{ value: string, type: 'comment1' | 'comment2' | 'comment3' | 'comment4', pos: number, line: number, col: number }} comment
* @returns {boolean}
* @param {any} astNode ast Node
* @param {{ value: string, type: 'comment1' | 'comment2' | 'comment3' | 'comment4', pos: number, line: number, col: number }} comment comment node
* @returns {boolean} true when need to extract comment, otherwise false
*/
/**
* @typedef {boolean | 'all' | 'some' | RegExp | ExtractCommentsFunction} ExtractCommentsCondition
*/
// eslint-disable-next-line jsdoc/no-restricted-syntax
/**
* @typedef {string | ((fileData: any) => string)} ExtractCommentsFilename
*/
@@ -50,10 +53,10 @@ const {
*/
/**
* @typedef {Object} ExtractCommentsObject
* @property {ExtractCommentsCondition} [condition]
* @property {ExtractCommentsFilename} [filename]
* @property {ExtractCommentsBanner} [banner]
* @typedef {object} ExtractCommentsObject
* @property {ExtractCommentsCondition=} condition condition which comments need to be expected
* @property {ExtractCommentsFilename=} filename filename for extracted comments
* @property {ExtractCommentsBanner=} banner banner in filename for extracted comments
*/
/**
@@ -61,18 +64,27 @@ const {
*/
/**
* @typedef {Object} MinimizedResult
* @property {string} code
* @property {SourceMapInput} [map]
* @property {Array<Error | string>} [errors]
* @property {Array<Error | string>} [warnings]
* @property {Array<string>} [extractedComments]
* @typedef {object} ErrorObject
* @property {string} message message
* @property {number=} line line number
* @property {number=} column column number
* @property {string=} stack error stack trace
*/
/**
* @typedef {object} MinimizedResult
* @property {string=} code code
* @property {RawSourceMap=} map source map
* @property {Array<Error | string>=} errors errors
* @property {Array<Error | string>=} warnings warnings
* @property {Array<string>=} extractedComments extracted comments
*/
/**
* @typedef {{ [file: string]: string }} Input
*/
// eslint-disable-next-line jsdoc/no-restricted-syntax
/**
* @typedef {{ [key: string]: any }} CustomOptions
*/
@@ -84,9 +96,9 @@ const {
/**
* @template T
* @typedef {Object} PredefinedOptions
* @property {T extends { module?: infer P } ? P : boolean | string} [module]
* @property {T extends { ecma?: infer P } ? P : number | string} [ecma]
* @typedef {object} PredefinedOptions
* @property {T extends { module?: infer P } ? P : boolean | string=} module true when code is a EC module, otherwise false
* @property {T extends { ecma?: infer P } ? P : number | string=} ecma ecma version
*/
/**
@@ -98,16 +110,16 @@ const {
* @template T
* @callback BasicMinimizerImplementation
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {RawSourceMap | undefined} sourceMap
* @param {MinimizerOptions<T>} minifyOptions
* @param {ExtractCommentsOptions | undefined} extractComments
* @returns {Promise<MinimizedResult>}
* @returns {Promise<MinimizedResult> | MinimizedResult}
*/
/**
* @typedef {object} MinimizeFunctionHelpers
* @property {() => string | undefined} [getMinimizerVersion]
* @property {() => boolean | undefined} [supportsWorkerThreads]
* @property {() => string | undefined=} getMinimizerVersion function that returns version of minimizer
* @property {() => boolean | undefined=} supportsWorkerThreads true when minimizer support worker threads, otherwise false
*/
/**
@@ -117,17 +129,17 @@ const {
/**
* @template T
* @typedef {Object} InternalOptions
* @property {string} name
* @property {string} input
* @property {SourceMapInput | undefined} inputSourceMap
* @property {ExtractCommentsOptions | undefined} extractComments
* @property {{ implementation: MinimizerImplementation<T>, options: MinimizerOptions<T> }} minimizer
* @typedef {object} InternalOptions
* @property {string} name name
* @property {string} input input
* @property {RawSourceMap | undefined} inputSourceMap input source map
* @property {ExtractCommentsOptions | undefined} extractComments extract comments option
* @property {{ implementation: MinimizerImplementation<T>, options: MinimizerOptions<T> }} minimizer minimizer
*/
/**
* @template T
* @typedef {JestWorker & { transform: (options: string) => MinimizedResult, minify: (options: InternalOptions<T>) => MinimizedResult }} MinimizerWorker
* @typedef {JestWorker & { transform: (options: string) => Promise<MinimizedResult>, minify: (options: InternalOptions<T>) => Promise<MinimizedResult> }} MinimizerWorker
*/
/**
@@ -135,12 +147,12 @@ const {
*/
/**
* @typedef {Object} BasePluginOptions
* @property {Rules} [test]
* @property {Rules} [include]
* @property {Rules} [exclude]
* @property {ExtractCommentsOptions} [extractComments]
* @property {Parallel} [parallel]
* @typedef {object} BasePluginOptions
* @property {Rules=} test test rule
* @property {Rules=} include include rile
* @property {Rules=} exclude exclude rule
* @property {ExtractCommentsOptions=} extractComments extract comments options
* @property {Parallel=} parallel parallel option
*/
/**
@@ -153,19 +165,15 @@ const {
* @typedef {BasePluginOptions & { minimizer: { implementation: MinimizerImplementation<T>, options: MinimizerOptions<T> } }} InternalPluginOptions
*/
const getTraceMapping = memoize(() =>
// eslint-disable-next-line global-require
require("@jridgewell/trace-mapping"));
const getSerializeJavascript = memoize(() =>
// eslint-disable-next-line global-require
require("serialize-javascript"));
const getTraceMapping = memoize(() => require("@jridgewell/trace-mapping"));
const getSerializeJavascript = memoize(() => require("serialize-javascript"));
/**
* @template [T=import("terser").MinifyOptions]
*/
class TerserPlugin {
/**
* @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions<T>} [options]
* @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions<T>=} options options
*/
constructor(options) {
validate( /** @type {Schema} */schema, options || {}, {
@@ -203,26 +211,26 @@ class TerserPlugin {
/**
* @private
* @param {any} input
* @returns {boolean}
* @param {unknown} input Input to check
* @returns {boolean} Whether input is a source map
*/
static isSourceMap(input) {
// All required options for `new TraceMap(...options)`
// https://github.com/jridgewell/trace-mapping#usage
return Boolean(input && input.version && input.sources && Array.isArray(input.sources) && typeof input.mappings === "string");
return Boolean(input && typeof input === "object" && input !== null && "version" in input && "sources" in input && Array.isArray(input.sources) && "mappings" in input && typeof input.mappings === "string");
}
/**
* @private
* @param {unknown} warning
* @param {string} file
* @returns {Error}
* @param {unknown} warning warning
* @param {string} file file
* @returns {Error} built warning
*/
static buildWarning(warning, file) {
/**
* @type {Error & { hideStack: true, file: string }}
*/
// @ts-ignore
// @ts-expect-error
const builtWarning = new Error(warning.toString());
builtWarning.name = "Warning";
builtWarning.hideStack = true;
@@ -232,11 +240,11 @@ class TerserPlugin {
/**
* @private
* @param {any} error
* @param {string} file
* @param {TraceMap} [sourceMap]
* @param {Compilation["requestShortener"]} [requestShortener]
* @returns {Error}
* @param {Error | ErrorObject | string} error error
* @param {string} file file
* @param {TraceMap=} sourceMap source map
* @param {Compilation["requestShortener"]=} requestShortener request shortener
* @returns {Error} built error
*/
static buildError(error, file, sourceMap, requestShortener) {
/**
@@ -248,17 +256,21 @@ class TerserPlugin {
builtError.file = file;
return builtError;
}
if (error.line) {
if ( /** @type {ErrorObject} */error.line) {
const {
line,
column
} = /** @type {ErrorObject & { line: number, column: number }} */error;
const original = sourceMap && getTraceMapping().originalPositionFor(sourceMap, {
line: error.line,
column: error.col
line,
column
});
if (original && original.source && requestShortener) {
builtError = new Error(`${file} from Terser plugin\n${error.message} [${requestShortener.shorten(original.source)}:${original.line},${original.column}][${file}:${error.line},${error.col}]${error.stack ? `\n${error.stack.split("\n").slice(1).join("\n")}` : ""}`);
builtError = new Error(`${file} from Terser plugin\n${error.message} [${requestShortener.shorten(original.source)}:${original.line},${original.column}][${file}:${line},${column}]${error.stack ? `\n${error.stack.split("\n").slice(1).join("\n")}` : ""}`);
builtError.file = file;
return builtError;
}
builtError = new Error(`${file} from Terser plugin\n${error.message} [${file}:${error.line},${error.col}]${error.stack ? `\n${error.stack.split("\n").slice(1).join("\n")}` : ""}`);
builtError = new Error(`${file} from Terser plugin\n${error.message} [${file}:${line},${column}]${error.stack ? `\n${error.stack.split("\n").slice(1).join("\n")}` : ""}`);
builtError.file = file;
return builtError;
}
@@ -274,13 +286,17 @@ class TerserPlugin {
/**
* @private
* @param {Parallel} parallel
* @returns {number}
* @param {Parallel} parallel value of the `parallel` option
* @returns {number} number of cores for parallelism
*/
static getAvailableNumberOfCores(parallel) {
// In some cases cpus() returns undefined
// https://github.com/nodejs/node/issues/19022
const cpus = typeof os.availableParallelism === "function" ? {
const cpus =
// eslint-disable-next-line n/no-unsupported-features/node-builtins
typeof os.availableParallelism === "function" ?
// eslint-disable-next-line n/no-unsupported-features/node-builtins
{
length: os.availableParallelism()
} : os.cpus() || {
length: 1
@@ -290,10 +306,10 @@ class TerserPlugin {
/**
* @private
* @param {Compiler} compiler
* @param {Compilation} compilation
* @param {Record<string, import("webpack").sources.Source>} assets
* @param {{availableNumberOfCores: number}} optimizeOptions
* @param {Compiler} compiler compiler
* @param {Compilation} compilation compilation
* @param {Record<string, import("webpack").sources.Source>} assets assets
* @param {{ availableNumberOfCores: number }} optimizeOptions optimize options
* @returns {Promise<void>}
*/
async optimize(compiler, compilation, assets, optimizeOptions) {
@@ -310,9 +326,7 @@ class TerserPlugin {
info.extractedComments) {
return false;
}
if (!compiler.webpack.ModuleFilenameHelpers.matchObject.bind(
// eslint-disable-next-line no-undefined
undefined, this.options)(name)) {
if (!compiler.webpack.ModuleFilenameHelpers.matchObject.bind(undefined, this.options)(name)) {
return false;
}
return true;
@@ -349,13 +363,10 @@ class TerserPlugin {
if (optimizeOptions.availableNumberOfCores > 0) {
// Do not create unnecessary workers when the number of files is less than the available cores, it saves memory
numberOfWorkers = Math.min(numberOfAssets, optimizeOptions.availableNumberOfCores);
// eslint-disable-next-line consistent-return
getWorker = () => {
if (initializedWorker) {
return initializedWorker;
}
// eslint-disable-next-line global-require
const {
Worker
} = require("jest-worker");
@@ -401,7 +412,7 @@ class TerserPlugin {
} = asset;
if (!output) {
let input;
/** @type {SourceMapInput | undefined} */
/** @type {RawSourceMap | undefined} */
let inputSourceMap;
const {
source: sourceFromInputSource,
@@ -410,10 +421,9 @@ class TerserPlugin {
input = sourceFromInputSource;
if (map) {
if (!TerserPlugin.isSourceMap(map)) {
compilation.warnings.push( /** @type {WebpackError} */
new Error(`${name} contains invalid source map`));
compilation.warnings.push(new Error(`${name} contains invalid source map`));
} else {
inputSourceMap = /** @type {SourceMapInput} */map;
inputSourceMap = /** @type {RawSourceMap} */map;
}
}
if (Buffer.isBuffer(input)) {
@@ -429,7 +439,6 @@ class TerserPlugin {
inputSourceMap,
minimizer: {
implementation: this.options.minimizer.implementation,
// @ts-ignore https://github.com/Microsoft/TypeScript/issues/10727
options: {
...this.options.minimizer.options
}
@@ -455,25 +464,19 @@ class TerserPlugin {
output = await (getWorker ? getWorker().transform(getSerializeJavascript()(options)) : minify(options));
} catch (error) {
const hasSourceMap = inputSourceMap && TerserPlugin.isSourceMap(inputSourceMap);
compilation.errors.push( /** @type {WebpackError} */
TerserPlugin.buildError(error, name, hasSourceMap ? new (getTraceMapping().TraceMap)( /** @type {SourceMapInput} */inputSourceMap) :
// eslint-disable-next-line no-undefined
undefined,
// eslint-disable-next-line no-undefined
hasSourceMap ? compilation.requestShortener : undefined));
compilation.errors.push(TerserPlugin.buildError( /** @type {Error | ErrorObject | string} */
error, name, hasSourceMap ? new (getTraceMapping().TraceMap)( /** @type {RawSourceMap} */
inputSourceMap) : undefined, hasSourceMap ? compilation.requestShortener : undefined));
return;
}
if (typeof output.code === "undefined") {
compilation.errors.push( /** @type {WebpackError} */
new Error(`${name} from Terser plugin\nMinimizer doesn't return result`));
return;
compilation.errors.push(new Error(`${name} from Terser plugin\nMinimizer doesn't return result`));
}
if (output.warnings && output.warnings.length > 0) {
output.warnings = output.warnings.map(
/**
* @param {Error | string} item
* @param {Error | string} item a warning
* @returns {Error} built warning with extra info
*/
item => TerserPlugin.buildWarning(item, name));
}
@@ -481,60 +484,61 @@ class TerserPlugin {
const hasSourceMap = inputSourceMap && TerserPlugin.isSourceMap(inputSourceMap);
output.errors = output.errors.map(
/**
* @param {Error | string} item
* @param {Error | string} item an error
* @returns {Error} built error with extra info
*/
item => TerserPlugin.buildError(item, name, hasSourceMap ? new (getTraceMapping().TraceMap)( /** @type {SourceMapInput} */inputSourceMap) :
// eslint-disable-next-line no-undefined
undefined,
// eslint-disable-next-line no-undefined
hasSourceMap ? compilation.requestShortener : undefined));
item => TerserPlugin.buildError(item, name, hasSourceMap ? new (getTraceMapping().TraceMap)( /** @type {RawSourceMap} */
inputSourceMap) : undefined, hasSourceMap ? compilation.requestShortener : undefined));
}
let shebang;
if ( /** @type {ExtractCommentsObject} */
this.options.extractComments.banner !== false && output.extractedComments && output.extractedComments.length > 0 && output.code.startsWith("#!")) {
const firstNewlinePosition = output.code.indexOf("\n");
shebang = output.code.substring(0, firstNewlinePosition);
output.code = output.code.substring(firstNewlinePosition + 1);
}
if (output.map) {
output.source = new SourceMapSource(output.code, name, output.map, input, /** @type {SourceMapInput} */inputSourceMap, true);
} else {
output.source = new RawSource(output.code);
}
if (output.extractedComments && output.extractedComments.length > 0) {
const commentsFilename = /** @type {ExtractCommentsObject} */
this.options.extractComments.filename || "[file].LICENSE.txt[query]";
let query = "";
let filename = name;
const querySplit = filename.indexOf("?");
if (querySplit >= 0) {
query = filename.slice(querySplit);
filename = filename.slice(0, querySplit);
}
const lastSlashIndex = filename.lastIndexOf("/");
const basename = lastSlashIndex === -1 ? filename : filename.slice(lastSlashIndex + 1);
const data = {
filename,
basename,
query
};
output.commentsFilename = compilation.getPath(commentsFilename, data);
let banner;
// Add a banner to the original file
if (output.code) {
let shebang;
if ( /** @type {ExtractCommentsObject} */
this.options.extractComments.banner !== false) {
banner = /** @type {ExtractCommentsObject} */
this.options.extractComments.banner || `For license information please see ${path.relative(path.dirname(name), output.commentsFilename).replace(/\\/g, "/")}`;
if (typeof banner === "function") {
banner = banner(output.commentsFilename);
}
if (banner) {
output.source = new ConcatSource(shebang ? `${shebang}\n` : "", `/*! ${banner} */\n`, output.source);
}
this.options.extractComments.banner !== false && output.extractedComments && output.extractedComments.length > 0 && output.code.startsWith("#!")) {
const firstNewlinePosition = output.code.indexOf("\n");
shebang = output.code.slice(0, Math.max(0, firstNewlinePosition));
output.code = output.code.slice(Math.max(0, firstNewlinePosition + 1));
}
if (output.map) {
output.source = new SourceMapSource(output.code, name, output.map, input, /** @type {RawSourceMap} */
inputSourceMap, true);
} else {
output.source = new RawSource(output.code);
}
if (output.extractedComments && output.extractedComments.length > 0) {
const commentsFilename = /** @type {ExtractCommentsObject} */
this.options.extractComments.filename || "[file].LICENSE.txt[query]";
let query = "";
let filename = name;
const querySplit = filename.indexOf("?");
if (querySplit >= 0) {
query = filename.slice(querySplit);
filename = filename.slice(0, querySplit);
}
const lastSlashIndex = filename.lastIndexOf("/");
const basename = lastSlashIndex === -1 ? filename : filename.slice(lastSlashIndex + 1);
const data = {
filename,
basename,
query
};
output.commentsFilename = compilation.getPath(commentsFilename, data);
let banner;
// Add a banner to the original file
if ( /** @type {ExtractCommentsObject} */
this.options.extractComments.banner !== false) {
banner = /** @type {ExtractCommentsObject} */
this.options.extractComments.banner || `For license information please see ${path.relative(path.dirname(name), output.commentsFilename).replace(/\\/g, "/")}`;
if (typeof banner === "function") {
banner = banner(output.commentsFilename);
}
if (banner) {
output.source = new ConcatSource(shebang ? `${shebang}\n` : "", `/*! ${banner} */\n`, output.source);
}
}
const extractedCommentsString = output.extractedComments.sort().join("\n\n");
output.extractedCommentsSource = new RawSource(`${extractedCommentsString}\n`);
}
const extractedCommentsString = output.extractedComments.sort().join("\n\n");
output.extractedCommentsSource = new RawSource(`${extractedCommentsString}\n`);
}
await cacheItem.storePromise({
source: output.source,
@@ -546,16 +550,19 @@ class TerserPlugin {
}
if (output.warnings && output.warnings.length > 0) {
for (const warning of output.warnings) {
compilation.warnings.push( /** @type {WebpackError} */warning);
compilation.warnings.push(warning);
}
}
if (output.errors && output.errors.length > 0) {
for (const error of output.errors) {
compilation.errors.push( /** @type {WebpackError} */error);
compilation.errors.push(error);
}
}
if (!output.source) {
return;
}
/** @type {Record<string, any>} */
/** @type {AssetInfo} */
const newInfo = {
minimized: true
};
@@ -586,15 +593,15 @@ class TerserPlugin {
await initializedWorker.end();
}
/** @typedef {{ source: import("webpack").sources.Source, commentsFilename: string, from: string }} ExtractedCommentsInfoWIthFrom */
await Array.from(allExtractedComments).sort().reduce(
/** @typedef {{ source: import("webpack").sources.Source, commentsFilename: string, from: string }} ExtractedCommentsInfoWithFrom */
await [...allExtractedComments].sort().reduce(
/**
* @param {Promise<unknown>} previousPromise
* @param {[string, ExtractedCommentsInfo]} extractedComments
* @returns {Promise<ExtractedCommentsInfoWIthFrom>}
* @param {Promise<unknown>} previousPromise previous result
* @param {[string, ExtractedCommentsInfo]} extractedComments extracted comments
* @returns {Promise<ExtractedCommentsInfoWithFrom>} extract comments with info
*/
async (previousPromise, [from, value]) => {
const previous = /** @type {ExtractedCommentsInfoWIthFrom | undefined} **/
const previous = /** @type {ExtractedCommentsInfoWithFrom | undefined} * */
await previousPromise;
const {
commentsFilename,
@@ -610,7 +617,7 @@ class TerserPlugin {
const eTag = [prevSource, extractedCommentsSource].map(item => cache.getLazyHashedEtag(item)).reduce((previousValue, currentValue) => cache.mergeEtags(previousValue, currentValue));
let source = await cache.getPromise(name, eTag);
if (!source) {
source = new ConcatSource(Array.from(new Set([... /** @type {string}*/prevSource.source().split("\n\n"), ... /** @type {string}*/extractedCommentsSource.source().split("\n\n")])).join("\n\n"));
source = new ConcatSource([...new Set([... /** @type {string} */prevSource.source().split("\n\n"), ... /** @type {string} */extractedCommentsSource.source().split("\n\n")])].join("\n\n"));
await cache.storePromise(name, eTag, source);
}
compilation.updateAsset(commentsFilename, source);
@@ -641,8 +648,8 @@ class TerserPlugin {
/**
* @private
* @param {any} environment
* @returns {number}
* @param {NonNullable<NonNullable<Configuration["output"]>["environment"]>} environment environment
* @returns {number} ecma version
*/
static getEcmaVersion(environment) {
// ES 6th
@@ -658,7 +665,7 @@ class TerserPlugin {
}
/**
* @param {Compiler} compiler
* @param {Compiler} compiler compiler
* @returns {void}
*/
apply(compiler) {
@@ -685,7 +692,7 @@ class TerserPlugin {
stats.hooks.print.for("asset.info.minimized").tap("terser-webpack-plugin", (minimized, {
green,
formatFlag
}) => minimized ? /** @type {Function} */green( /** @type {Function} */formatFlag("minimized")) : "");
}) => minimized ? /** @type {(text: string) => string} */green( /** @type {(flag: string) => string} */formatFlag("minimized")) : "");
});
});
}

15
node_modules/terser-webpack-plugin/dist/minify.js generated vendored Executable file → Normal file
View File

@@ -5,8 +5,8 @@
/**
* @template T
* @param {import("./index.js").InternalOptions<T>} options
* @returns {Promise<MinimizedResult>}
* @param {import("./index.js").InternalOptions<T>} options options
* @returns {Promise<MinimizedResult>} minified result
*/
async function minify(options) {
const {
@@ -25,21 +25,22 @@ async function minify(options) {
}
/**
* @param {string} options
* @returns {Promise<MinimizedResult>}
* @param {string} options options
* @returns {Promise<MinimizedResult>} minified result
*/
async function transform(options) {
// 'use strict' => this === undefined (Clean Scope)
// Safer for possible security issues, albeit not critical at all here
// eslint-disable-next-line no-param-reassign
const evaluatedOptions =
/**
* @template T
* @type {import("./index.js").InternalOptions<T>}
* */
*/
// eslint-disable-next-line no-new-func
new Function("exports", "require", "module", "__filename", "__dirname", `'use strict'\nreturn ${options}`)(exports, require, module, __filename, __dirname);
new Function("exports", "require", "module", "__filename", "__dirname", `'use strict'\nreturn ${options}`) // eslint-disable-next-line n/exports-style
(exports, require, module, __filename, __dirname);
return minify(evaluatedOptions);
}
module.exports = {

20
node_modules/terser-webpack-plugin/dist/options.json generated vendored Executable file → Normal file
View File

@@ -39,7 +39,7 @@
"properties": {
"test": {
"description": "Include all modules that pass test assertion.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#test",
"link": "https://github.com/webpack/terser-webpack-plugin#test",
"oneOf": [
{
"$ref": "#/definitions/Rules"
@@ -48,7 +48,7 @@
},
"include": {
"description": "Include all modules matching any of these conditions.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#include",
"link": "https://github.com/webpack/terser-webpack-plugin#include",
"oneOf": [
{
"$ref": "#/definitions/Rules"
@@ -57,7 +57,7 @@
},
"exclude": {
"description": "Exclude all modules matching any of these conditions.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#exclude",
"link": "https://github.com/webpack/terser-webpack-plugin#exclude",
"oneOf": [
{
"$ref": "#/definitions/Rules"
@@ -66,13 +66,13 @@
},
"terserOptions": {
"description": "Options for `terser` (by default) or custom `minify` function.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions",
"link": "https://github.com/webpack/terser-webpack-plugin#terseroptions",
"additionalProperties": true,
"type": "object"
},
"extractComments": {
"description": "Whether comments shall be extracted to a separate file.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#extractcomments",
"link": "https://github.com/webpack/terser-webpack-plugin#extractcomments",
"anyOf": [
{
"type": "boolean"
@@ -107,7 +107,7 @@
}
],
"description": "Condition what comments you need extract.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#condition"
"link": "https://github.com/webpack/terser-webpack-plugin#condition"
},
"filename": {
"anyOf": [
@@ -120,7 +120,7 @@
}
],
"description": "The file where the extracted comments will be stored. Default is to append the suffix .LICENSE.txt to the original filename.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#filename"
"link": "https://github.com/webpack/terser-webpack-plugin#filename"
},
"banner": {
"anyOf": [
@@ -136,7 +136,7 @@
}
],
"description": "The banner text that points to the extracted file and will be added on top of the original file",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#banner"
"link": "https://github.com/webpack/terser-webpack-plugin#banner"
}
},
"type": "object"
@@ -145,7 +145,7 @@
},
"parallel": {
"description": "Use multi-process parallel running to improve the build speed.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#parallel",
"link": "https://github.com/webpack/terser-webpack-plugin#parallel",
"anyOf": [
{
"type": "boolean"
@@ -157,7 +157,7 @@
},
"minify": {
"description": "Allows you to override default minify function.",
"link": "https://github.com/webpack-contrib/terser-webpack-plugin#number",
"link": "https://github.com/webpack/terser-webpack-plugin#number",
"instanceof": "Function"
}
}

363
node_modules/terser-webpack-plugin/dist/utils.js generated vendored Executable file → Normal file
View File

@@ -1,12 +1,12 @@
"use strict";
/** @typedef {import("@jridgewell/trace-mapping").SourceMapInput} SourceMapInput */
/** @typedef {import("./index.js").ExtractCommentsOptions} ExtractCommentsOptions */
/** @typedef {import("./index.js").ExtractCommentsFunction} ExtractCommentsFunction */
/** @typedef {import("./index.js").ExtractCommentsCondition} ExtractCommentsCondition */
/** @typedef {import("./index.js").Input} Input */
/** @typedef {import("./index.js").MinimizedResult} MinimizedResult */
/** @typedef {import("./index.js").CustomOptions} CustomOptions */
/** @typedef {import("./index.js").RawSourceMap} RawSourceMap */
/**
* @template T
@@ -17,7 +17,7 @@
* @typedef {Array<string>} ExtractedComments
*/
const notSettled = Symbol(`not-settled`);
const notSettled = Symbol("not-settled");
/**
* @template T
@@ -27,19 +27,15 @@ const notSettled = Symbol(`not-settled`);
/**
* Run tasks with limited concurrency.
* @template T
* @param {number} limit - Limit of tasks that run at once.
* @param {Task<T>[]} tasks - List of tasks to run.
* @param {number} limit Limit of tasks that run at once.
* @param {Task<T>[]} tasks List of tasks to run.
* @returns {Promise<T[]>} A promise that fulfills to an array of the results
*/
function throttleAll(limit, tasks) {
if (!Number.isInteger(limit) || limit < 1) {
throw new TypeError(`Expected \`limit\` to be a finite number > 0, got \`${limit}\` (${typeof limit})`);
}
if (!Array.isArray(tasks) || !tasks.every(task => typeof task === `function`)) {
throw new TypeError(`Expected \`tasks\` to be a list of functions returning a promise`);
}
return new Promise((resolve, reject) => {
const result = Array(tasks.length).fill(notSettled);
const result = Array.from({
length: tasks.length
}).fill(notSettled);
const entries = tasks.entries();
const next = () => {
const {
@@ -48,46 +44,51 @@ function throttleAll(limit, tasks) {
} = entries.next();
if (done) {
const isLast = !result.includes(notSettled);
if (isLast) resolve( /** @type{T[]} **/result);
if (isLast) resolve(result);
return;
}
const [index, task] = value;
/**
* @param {T} x
* @param {T} resultValue Result value
*/
const onFulfilled = x => {
result[index] = x;
const onFulfilled = resultValue => {
result[index] = resultValue;
next();
};
task().then(onFulfilled, reject);
};
Array(limit).fill(0).forEach(next);
for (let i = 0; i < limit; i++) {
next();
}
});
}
/* istanbul ignore next */
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @param {ExtractCommentsOptions | undefined} extractComments
* @return {Promise<MinimizedResult>}
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @param {ExtractCommentsOptions=} extractComments extract comments option
* @returns {Promise<MinimizedResult>} minimized result
*/
async function terserMinify(input, sourceMap, minimizerOptions, extractComments) {
// eslint-disable-next-line jsdoc/no-restricted-syntax
/**
* @param {any} value
* @returns {boolean}
* @param {unknown} value value
* @returns {value is object} true when value is object or function
*/
const isObject = value => {
const type = typeof value;
// eslint-disable-next-line no-eq-null, eqeqeq
return value != null && (type === "object" || type === "function");
};
/**
* @param {import("terser").MinifyOptions & { sourceMap: undefined } & ({ output: import("terser").FormatOptions & { beautify: boolean } } | { format: import("terser").FormatOptions & { beautify: boolean } })} terserOptions
* @param {ExtractedComments} extractedComments
* @returns {ExtractCommentsFunction}
* @param {import("terser").MinifyOptions & { sourceMap: import("terser").SourceMapOptions | undefined } & ({ output: import("terser").FormatOptions & { beautify: boolean } } | { format: import("terser").FormatOptions & { beautify: boolean } })} terserOptions terser options
* @param {ExtractedComments} extractedComments extracted comments
* @returns {ExtractCommentsFunction} function to extract comments
*/
const buildComments = (terserOptions, extractedComments) => {
/** @type {{ [index: string]: ExtractCommentsCondition }} */
@@ -119,7 +120,7 @@ async function terserMinify(input, sourceMap, minimizerOptions, extractComments)
}
// Ensure that both conditions are functions
["preserve", "extract"].forEach(key => {
for (const key of ["preserve", "extract"]) {
/** @type {undefined | string} */
let regexStr;
/** @type {undefined | RegExp} */
@@ -149,7 +150,7 @@ async function terserMinify(input, sourceMap, minimizerOptions, extractComments)
condition[key] = /** @type {ExtractCommentsFunction} */
(astNode, comment) => /** @type {RegExp} */regex.test(comment.value);
}
});
}
// Redefine the comments function to extract and preserve
// comments according to the two conditions
@@ -168,58 +169,63 @@ async function terserMinify(input, sourceMap, minimizerOptions, extractComments)
};
/**
* @param {PredefinedOptions<import("terser").MinifyOptions> & import("terser").MinifyOptions} [terserOptions={}]
* @returns {import("terser").MinifyOptions & { sourceMap: undefined } & { compress: import("terser").CompressOptions } & ({ output: import("terser").FormatOptions & { beautify: boolean } } | { format: import("terser").FormatOptions & { beautify: boolean } })}
* @param {PredefinedOptions<import("terser").MinifyOptions> & import("terser").MinifyOptions=} terserOptions terser options
* @returns {import("terser").MinifyOptions & { sourceMap: import("terser").SourceMapOptions | undefined } & { compress: import("terser").CompressOptions } & ({ output: import("terser").FormatOptions & { beautify: boolean } } | { format: import("terser").FormatOptions & { beautify: boolean } })} built terser options
*/
const buildTerserOptions = (terserOptions = {}) => {
// Need deep copy objects to avoid https://github.com/terser/terser/issues/366
const buildTerserOptions = (terserOptions = {}) => (
// Need deep copy objects to avoid https://github.com/terser/terser/issues/366
{
...terserOptions,
compress: typeof terserOptions.compress === "boolean" ? terserOptions.compress ? {} : false : {
...terserOptions.compress
},
// ecma: terserOptions.ecma,
// ie8: terserOptions.ie8,
// keep_classnames: terserOptions.keep_classnames,
// keep_fnames: terserOptions.keep_fnames,
mangle:
// eslint-disable-next-line no-eq-null, eqeqeq
terserOptions.mangle == null ? true : typeof terserOptions.mangle === "boolean" ? terserOptions.mangle : {
...terserOptions.mangle
},
// module: terserOptions.module,
// nameCache: { ...terserOptions.toplevel },
// the `output` option is deprecated
...(terserOptions.format ? {
format: {
beautify: false,
...terserOptions.format
}
} : {
output: {
beautify: false,
...terserOptions.output
}
}),
parse: {
...terserOptions.parse
},
// safari10: terserOptions.safari10,
// Ignoring sourceMap from options
sourceMap: undefined
// toplevel: terserOptions.toplevel
});
let minify;
try {
({
minify
} = require("terser"));
} catch (err) {
return {
...terserOptions,
compress: typeof terserOptions.compress === "boolean" ? terserOptions.compress ? {} : false : {
...terserOptions.compress
},
// ecma: terserOptions.ecma,
// ie8: terserOptions.ie8,
// keep_classnames: terserOptions.keep_classnames,
// keep_fnames: terserOptions.keep_fnames,
mangle: terserOptions.mangle == null ? true : typeof terserOptions.mangle === "boolean" ? terserOptions.mangle : {
...terserOptions.mangle
},
// module: terserOptions.module,
// nameCache: { ...terserOptions.toplevel },
// the `output` option is deprecated
...(terserOptions.format ? {
format: {
beautify: false,
...terserOptions.format
}
} : {
output: {
beautify: false,
...terserOptions.output
}
}),
parse: {
...terserOptions.parse
},
// safari10: terserOptions.safari10,
// Ignoring sourceMap from options
// eslint-disable-next-line no-undefined
sourceMap: undefined
// toplevel: terserOptions.toplevel
errors: [( /** @type {Error} */err)]
};
};
}
// eslint-disable-next-line global-require
const {
minify
} = require("terser");
// Copy `terser` options
const terserOptions = buildTerserOptions(minimizerOptions);
// Let terser generate a SourceMap
if (sourceMap) {
// @ts-ignore
terserOptions.sourceMap = {
asObject: true
};
@@ -248,55 +254,55 @@ async function terserMinify(input, sourceMap, minimizerOptions, extractComments)
[filename]: code
}, terserOptions);
return {
code: ( /** @type {string} **/result.code),
// @ts-ignore
// eslint-disable-next-line no-undefined
map: result.map ? ( /** @type {SourceMapInput} **/result.map) : undefined,
code: ( /** @type {string} * */result.code),
map: result.map ? ( /** @type {RawSourceMap} * */result.map) : undefined,
extractedComments
};
}
/**
* @returns {string | undefined}
* @returns {string | undefined} the minimizer version
*/
terserMinify.getMinimizerVersion = () => {
let packageJson;
try {
// eslint-disable-next-line global-require
packageJson = require("terser/package.json");
} catch (error) {
} catch (_err) {
// Ignore
}
return packageJson && packageJson.version;
};
/**
* @returns {boolean | undefined}
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
terserMinify.supportsWorkerThreads = () => true;
/* istanbul ignore next */
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @param {ExtractCommentsOptions | undefined} extractComments
* @return {Promise<MinimizedResult>}
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @param {ExtractCommentsOptions=} extractComments extract comments option
* @returns {Promise<MinimizedResult>} minimized result
*/
async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComments) {
// eslint-disable-next-line jsdoc/no-restricted-syntax
/**
* @param {any} value
* @returns {boolean}
* @param {unknown} value value
* @returns {value is object} true when value is object or function
*/
const isObject = value => {
const type = typeof value;
// eslint-disable-next-line no-eq-null, eqeqeq
return value != null && (type === "object" || type === "function");
};
/**
* @param {import("uglify-js").MinifyOptions & { sourceMap: undefined } & { output: import("uglify-js").OutputOptions & { beautify: boolean }}} uglifyJsOptions
* @param {ExtractedComments} extractedComments
* @returns {ExtractCommentsFunction}
* @param {import("uglify-js").MinifyOptions & { sourceMap: boolean | import("uglify-js").SourceMapOptions | undefined } & { output: import("uglify-js").OutputOptions & { beautify: boolean }}} uglifyJsOptions uglify-js options
* @param {ExtractedComments} extractedComments extracted comments
* @returns {ExtractCommentsFunction} extract comments function
*/
const buildComments = (uglifyJsOptions, extractedComments) => {
/** @type {{ [index: string]: ExtractCommentsCondition }} */
@@ -321,7 +327,7 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
}
// Ensure that both conditions are functions
["preserve", "extract"].forEach(key => {
for (const key of ["preserve", "extract"]) {
/** @type {undefined | string} */
let regexStr;
/** @type {undefined | RegExp} */
@@ -351,7 +357,7 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
condition[key] = /** @type {ExtractCommentsFunction} */
(astNode, comment) => /** @type {RegExp} */regex.test(comment.value);
}
});
}
// Redefine the comments function to extract and preserve
// comments according to the two conditions
@@ -370,14 +376,16 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
};
/**
* @param {PredefinedOptions<import("uglify-js").MinifyOptions> & import("uglify-js").MinifyOptions} [uglifyJsOptions={}]
* @returns {import("uglify-js").MinifyOptions & { sourceMap: undefined } & { output: import("uglify-js").OutputOptions & { beautify: boolean }}}
* @param {PredefinedOptions<import("uglify-js").MinifyOptions> & import("uglify-js").MinifyOptions=} uglifyJsOptions uglify-js options
* @returns {import("uglify-js").MinifyOptions & { sourceMap: boolean | import("uglify-js").SourceMapOptions | undefined } & { output: import("uglify-js").OutputOptions & { beautify: boolean }}} uglify-js options
*/
const buildUglifyJsOptions = (uglifyJsOptions = {}) => {
// eslint-disable-next-line no-param-reassign
delete minimizerOptions.ecma;
// eslint-disable-next-line no-param-reassign
delete minimizerOptions.module;
if (typeof uglifyJsOptions.ecma !== "undefined") {
delete uglifyJsOptions.ecma;
}
if (typeof uglifyJsOptions.module !== "undefined") {
delete uglifyJsOptions.module;
}
// Need deep copy objects to avoid https://github.com/terser/terser/issues/366
return {
@@ -389,7 +397,9 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
compress: typeof uglifyJsOptions.compress === "boolean" ? uglifyJsOptions.compress : {
...uglifyJsOptions.compress
},
mangle: uglifyJsOptions.mangle == null ? true : typeof uglifyJsOptions.mangle === "boolean" ? uglifyJsOptions.mangle : {
mangle:
// eslint-disable-next-line no-eq-null, eqeqeq
uglifyJsOptions.mangle == null ? true : typeof uglifyJsOptions.mangle === "boolean" ? uglifyJsOptions.mangle : {
...uglifyJsOptions.mangle
},
output: {
@@ -397,7 +407,7 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
...uglifyJsOptions.output
},
// Ignoring sourceMap from options
// eslint-disable-next-line no-undefined
sourceMap: undefined
// toplevel: uglifyJsOptions.toplevel
// nameCache: { ...uglifyJsOptions.toplevel },
@@ -405,25 +415,29 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
// keep_fnames: uglifyJsOptions.keep_fnames,
};
};
// eslint-disable-next-line global-require, import/no-extraneous-dependencies
const {
minify
} = require("uglify-js");
let minify;
try {
({
minify
} = require("uglify-js"));
} catch (err) {
return {
errors: [( /** @type {Error} */err)]
};
}
// Copy `uglify-js` options
const uglifyJsOptions = buildUglifyJsOptions(minimizerOptions);
// Let terser generate a SourceMap
if (sourceMap) {
// @ts-ignore
uglifyJsOptions.sourceMap = true;
}
/** @type {ExtractedComments} */
const extractedComments = [];
// @ts-ignore
// @ts-expect-error wrong types in uglify-js
uglifyJsOptions.output.comments = buildComments(uglifyJsOptions, extractedComments);
const [[filename, code]] = Object.entries(input);
const result = await minify({
@@ -431,7 +445,6 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
}, uglifyJsOptions);
return {
code: result.code,
// eslint-disable-next-line no-undefined
map: result.map ? JSON.parse(result.map) : undefined,
errors: result.error ? [result.error] : [],
warnings: result.warnings || [],
@@ -440,65 +453,70 @@ async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComment
}
/**
* @returns {string | undefined}
* @returns {string | undefined} the minimizer version
*/
uglifyJsMinify.getMinimizerVersion = () => {
let packageJson;
try {
// eslint-disable-next-line global-require, import/no-extraneous-dependencies
packageJson = require("uglify-js/package.json");
} catch (error) {
} catch (_err) {
// Ignore
}
return packageJson && packageJson.version;
};
/**
* @returns {boolean | undefined}
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
uglifyJsMinify.supportsWorkerThreads = () => true;
/* istanbul ignore next */
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @return {Promise<MinimizedResult>}
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @returns {Promise<MinimizedResult>} minimized result
*/
async function swcMinify(input, sourceMap, minimizerOptions) {
/**
* @param {PredefinedOptions<import("@swc/core").JsMinifyOptions> & import("@swc/core").JsMinifyOptions} [swcOptions={}]
* @returns {import("@swc/core").JsMinifyOptions & { sourceMap: undefined } & { compress: import("@swc/core").TerserCompressOptions }}
* @param {PredefinedOptions<import("@swc/core").JsMinifyOptions> & import("@swc/core").JsMinifyOptions=} swcOptions swc options
* @returns {import("@swc/core").JsMinifyOptions & { sourceMap: undefined | boolean } & { compress: import("@swc/core").TerserCompressOptions }} built swc options
*/
const buildSwcOptions = (swcOptions = {}) => {
// Need deep copy objects to avoid https://github.com/terser/terser/issues/366
return {
...swcOptions,
compress: typeof swcOptions.compress === "boolean" ? swcOptions.compress ? {} : false : {
...swcOptions.compress
},
mangle: swcOptions.mangle == null ? true : typeof swcOptions.mangle === "boolean" ? swcOptions.mangle : {
...swcOptions.mangle
},
// ecma: swcOptions.ecma,
// keep_classnames: swcOptions.keep_classnames,
// keep_fnames: swcOptions.keep_fnames,
// module: swcOptions.module,
// safari10: swcOptions.safari10,
// toplevel: swcOptions.toplevel
// eslint-disable-next-line no-undefined
sourceMap: undefined
};
};
const buildSwcOptions = (swcOptions = {}) => (
// Need deep copy objects to avoid https://github.com/terser/terser/issues/366
{
...swcOptions,
compress: typeof swcOptions.compress === "boolean" ? swcOptions.compress ? {} : false : {
...swcOptions.compress
},
mangle:
// eslint-disable-next-line no-eq-null, eqeqeq
swcOptions.mangle == null ? true : typeof swcOptions.mangle === "boolean" ? swcOptions.mangle : {
...swcOptions.mangle
},
// ecma: swcOptions.ecma,
// keep_classnames: swcOptions.keep_classnames,
// keep_fnames: swcOptions.keep_fnames,
// module: swcOptions.module,
// safari10: swcOptions.safari10,
// toplevel: swcOptions.toplevel
sourceMap: undefined
});
let swc;
try {
swc = require("@swc/core");
} catch (err) {
return {
errors: [( /** @type {Error} */err)]
};
}
// eslint-disable-next-line import/no-extraneous-dependencies, global-require
const swc = require("@swc/core");
// Copy `swc` options
const swcOptions = buildSwcOptions(minimizerOptions);
// Let `swc` generate a SourceMap
if (sourceMap) {
// @ts-ignore
swcOptions.sourceMap = true;
}
if (swcOptions.compress) {
@@ -529,45 +547,40 @@ async function swcMinify(input, sourceMap, minimizerOptions) {
}
/**
* @returns {string | undefined}
* @returns {string | undefined} the minimizer version
*/
swcMinify.getMinimizerVersion = () => {
let packageJson;
try {
// eslint-disable-next-line global-require, import/no-extraneous-dependencies
packageJson = require("@swc/core/package.json");
} catch (error) {
} catch (_err) {
// Ignore
}
return packageJson && packageJson.version;
};
/**
* @returns {boolean | undefined}
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
swcMinify.supportsWorkerThreads = () => false;
/* istanbul ignore next */
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @return {Promise<MinimizedResult>}
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @returns {Promise<MinimizedResult>} minimized result
*/
async function esbuildMinify(input, sourceMap, minimizerOptions) {
/**
* @param {PredefinedOptions<import("esbuild").TransformOptions> & import("esbuild").TransformOptions} [esbuildOptions={}]
* @returns {import("esbuild").TransformOptions}
* @param {PredefinedOptions<import("esbuild").TransformOptions> & import("esbuild").TransformOptions=} esbuildOptions esbuild options
* @returns {import("esbuild").TransformOptions} built esbuild options
*/
const buildEsbuildOptions = (esbuildOptions = {}) => {
// eslint-disable-next-line no-param-reassign
delete esbuildOptions.ecma;
if (esbuildOptions.module) {
// eslint-disable-next-line no-param-reassign
esbuildOptions.format = "esm";
}
// eslint-disable-next-line no-param-reassign
delete esbuildOptions.module;
// Need deep copy objects to avoid https://github.com/terser/terser/issues/366
@@ -578,9 +591,14 @@ async function esbuildMinify(input, sourceMap, minimizerOptions) {
sourcemap: false
};
};
// eslint-disable-next-line import/no-extraneous-dependencies, global-require
const esbuild = require("esbuild");
let esbuild;
try {
esbuild = require("esbuild");
} catch (err) {
return {
errors: [( /** @type {Error} */err)]
};
}
// Copy `esbuild` options
const esbuildOptions = buildEsbuildOptions(minimizerOptions);
@@ -595,7 +613,6 @@ async function esbuildMinify(input, sourceMap, minimizerOptions) {
const result = await esbuild.transform(code, esbuildOptions);
return {
code: result.code,
// eslint-disable-next-line no-undefined
map: result.map ? JSON.parse(result.map) : undefined,
warnings: result.warnings.length > 0 ? result.warnings.map(item => {
const plugin = item.pluginName ? `\nPlugin Name: ${item.pluginName}` : "";
@@ -607,28 +624,32 @@ async function esbuildMinify(input, sourceMap, minimizerOptions) {
}
/**
* @returns {string | undefined}
* @returns {string | undefined} the minimizer version
*/
esbuildMinify.getMinimizerVersion = () => {
let packageJson;
try {
// eslint-disable-next-line global-require, import/no-extraneous-dependencies
packageJson = require("esbuild/package.json");
} catch (error) {
} catch (_err) {
// Ignore
}
return packageJson && packageJson.version;
};
/**
* @returns {boolean | undefined}
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
esbuildMinify.supportsWorkerThreads = () => false;
/**
* @template T
* @param fn {(function(): any) | undefined}
* @returns {function(): T}
* @typedef {() => T} FunctionReturning
*/
/**
* @template T
* @param {FunctionReturning<T>} fn memorized function
* @returns {FunctionReturning<T>} new function
*/
function memoize(fn) {
let cache = false;
@@ -638,20 +659,20 @@ function memoize(fn) {
if (cache) {
return result;
}
result = /** @type {function(): any} */fn();
result = fn();
cache = true;
// Allow to clean up memory for fn
// and all dependent resources
// eslint-disable-next-line no-undefined, no-param-reassign
/** @type {FunctionReturning<T> | undefined} */
fn = undefined;
return result;
return /** @type {T} */result;
};
}
module.exports = {
throttleAll,
esbuildMinify,
memoize,
terserMinify,
uglifyJsMinify,
swcMinify,
esbuildMinify
terserMinify,
throttleAll,
uglifyJsMinify
};

209
node_modules/terser-webpack-plugin/package.json generated vendored Executable file → Normal file
View File

@@ -1,105 +1,7 @@
{
"name": "terser-webpack-plugin",
"version": "5.3.14",
"version": "5.3.15",
"description": "Terser plugin for webpack",
"license": "MIT",
"repository": "webpack-contrib/terser-webpack-plugin",
"author": "webpack Contrib Team",
"homepage": "https://github.com/webpack-contrib/terser-webpack-plugin",
"bugs": "https://github.com/webpack-contrib/terser-webpack-plugin/issues",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"main": "dist/index.js",
"types": "types/index.d.ts",
"engines": {
"node": ">= 10.13.0"
},
"scripts": {
"clean": "del-cli dist types",
"prebuild": "npm run clean",
"build:types": "tsc --declaration --emitDeclarationOnly --outDir types && prettier \"types/**/*.ts\" --write",
"build:code": "cross-env NODE_ENV=production babel src -d dist --copy-files",
"build": "npm-run-all -p \"build:**\"",
"commitlint": "commitlint --from=master",
"security": "npm audit --production",
"lint:prettier": "prettier --list-different .",
"lint:js": "eslint --cache .",
"lint:spelling": "cspell \"**/*.*\"",
"lint:types": "tsc --pretty --noEmit",
"lint": "npm-run-all -l -p \"lint:**\"",
"fix:js": "npm run lint:js -- --fix",
"fix:prettier": "npm run lint:prettier -- --write",
"fix": "npm-run-all -l fix:js fix:prettier",
"test:only": "cross-env NODE_ENV=test jest",
"test:watch": "npm run test:only -- --watch",
"test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage",
"pretest": "npm run lint",
"test": "npm run test:coverage",
"prepare": "husky install && npm run build",
"release": "standard-version"
},
"files": [
"dist",
"types"
],
"peerDependencies": {
"webpack": "^5.1.0"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"uglify-js": {
"optional": true
},
"esbuild": {
"optional": true
}
},
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
"serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
},
"devDependencies": {
"@babel/cli": "^7.24.7",
"@babel/core": "^7.24.7",
"@babel/preset-env": "^7.24.7",
"@commitlint/cli": "^17.7.1",
"@commitlint/config-conventional": "^17.7.0",
"@swc/core": "^1.3.102",
"@types/node": "^18.15.11",
"@types/serialize-javascript": "^5.0.2",
"@types/uglify-js": "^3.17.5",
"@webpack-contrib/eslint-config-webpack": "^3.0.0",
"babel-jest": "^28.1.2",
"copy-webpack-plugin": "^9.0.1",
"cross-env": "^7.0.3",
"cspell": "^6.31.2",
"del": "^6.0.0",
"del-cli": "^3.0.1",
"esbuild": "^0.19.11",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.9.0",
"eslint-plugin-import": "^2.28.1",
"file-loader": "^6.2.0",
"husky": "^7.0.2",
"jest": "^27.5.1",
"lint-staged": "^13.2.3",
"memfs": "^3.4.13",
"npm-run-all": "^4.1.5",
"prettier": "^2.8.7",
"standard-version": "^9.3.1",
"typescript": "^4.9.5",
"uglify-js": "^3.18.0",
"webpack": "^5.92.1",
"webpack-cli": "^4.10.0",
"worker-loader": "^3.0.8"
},
"keywords": [
"uglify",
"uglify-js",
@@ -116,5 +18,112 @@
"minify",
"optimize",
"optimizer"
]
],
"homepage": "https://github.com/webpack/terser-webpack-plugin",
"bugs": "https://github.com/webpack/terser-webpack-plugin/issues",
"repository": "webpack/terser-webpack-plugin",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"license": "MIT",
"author": "webpack Contrib Team",
"main": "dist/index.js",
"types": "types/index.d.ts",
"files": [
"dist",
"types"
],
"scripts": {
"clean": "del-cli dist types",
"prebuild": "npm run clean",
"build:types": "tsc --declaration --emitDeclarationOnly --outDir types && prettier \"types/**/*.ts\" --write",
"build:code": "cross-env NODE_ENV=production babel src -d dist --copy-files",
"build": "npm-run-all -p \"build:**\"",
"commitlint": "commitlint --from=main",
"security": "npm audit --production",
"lint:prettier": "prettier --list-different .",
"lint:code": "eslint --cache .",
"lint:spelling": "cspell \"**/*.*\"",
"lint:types": "tsc --pretty --noEmit",
"lint": "npm-run-all -l -p \"lint:**\"",
"fix:code": "npm run lint:code -- --fix",
"fix:prettier": "npm run lint:prettier -- --write",
"fix": "npm-run-all -l fix:code fix:prettier",
"test:only": "cross-env NODE_ENV=test jest",
"test:watch": "npm run test:only -- --watch",
"test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage",
"pretest": "npm run lint",
"test": "npm run test:coverage",
"prepare": "husky install && npm run build",
"release": "standard-version"
},
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
"serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
},
"devDependencies": {
"@babel/cli": "^7.24.7",
"@babel/core": "^7.24.7",
"@babel/preset-env": "^7.24.7",
"@commitlint/cli": "^17.7.1",
"@commitlint/config-conventional": "^17.7.0",
"@eslint/js": "^9.29.0",
"@eslint/markdown": "^7.1.0",
"@stylistic/eslint-plugin": "^5.2.2",
"@swc/core": "^1.3.102",
"@types/node": "^24.2.1",
"@types/serialize-javascript": "^5.0.2",
"@types/uglify-js": "^3.17.5",
"copy-webpack-plugin": "^9.0.1",
"cross-env": "^7.0.3",
"cspell": "^6.31.2",
"del": "^6.0.0",
"del-cli": "^3.0.1",
"esbuild": "^0.25.0",
"eslint": "^9.29.0",
"eslint-config-prettier": "^10.1.1",
"eslint-config-webpack": "^4.5.1",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jest": "^29.0.1",
"eslint-plugin-jsdoc": "^54.0.0",
"eslint-plugin-n": "^17.21.0",
"eslint-plugin-prettier": "^5.5.0",
"eslint-plugin-unicorn": "^60.0.0",
"file-loader": "^6.2.0",
"husky": "^7.0.2",
"jest": "^27.5.1",
"lint-staged": "^13.2.3",
"memfs": "^3.4.13",
"npm-run-all": "^4.1.5",
"prettier": "^3.6.0",
"prettier-2": "npm:prettier@^2",
"standard-version": "^9.3.1",
"typescript": "^5.9.2",
"typescript-eslint": "^8.39.1",
"uglify-js": "^3.19.3",
"webpack": "^5.101.0",
"webpack-cli": "^4.10.0",
"worker-loader": "^3.0.8"
},
"peerDependencies": {
"webpack": "^5.1.0"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"uglify-js": {
"optional": true
},
"esbuild": {
"optional": true
}
},
"engines": {
"node": ">= 10.13.0"
}
}

216
node_modules/terser-webpack-plugin/types/index.d.ts generated vendored Executable file → Normal file
View File

@@ -5,45 +5,45 @@ export = TerserPlugin;
declare class TerserPlugin<T = import("terser").MinifyOptions> {
/**
* @private
* @param {any} input
* @returns {boolean}
* @param {unknown} input Input to check
* @returns {boolean} Whether input is a source map
*/
private static isSourceMap;
/**
* @private
* @param {unknown} warning
* @param {string} file
* @returns {Error}
* @param {unknown} warning warning
* @param {string} file file
* @returns {Error} built warning
*/
private static buildWarning;
/**
* @private
* @param {any} error
* @param {string} file
* @param {TraceMap} [sourceMap]
* @param {Compilation["requestShortener"]} [requestShortener]
* @returns {Error}
* @param {Error | ErrorObject | string} error error
* @param {string} file file
* @param {TraceMap=} sourceMap source map
* @param {Compilation["requestShortener"]=} requestShortener request shortener
* @returns {Error} built error
*/
private static buildError;
/**
* @private
* @param {Parallel} parallel
* @returns {number}
* @param {Parallel} parallel value of the `parallel` option
* @returns {number} number of cores for parallelism
*/
private static getAvailableNumberOfCores;
/**
* @private
* @param {any} environment
* @returns {number}
* @param {NonNullable<NonNullable<Configuration["output"]>["environment"]>} environment environment
* @returns {number} ecma version
*/
private static getEcmaVersion;
/**
* @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions<T>} [options]
* @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions<T>=} options options
*/
constructor(
options?:
| (BasePluginOptions & DefinedDefaultMinimizerAndOptions<T>)
| undefined
| undefined,
);
/**
* @private
@@ -52,15 +52,15 @@ declare class TerserPlugin<T = import("terser").MinifyOptions> {
private options;
/**
* @private
* @param {Compiler} compiler
* @param {Compilation} compilation
* @param {Record<string, import("webpack").sources.Source>} assets
* @param {{availableNumberOfCores: number}} optimizeOptions
* @param {Compiler} compiler compiler
* @param {Compilation} compilation compilation
* @param {Record<string, import("webpack").sources.Source>} assets assets
* @param {{ availableNumberOfCores: number }} optimizeOptions optimize options
* @returns {Promise<void>}
*/
private optimize;
/**
* @param {Compiler} compiler
* @param {Compiler} compiler compiler
* @returns {void}
*/
apply(compiler: Compiler): void;
@@ -74,10 +74,11 @@ declare namespace TerserPlugin {
Schema,
Compiler,
Compilation,
WebpackError,
Configuration,
Asset,
AssetInfo,
JestWorker,
SourceMapInput,
RawSourceMap,
TraceMap,
Rule,
Rules,
@@ -87,6 +88,7 @@ declare namespace TerserPlugin {
ExtractCommentsBanner,
ExtractCommentsObject,
ExtractCommentsOptions,
ErrorObject,
MinimizedResult,
Input,
CustomOptions,
@@ -104,34 +106,22 @@ declare namespace TerserPlugin {
InternalPluginOptions,
};
}
type Compiler = import("webpack").Compiler;
type BasePluginOptions = {
test?: Rules | undefined;
include?: Rules | undefined;
exclude?: Rules | undefined;
extractComments?: ExtractCommentsOptions | undefined;
parallel?: Parallel;
};
type DefinedDefaultMinimizerAndOptions<T> =
T extends import("terser").MinifyOptions
? {
minify?: MinimizerImplementation<T> | undefined;
terserOptions?: MinimizerOptions<T> | undefined;
}
: {
minify: MinimizerImplementation<T>;
terserOptions?: MinimizerOptions<T> | undefined;
};
import { terserMinify } from "./utils";
import { uglifyJsMinify } from "./utils";
import { swcMinify } from "./utils";
import { esbuildMinify } from "./utils";
type Schema = import("schema-utils/declarations/validate").Schema;
type Compiler = import("webpack").Compiler;
type Compilation = import("webpack").Compilation;
type WebpackError = import("webpack").WebpackError;
type Configuration = import("webpack").Configuration;
type Asset = import("webpack").Asset;
type AssetInfo = import("webpack").AssetInfo;
type JestWorker = import("jest-worker").Worker;
type SourceMapInput = import("@jridgewell/trace-mapping").SourceMapInput;
type RawSourceMap = import("@jridgewell/trace-mapping").EncodedSourceMap & {
sources: string[];
sourcesContent?: string[];
file: string;
};
type TraceMap = import("@jridgewell/trace-mapping").TraceMap;
type Rule = RegExp | string;
type Rules = Rule[] | Rule;
@@ -143,7 +133,7 @@ type ExtractCommentsFunction = (
pos: number;
line: number;
col: number;
}
},
) => boolean;
type ExtractCommentsCondition =
| boolean
@@ -153,21 +143,63 @@ type ExtractCommentsCondition =
| ExtractCommentsFunction;
type ExtractCommentsFilename = string | ((fileData: any) => string);
type ExtractCommentsBanner =
| string
| boolean
| string
| ((commentsFile: string) => string);
type ExtractCommentsObject = {
/**
* condition which comments need to be expected
*/
condition?: ExtractCommentsCondition | undefined;
/**
* filename for extracted comments
*/
filename?: ExtractCommentsFilename | undefined;
/**
* banner in filename for extracted comments
*/
banner?: ExtractCommentsBanner | undefined;
};
type ExtractCommentsOptions = ExtractCommentsCondition | ExtractCommentsObject;
type ErrorObject = {
/**
* message
*/
message: string;
/**
* line number
*/
line?: number | undefined;
/**
* column number
*/
column?: number | undefined;
/**
* error stack trace
*/
stack?: string | undefined;
};
type MinimizedResult = {
code: string;
map?: import("@jridgewell/trace-mapping").SourceMapInput | undefined;
errors?: (string | Error)[] | undefined;
warnings?: (string | Error)[] | undefined;
extractedComments?: string[] | undefined;
/**
* code
*/
code?: string | undefined;
/**
* source map
*/
map?: RawSourceMap | undefined;
/**
* errors
*/
errors?: Array<Error | string> | undefined;
/**
* warnings
*/
warnings?: Array<Error | string> | undefined;
/**
* extracted comments
*/
extractedComments?: Array<string> | undefined;
};
type Input = {
[file: string]: string;
@@ -177,53 +209,111 @@ type CustomOptions = {
};
type InferDefaultType<T> = T extends infer U ? U : CustomOptions;
type PredefinedOptions<T> = {
/**
* true when code is a EC module, otherwise false
*/
module?:
| (T extends {
module?: infer P | undefined;
module?: infer P;
}
? P
: string | boolean)
: boolean | string)
| undefined;
/**
* ecma version
*/
ecma?:
| (T extends {
ecma?: infer P_1 | undefined;
ecma?: infer P;
}
? P_1
: string | number)
? P
: number | string)
| undefined;
};
type MinimizerOptions<T> = PredefinedOptions<T> & InferDefaultType<T>;
type BasicMinimizerImplementation<T> = (
input: Input,
sourceMap: SourceMapInput | undefined,
sourceMap: RawSourceMap | undefined,
minifyOptions: MinimizerOptions<T>,
extractComments: ExtractCommentsOptions | undefined
) => Promise<MinimizedResult>;
extractComments: ExtractCommentsOptions | undefined,
) => Promise<MinimizedResult> | MinimizedResult;
type MinimizeFunctionHelpers = {
/**
* function that returns version of minimizer
*/
getMinimizerVersion?: (() => string | undefined) | undefined;
/**
* true when minimizer support worker threads, otherwise false
*/
supportsWorkerThreads?: (() => boolean | undefined) | undefined;
};
type MinimizerImplementation<T> = BasicMinimizerImplementation<T> &
MinimizeFunctionHelpers;
type InternalOptions<T> = {
/**
* name
*/
name: string;
/**
* input
*/
input: string;
inputSourceMap: SourceMapInput | undefined;
/**
* input source map
*/
inputSourceMap: RawSourceMap | undefined;
/**
* extract comments option
*/
extractComments: ExtractCommentsOptions | undefined;
/**
* minimizer
*/
minimizer: {
implementation: MinimizerImplementation<T>;
options: MinimizerOptions<T>;
};
};
type MinimizerWorker<T> = import("jest-worker").Worker & {
transform: (options: string) => MinimizedResult;
minify: (options: InternalOptions<T>) => MinimizedResult;
type MinimizerWorker<T> = JestWorker & {
transform: (options: string) => Promise<MinimizedResult>;
minify: (options: InternalOptions<T>) => Promise<MinimizedResult>;
};
type Parallel = undefined | boolean | number;
type BasePluginOptions = {
/**
* test rule
*/
test?: Rules | undefined;
/**
* include rile
*/
include?: Rules | undefined;
/**
* exclude rule
*/
exclude?: Rules | undefined;
/**
* extract comments options
*/
extractComments?: ExtractCommentsOptions | undefined;
/**
* parallel option
*/
parallel?: Parallel | undefined;
};
type DefinedDefaultMinimizerAndOptions<T> =
T extends import("terser").MinifyOptions
? {
minify?: MinimizerImplementation<T> | undefined;
terserOptions?: MinimizerOptions<T> | undefined;
}
: {
minify: MinimizerImplementation<T>;
terserOptions?: MinimizerOptions<T> | undefined;
};
type InternalPluginOptions<T> = BasePluginOptions & {
minimizer: {
implementation: MinimizerImplementation<T>;
options: MinimizerOptions<T>;
};
};
import { minify } from "./minify";

10
node_modules/terser-webpack-plugin/types/minify.d.ts generated vendored Executable file → Normal file
View File

@@ -4,14 +4,14 @@ export type CustomOptions = import("./index.js").CustomOptions;
/** @typedef {import("./index.js").CustomOptions} CustomOptions */
/**
* @template T
* @param {import("./index.js").InternalOptions<T>} options
* @returns {Promise<MinimizedResult>}
* @param {import("./index.js").InternalOptions<T>} options options
* @returns {Promise<MinimizedResult>} minified result
*/
export function minify<T>(
options: import("./index.js").InternalOptions<T>
options: import("./index.js").InternalOptions<T>,
): Promise<MinimizedResult>;
/**
* @param {string} options
* @returns {Promise<MinimizedResult>}
* @param {string} options options
* @returns {Promise<MinimizedResult>} minified result
*/
export function transform(options: string): Promise<MinimizedResult>;

173
node_modules/terser-webpack-plugin/types/utils.d.ts generated vendored Executable file → Normal file
View File

@@ -1,5 +1,5 @@
export type Task<T> = () => Promise<T>;
export type SourceMapInput = import("@jridgewell/trace-mapping").SourceMapInput;
export type FunctionReturning<T> = () => T;
export type ExtractCommentsOptions =
import("./index.js").ExtractCommentsOptions;
export type ExtractCommentsFunction =
@@ -9,8 +9,84 @@ export type ExtractCommentsCondition =
export type Input = import("./index.js").Input;
export type MinimizedResult = import("./index.js").MinimizedResult;
export type CustomOptions = import("./index.js").CustomOptions;
export type RawSourceMap = import("./index.js").RawSourceMap;
export type PredefinedOptions<T> = import("./index.js").PredefinedOptions<T>;
export type ExtractedComments = Array<string>;
/**
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @returns {Promise<MinimizedResult>} minimized result
*/
export function esbuildMinify(
input: Input,
sourceMap?: RawSourceMap | undefined,
minimizerOptions?: CustomOptions | undefined,
): Promise<MinimizedResult>;
export namespace esbuildMinify {
/**
* @returns {string | undefined} the minimizer version
*/
function getMinimizerVersion(): string | undefined;
/**
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
function supportsWorkerThreads(): boolean | undefined;
}
/**
* @template T
* @typedef {() => T} FunctionReturning
*/
/**
* @template T
* @param {FunctionReturning<T>} fn memorized function
* @returns {FunctionReturning<T>} new function
*/
export function memoize<T>(fn: FunctionReturning<T>): FunctionReturning<T>;
/**
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @returns {Promise<MinimizedResult>} minimized result
*/
export function swcMinify(
input: Input,
sourceMap?: RawSourceMap | undefined,
minimizerOptions?: CustomOptions | undefined,
): Promise<MinimizedResult>;
export namespace swcMinify {
/**
* @returns {string | undefined} the minimizer version
*/
function getMinimizerVersion(): string | undefined;
/**
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
function supportsWorkerThreads(): boolean | undefined;
}
/**
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @param {ExtractCommentsOptions=} extractComments extract comments option
* @returns {Promise<MinimizedResult>} minimized result
*/
export function terserMinify(
input: Input,
sourceMap?: RawSourceMap | undefined,
minimizerOptions?: CustomOptions | undefined,
extractComments?: ExtractCommentsOptions | undefined,
): Promise<MinimizedResult>;
export namespace terserMinify {
/**
* @returns {string | undefined} the minimizer version
*/
function getMinimizerVersion(): string | undefined;
/**
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
function supportsWorkerThreads(): boolean | undefined;
}
/**
* @template T
* @typedef {() => Promise<T>} Task
@@ -18,102 +94,31 @@ export type ExtractedComments = Array<string>;
/**
* Run tasks with limited concurrency.
* @template T
* @param {number} limit - Limit of tasks that run at once.
* @param {Task<T>[]} tasks - List of tasks to run.
* @param {number} limit Limit of tasks that run at once.
* @param {Task<T>[]} tasks List of tasks to run.
* @returns {Promise<T[]>} A promise that fulfills to an array of the results
*/
export function throttleAll<T>(limit: number, tasks: Task<T>[]): Promise<T[]>;
/**
* @template T
* @param fn {(function(): any) | undefined}
* @returns {function(): T}
*/
export function memoize<T>(fn: (() => any) | undefined): () => T;
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @param {ExtractCommentsOptions | undefined} extractComments
* @return {Promise<MinimizedResult>}
*/
export function terserMinify(
input: Input,
sourceMap: SourceMapInput | undefined,
minimizerOptions: CustomOptions,
extractComments: ExtractCommentsOptions | undefined
): Promise<MinimizedResult>;
export namespace terserMinify {
/**
* @returns {string | undefined}
*/
function getMinimizerVersion(): string | undefined;
/**
* @returns {boolean | undefined}
*/
function supportsWorkerThreads(): boolean | undefined;
}
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @param {ExtractCommentsOptions | undefined} extractComments
* @return {Promise<MinimizedResult>}
* @param {Input} input input
* @param {RawSourceMap=} sourceMap source map
* @param {CustomOptions=} minimizerOptions options
* @param {ExtractCommentsOptions=} extractComments extract comments option
* @returns {Promise<MinimizedResult>} minimized result
*/
export function uglifyJsMinify(
input: Input,
sourceMap: SourceMapInput | undefined,
minimizerOptions: CustomOptions,
extractComments: ExtractCommentsOptions | undefined
sourceMap?: RawSourceMap | undefined,
minimizerOptions?: CustomOptions | undefined,
extractComments?: ExtractCommentsOptions | undefined,
): Promise<MinimizedResult>;
export namespace uglifyJsMinify {
/**
* @returns {string | undefined}
* @returns {string | undefined} the minimizer version
*/
function getMinimizerVersion(): string | undefined;
/**
* @returns {boolean | undefined}
*/
function supportsWorkerThreads(): boolean | undefined;
}
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @return {Promise<MinimizedResult>}
*/
export function swcMinify(
input: Input,
sourceMap: SourceMapInput | undefined,
minimizerOptions: CustomOptions
): Promise<MinimizedResult>;
export namespace swcMinify {
/**
* @returns {string | undefined}
*/
function getMinimizerVersion(): string | undefined;
/**
* @returns {boolean | undefined}
*/
function supportsWorkerThreads(): boolean | undefined;
}
/**
* @param {Input} input
* @param {SourceMapInput | undefined} sourceMap
* @param {CustomOptions} minimizerOptions
* @return {Promise<MinimizedResult>}
*/
export function esbuildMinify(
input: Input,
sourceMap: SourceMapInput | undefined,
minimizerOptions: CustomOptions
): Promise<MinimizedResult>;
export namespace esbuildMinify {
/**
* @returns {string | undefined}
*/
function getMinimizerVersion(): string | undefined;
/**
* @returns {boolean | undefined}
* @returns {boolean | undefined} true if worker thread is supported, false otherwise
*/
function supportsWorkerThreads(): boolean | undefined;
}