@rushstack/webpack5-module-minifier-plugin 5.6.13 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json CHANGED
@@ -1,6 +1,39 @@
1
1
  {
2
2
  "name": "@rushstack/webpack5-module-minifier-plugin",
3
3
  "entries": [
4
+ {
5
+ "version": "5.7.0",
6
+ "tag": "@rushstack/webpack5-module-minifier-plugin_v5.7.0",
7
+ "date": "Thu, 12 Feb 2026 23:00:53 GMT",
8
+ "comments": {
9
+ "minor": [
10
+ {
11
+ "comment": "Add support for webpack's ECMAScript method shorthand format. The plugin now detects when modules are emitted using method shorthand syntax (without 'function' keyword or arrow syntax) and wraps them appropriately for minification."
12
+ }
13
+ ]
14
+ }
15
+ },
16
+ {
17
+ "version": "5.6.14",
18
+ "tag": "@rushstack/webpack5-module-minifier-plugin_v5.6.14",
19
+ "date": "Sat, 07 Feb 2026 01:13:26 GMT",
20
+ "comments": {
21
+ "dependency": [
22
+ {
23
+ "comment": "Updating dependency \"@rushstack/worker-pool\" to `0.6.14`"
24
+ },
25
+ {
26
+ "comment": "Updating dependency \"@rushstack/heft\" to `1.1.14`"
27
+ },
28
+ {
29
+ "comment": "Updating dependency \"@rushstack/module-minifier\" to `0.8.14`"
30
+ },
31
+ {
32
+ "comment": "Updating dependency \"@rushstack/module-minifier\" from `*` to `0.8.14`"
33
+ }
34
+ ]
35
+ }
36
+ },
4
37
  {
5
38
  "version": "5.6.13",
6
39
  "tag": "@rushstack/webpack5-module-minifier-plugin_v5.6.13",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
1
  # Change Log - @rushstack/webpack5-module-minifier-plugin
2
2
 
3
- This log was last generated on Wed, 04 Feb 2026 20:42:47 GMT and should not be manually modified.
3
+ This log was last generated on Thu, 12 Feb 2026 23:00:53 GMT and should not be manually modified.
4
+
5
+ ## 5.7.0
6
+ Thu, 12 Feb 2026 23:00:53 GMT
7
+
8
+ ### Minor changes
9
+
10
+ - Add support for webpack's ECMAScript method shorthand format. The plugin now detects when modules are emitted using method shorthand syntax (without 'function' keyword or arrow syntax) and wraps them appropriately for minification.
11
+
12
+ ## 5.6.14
13
+ Sat, 07 Feb 2026 01:13:26 GMT
14
+
15
+ _Version update only_
4
16
 
5
17
  ## 5.6.13
6
18
  Wed, 04 Feb 2026 20:42:47 GMT
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.56.1"
8
+ "packageVersion": "7.56.3"
9
9
  }
10
10
  ]
11
11
  }
@@ -11,6 +11,11 @@ import type { WebpackPluginInstance } from 'webpack';
11
11
 
12
12
  /**
13
13
  * RegExp for replacing chunk module placeholders
14
+ * Handles three possible representations:
15
+ * - `"id":__WEBPACK_CHUNK_MODULE__HASH__` (methodShorthand: false, object)
16
+ * - `__WEBPACK_CHUNK_MODULE__HASH__` (array syntax)
17
+ * - `"id":__WEBPACK_CHUNK_MODULE__HASH__` with leading ':' (methodShorthand: true, object)
18
+ * Captures optional leading `:` to handle shorthand format properly
14
19
  * @public
15
20
  */
16
21
  export declare const CHUNK_MODULE_REGEX: RegExp;
@@ -114,6 +119,10 @@ export declare interface IModuleInfo {
114
119
  * The id of the module, from the chunk graph.
115
120
  */
116
121
  id: string | number;
122
+ /**
123
+ * Whether this module was in method shorthand format
124
+ */
125
+ isShorthand?: boolean;
117
126
  }
118
127
 
119
128
  /**
@@ -212,6 +221,24 @@ export declare interface IRenderedModulePosition {
212
221
  */
213
222
  export declare const MODULE_WRAPPER_PREFIX: '__MINIFY_MODULE__(';
214
223
 
224
+ /**
225
+ * Prefix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
226
+ * Used when webpack emits modules using shorthand syntax.
227
+ * Combined with the suffix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`
228
+ * Public because alternate Minifier implementations may wish to know about it.
229
+ * @public
230
+ */
231
+ export declare const MODULE_WRAPPER_SHORTHAND_PREFIX: `${typeof MODULE_WRAPPER_PREFIX}{__DEFAULT_ID__`;
232
+
233
+ /**
234
+ * Suffix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
235
+ * Used when webpack emits modules using shorthand syntax.
236
+ * Combined with the prefix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`
237
+ * Public because alternate Minifier implementations may wish to know about it.
238
+ * @public
239
+ */
240
+ export declare const MODULE_WRAPPER_SHORTHAND_SUFFIX: `}${typeof MODULE_WRAPPER_SUFFIX}`;
241
+
215
242
  /**
216
243
  * Suffix to wrap `function (module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
217
244
  * Public because alternate Minifier implementations may wish to know about it.
@@ -10,6 +10,22 @@ export declare const MODULE_WRAPPER_PREFIX: '__MINIFY_MODULE__(';
10
10
  * @public
11
11
  */
12
12
  export declare const MODULE_WRAPPER_SUFFIX: ');';
13
+ /**
14
+ * Prefix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
15
+ * Used when webpack emits modules using shorthand syntax.
16
+ * Combined with the suffix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`
17
+ * Public because alternate Minifier implementations may wish to know about it.
18
+ * @public
19
+ */
20
+ export declare const MODULE_WRAPPER_SHORTHAND_PREFIX: `${typeof MODULE_WRAPPER_PREFIX}{__DEFAULT_ID__`;
21
+ /**
22
+ * Suffix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
23
+ * Used when webpack emits modules using shorthand syntax.
24
+ * Combined with the prefix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`
25
+ * Public because alternate Minifier implementations may wish to know about it.
26
+ * @public
27
+ */
28
+ export declare const MODULE_WRAPPER_SHORTHAND_SUFFIX: `}${typeof MODULE_WRAPPER_SUFFIX}`;
13
29
  /**
14
30
  * Token preceding a module id in the emitted asset so the minifier can operate on the Webpack runtime or chunk boilerplate in isolation
15
31
  * @public
@@ -17,6 +33,11 @@ export declare const MODULE_WRAPPER_SUFFIX: ');';
17
33
  export declare const CHUNK_MODULE_TOKEN: '__WEBPACK_CHUNK_MODULE__';
18
34
  /**
19
35
  * RegExp for replacing chunk module placeholders
36
+ * Handles three possible representations:
37
+ * - `"id":__WEBPACK_CHUNK_MODULE__HASH__` (methodShorthand: false, object)
38
+ * - `__WEBPACK_CHUNK_MODULE__HASH__` (array syntax)
39
+ * - `"id":__WEBPACK_CHUNK_MODULE__HASH__` with leading ':' (methodShorthand: true, object)
40
+ * Captures optional leading `:` to handle shorthand format properly
20
41
  * @public
21
42
  */
22
43
  export declare const CHUNK_MODULE_REGEX: RegExp;
@@ -1 +1 @@
1
- {"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,oBAA2C,CAAC;AAChF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,IAAW,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,0BAAuD,CAAC;AAEzF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAoD,CAAC;AAEtF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,CAAC,KAAc,CAAC;AAC3C;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,GAAS,CAAC"}
1
+ {"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,oBAA2C,CAAC;AAChF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,IAAW,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,EAAE,GAAG,OAAO,qBAAqB,iBAA6D,CAAC;AAC3I;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,EAAE,IAAI,OAAO,qBAAqB,EAAgC,CAAC;AAE/G;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,0BAAuD,CAAC;AAEzF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAwD,CAAC;AAE1F;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,CAAC,KAAc,CAAC;AAC3C;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,GAAS,CAAC"}
package/lib/Constants.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
3
  // See LICENSE in the project root for license information.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.STAGE_AFTER = exports.STAGE_BEFORE = exports.CHUNK_MODULE_REGEX = exports.CHUNK_MODULE_TOKEN = exports.MODULE_WRAPPER_SUFFIX = exports.MODULE_WRAPPER_PREFIX = void 0;
5
+ exports.STAGE_AFTER = exports.STAGE_BEFORE = exports.CHUNK_MODULE_REGEX = exports.CHUNK_MODULE_TOKEN = exports.MODULE_WRAPPER_SHORTHAND_SUFFIX = exports.MODULE_WRAPPER_SHORTHAND_PREFIX = exports.MODULE_WRAPPER_SUFFIX = exports.MODULE_WRAPPER_PREFIX = void 0;
6
6
  /**
7
7
  * Prefix to wrap `function (module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
8
8
  * Public because alternate Minifier implementations may wish to know about it.
@@ -15,6 +15,22 @@ exports.MODULE_WRAPPER_PREFIX = '__MINIFY_MODULE__(';
15
15
  * @public
16
16
  */
17
17
  exports.MODULE_WRAPPER_SUFFIX = ');';
18
+ /**
19
+ * Prefix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
20
+ * Used when webpack emits modules using shorthand syntax.
21
+ * Combined with the suffix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`
22
+ * Public because alternate Minifier implementations may wish to know about it.
23
+ * @public
24
+ */
25
+ exports.MODULE_WRAPPER_SHORTHAND_PREFIX = `${exports.MODULE_WRAPPER_PREFIX}{__DEFAULT_ID__`;
26
+ /**
27
+ * Suffix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.
28
+ * Used when webpack emits modules using shorthand syntax.
29
+ * Combined with the prefix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`
30
+ * Public because alternate Minifier implementations may wish to know about it.
31
+ * @public
32
+ */
33
+ exports.MODULE_WRAPPER_SHORTHAND_SUFFIX = `}${exports.MODULE_WRAPPER_SUFFIX}`;
18
34
  /**
19
35
  * Token preceding a module id in the emitted asset so the minifier can operate on the Webpack runtime or chunk boilerplate in isolation
20
36
  * @public
@@ -22,9 +38,14 @@ exports.MODULE_WRAPPER_SUFFIX = ');';
22
38
  exports.CHUNK_MODULE_TOKEN = '__WEBPACK_CHUNK_MODULE__';
23
39
  /**
24
40
  * RegExp for replacing chunk module placeholders
41
+ * Handles three possible representations:
42
+ * - `"id":__WEBPACK_CHUNK_MODULE__HASH__` (methodShorthand: false, object)
43
+ * - `__WEBPACK_CHUNK_MODULE__HASH__` (array syntax)
44
+ * - `"id":__WEBPACK_CHUNK_MODULE__HASH__` with leading ':' (methodShorthand: true, object)
45
+ * Captures optional leading `:` to handle shorthand format properly
25
46
  * @public
26
47
  */
27
- exports.CHUNK_MODULE_REGEX = /__WEBPACK_CHUNK_MODULE__([A-Za-z0-9$_]+)/g;
48
+ exports.CHUNK_MODULE_REGEX = /(:?)__WEBPACK_CHUNK_MODULE__([A-Za-z0-9$_]+)/g;
28
49
  /**
29
50
  * Stage # to use when this should be the first tap in the hook
30
51
  * @public
@@ -1 +1 @@
1
- {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D;;;;GAIG;AACU,QAAA,qBAAqB,GAAyB,oBAAoB,CAAC;AAChF;;;;GAIG;AACU,QAAA,qBAAqB,GAAS,IAAI,CAAC;AAEhD;;;GAGG;AACU,QAAA,kBAAkB,GAA+B,0BAA0B,CAAC;AAEzF;;;GAGG;AACU,QAAA,kBAAkB,GAAW,2CAA2C,CAAC;AAEtF;;;GAGG;AACU,QAAA,YAAY,GAAW,CAAC,KAAK,CAAC;AAC3C;;;GAGG;AACU,QAAA,WAAW,GAAQ,GAAG,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * Prefix to wrap `function (module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.\n * Public because alternate Minifier implementations may wish to know about it.\n * @public\n */\nexport const MODULE_WRAPPER_PREFIX: '__MINIFY_MODULE__(' = '__MINIFY_MODULE__(';\n/**\n * Suffix to wrap `function (module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.\n * Public because alternate Minifier implementations may wish to know about it.\n * @public\n */\nexport const MODULE_WRAPPER_SUFFIX: ');' = ');';\n\n/**\n * Token preceding a module id in the emitted asset so the minifier can operate on the Webpack runtime or chunk boilerplate in isolation\n * @public\n */\nexport const CHUNK_MODULE_TOKEN: '__WEBPACK_CHUNK_MODULE__' = '__WEBPACK_CHUNK_MODULE__';\n\n/**\n * RegExp for replacing chunk module placeholders\n * @public\n */\nexport const CHUNK_MODULE_REGEX: RegExp = /__WEBPACK_CHUNK_MODULE__([A-Za-z0-9$_]+)/g;\n\n/**\n * Stage # to use when this should be the first tap in the hook\n * @public\n */\nexport const STAGE_BEFORE: -10000 = -10000;\n/**\n * Stage # to use when this should be the last tap in the hook\n * @public\n */\nexport const STAGE_AFTER: 100 = 100;\n"]}
1
+ {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D;;;;GAIG;AACU,QAAA,qBAAqB,GAAyB,oBAAoB,CAAC;AAChF;;;;GAIG;AACU,QAAA,qBAAqB,GAAS,IAAI,CAAC;AAEhD;;;;;;GAMG;AACU,QAAA,+BAA+B,GAAqD,GAAG,6BAAqB,iBAAiB,CAAC;AAC3I;;;;;;GAMG;AACU,QAAA,+BAA+B,GAAuC,IAAI,6BAAqB,EAAE,CAAC;AAE/G;;;GAGG;AACU,QAAA,kBAAkB,GAA+B,0BAA0B,CAAC;AAEzF;;;;;;;;GAQG;AACU,QAAA,kBAAkB,GAAW,+CAA+C,CAAC;AAE1F;;;GAGG;AACU,QAAA,YAAY,GAAW,CAAC,KAAK,CAAC;AAC3C;;;GAGG;AACU,QAAA,WAAW,GAAQ,GAAG,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * Prefix to wrap `function (module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.\n * Public because alternate Minifier implementations may wish to know about it.\n * @public\n */\nexport const MODULE_WRAPPER_PREFIX: '__MINIFY_MODULE__(' = '__MINIFY_MODULE__(';\n/**\n * Suffix to wrap `function (module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.\n * Public because alternate Minifier implementations may wish to know about it.\n * @public\n */\nexport const MODULE_WRAPPER_SUFFIX: ');' = ');';\n\n/**\n * Prefix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.\n * Used when webpack emits modules using shorthand syntax.\n * Combined with the suffix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`\n * Public because alternate Minifier implementations may wish to know about it.\n * @public\n */\nexport const MODULE_WRAPPER_SHORTHAND_PREFIX: `${typeof MODULE_WRAPPER_PREFIX}{__DEFAULT_ID__` = `${MODULE_WRAPPER_PREFIX}{__DEFAULT_ID__`;\n/**\n * Suffix to wrap ECMAScript method shorthand `(module, __webpack_exports__, __webpack_require__) { ... }` so that the minifier doesn't delete it.\n * Used when webpack emits modules using shorthand syntax.\n * Combined with the prefix, creates: `__MINIFY_MODULE__({__DEFAULT_ID__(params){body}});`\n * Public because alternate Minifier implementations may wish to know about it.\n * @public\n */\nexport const MODULE_WRAPPER_SHORTHAND_SUFFIX: `}${typeof MODULE_WRAPPER_SUFFIX}` = `}${MODULE_WRAPPER_SUFFIX}`;\n\n/**\n * Token preceding a module id in the emitted asset so the minifier can operate on the Webpack runtime or chunk boilerplate in isolation\n * @public\n */\nexport const CHUNK_MODULE_TOKEN: '__WEBPACK_CHUNK_MODULE__' = '__WEBPACK_CHUNK_MODULE__';\n\n/**\n * RegExp for replacing chunk module placeholders\n * Handles three possible representations:\n * - `\"id\":__WEBPACK_CHUNK_MODULE__HASH__` (methodShorthand: false, object)\n * - `__WEBPACK_CHUNK_MODULE__HASH__` (array syntax)\n * - `\"id\":__WEBPACK_CHUNK_MODULE__HASH__` with leading ':' (methodShorthand: true, object)\n * Captures optional leading `:` to handle shorthand format properly\n * @public\n */\nexport const CHUNK_MODULE_REGEX: RegExp = /(:?)__WEBPACK_CHUNK_MODULE__([A-Za-z0-9$_]+)/g;\n\n/**\n * Stage # to use when this should be the first tap in the hook\n * @public\n */\nexport const STAGE_BEFORE: -10000 = -10000;\n/**\n * Stage # to use when this should be the last tap in the hook\n * @public\n */\nexport const STAGE_AFTER: 100 = 100;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleMinifierPlugin.d.ts","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,WAAW,EACX,qBAAqB,EACrB,QAAQ,EAMT,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAEV,eAAe,EAGhB,MAAM,4BAA4B,CAAC;AAUpC,OAAO,KAAK,EACV,4BAA4B,EAI5B,0BAA0B,EAI1B,0BAA0B,IAAI,0BAA0B,EAEzD,MAAM,8BAA8B,CAAC;AAkFtC;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,SAAgB,KAAK,EAAE,0BAA0B,CAAC;IAC3C,QAAQ,EAAE,eAAe,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAE/B,OAAO,EAAE,4BAA4B;WAuB1C,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,0BAA0B,GAAG,SAAS;IAIjG,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CA+YvC"}
1
+ {"version":3,"file":"ModuleMinifierPlugin.d.ts","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,WAAW,EACX,qBAAqB,EACrB,QAAQ,EAMT,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAEV,eAAe,EAGhB,MAAM,4BAA4B,CAAC;AAYpC,OAAO,KAAK,EACV,4BAA4B,EAI5B,0BAA0B,EAI1B,0BAA0B,IAAI,0BAA0B,EAEzD,MAAM,8BAA8B,CAAC;AA2HtC;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,SAAgB,KAAK,EAAE,0BAA0B,CAAC;IAC3C,QAAQ,EAAE,eAAe,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAE/B,OAAO,EAAE,4BAA4B;WAuB1C,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,0BAA0B,GAAG,SAAS;IAIjG,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAmavC"}
@@ -59,6 +59,41 @@ function isMinificationResultError(result) {
59
59
  function isLicenseComment(comment) {
60
60
  return LICENSE_COMMENT_REGEX.test(comment.value);
61
61
  }
62
+ /**
63
+ * RegExp for detecting function keyword with optional whitespace
64
+ */
65
+ const FUNCTION_KEYWORD_REGEX = /function\s*\(/;
66
+ /**
67
+ * Detects if the module code uses ECMAScript method shorthand format.
68
+ * Shorthand format would appear when webpack emits object methods without function keyword
69
+ * For example: `id(params) { body }` instead of `id: function(params) { body }`
70
+ *
71
+ * Following the problem statement's recommendation: inspect the rendered code prior to the first `{`
72
+ * and look for either a `=>` or `function(`. If neither are encountered, assume object shorthand format.
73
+ *
74
+ * @param code - The module source code to check
75
+ * @returns true if the code is in method shorthand format
76
+ */
77
+ function isMethodShorthandFormat(code) {
78
+ // Find the position of the first opening brace
79
+ const firstBraceIndex = code.indexOf('{');
80
+ if (firstBraceIndex < 0) {
81
+ // No brace found, not a function format
82
+ return false;
83
+ }
84
+ // Get the code before the first brace
85
+ const beforeBrace = code.slice(0, firstBraceIndex);
86
+ // Check if it contains '=>' or 'function('
87
+ // If it does, it's a regular arrow function or function expression, not shorthand
88
+ // Use a simple check that handles common whitespace variations
89
+ if (beforeBrace.includes('=>') || FUNCTION_KEYWORD_REGEX.test(beforeBrace)) {
90
+ return false;
91
+ }
92
+ // If neither '=>' nor 'function(' are found, assume object method shorthand format
93
+ // ECMAScript method shorthand is used in object literals: { methodName(params){body} }
94
+ // Webpack emits this as just (params){body} which only works in the object literal context
95
+ return true;
96
+ }
62
97
  /**
63
98
  * Webpack plugin that minifies code on a per-module basis rather than per-asset. The actual minification is handled by the input `minifier` object.
64
99
  * @public
@@ -214,8 +249,14 @@ class ModuleMinifierPlugin {
214
249
  metadata.hashByChunk.set(chunkRenderContext.chunk, cachedResult.hash);
215
250
  return cachedResult.source;
216
251
  }
252
+ // Get the source code to check its format
253
+ const sourceCode = source.source().toString();
254
+ // Detect if this is ECMAScript method shorthand format
255
+ const isShorthand = isMethodShorthandFormat(sourceCode);
217
256
  // If this module is wrapped in a factory, need to add boilerplate so that the minifier keeps the function
218
- const wrapped = new ConcatSource(Constants_1.MODULE_WRAPPER_PREFIX + '\n', source, '\n' + Constants_1.MODULE_WRAPPER_SUFFIX);
257
+ const wrapped = isShorthand
258
+ ? new ConcatSource(Constants_1.MODULE_WRAPPER_SHORTHAND_PREFIX, source, Constants_1.MODULE_WRAPPER_SHORTHAND_SUFFIX)
259
+ : new ConcatSource(Constants_1.MODULE_WRAPPER_PREFIX + '\n', source, '\n' + Constants_1.MODULE_WRAPPER_SUFFIX);
219
260
  const nameForMap = `(modules)/${id}`;
220
261
  const { source: wrappedCodeRaw, map } = useSourceMaps
221
262
  ? wrapped.sourceAndMap()
@@ -253,8 +294,19 @@ class ModuleMinifierPlugin {
253
294
  const unwrapped = new ReplaceSource(rawOutput);
254
295
  const len = minified.length;
255
296
  // Trim off the boilerplate used to preserve the factory
256
- unwrapped.replace(0, Constants_1.MODULE_WRAPPER_PREFIX.length - 1, '');
257
- unwrapped.replace(len - Constants_1.MODULE_WRAPPER_SUFFIX.length, len - 1, '');
297
+ // Use different prefix/suffix lengths for shorthand vs regular format
298
+ // Capture isShorthand from closure instead of looking it up
299
+ if (isShorthand) {
300
+ // For shorthand format: __MINIFY_MODULE__({__DEFAULT_ID__(args){...}});
301
+ // Remove prefix and suffix by their lengths
302
+ unwrapped.replace(0, Constants_1.MODULE_WRAPPER_SHORTHAND_PREFIX.length - 1, '');
303
+ unwrapped.replace(len - Constants_1.MODULE_WRAPPER_SHORTHAND_SUFFIX.length, len - 1, '');
304
+ }
305
+ else {
306
+ // Regular format: __MINIFY_MODULE__(function(args){...}); or __MINIFY_MODULE__((args)=>{...});
307
+ unwrapped.replace(0, Constants_1.MODULE_WRAPPER_PREFIX.length - 1, '');
308
+ unwrapped.replace(len - Constants_1.MODULE_WRAPPER_SUFFIX.length, len - 1, '');
309
+ }
258
310
  const withIds = postProcessCode(unwrapped, {
259
311
  compilation,
260
312
  module: mod,
@@ -266,7 +318,8 @@ class ModuleMinifierPlugin {
266
318
  minifiedModules.set(hash, {
267
319
  source: cached,
268
320
  module: mod,
269
- id
321
+ id,
322
+ isShorthand
270
323
  });
271
324
  }
272
325
  catch (err) {
@@ -276,10 +329,15 @@ class ModuleMinifierPlugin {
276
329
  onFileMinified();
277
330
  });
278
331
  }
279
- const result = new RawSource(`${Constants_1.CHUNK_MODULE_TOKEN}${hash}`);
332
+ // Create token with optional ':' prefix for shorthand modules
333
+ // For non-shorthand: __WEBPACK_CHUNK_MODULE__hash (becomes "id":__WEBPACK_CHUNK_MODULE__hash in object)
334
+ // For shorthand: :__WEBPACK_CHUNK_MODULE__hash (becomes "id"__WEBPACK_CHUNK_MODULE__hash, ':' makes it valid property assignment)
335
+ const tokenPrefix = isShorthand ? ':' : '';
336
+ const result = new RawSource(`${tokenPrefix}${Constants_1.CHUNK_MODULE_TOKEN}${hash}`);
280
337
  sourceCache.set(source, {
281
338
  hash,
282
- source: result
339
+ source: result,
340
+ isShorthand
283
341
  });
284
342
  // Return an expression to replace later
285
343
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleMinifierPlugin.js","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { createHash } from 'node:crypto';\n\nimport type { Comment } from 'estree';\nimport type {\n Module,\n Compilation,\n WebpackPluginInstance,\n Compiler,\n javascript,\n WebpackError,\n ExternalModule,\n sources,\n Chunk\n} from 'webpack';\nimport { AsyncSeriesWaterfallHook, SyncWaterfallHook, type Tap } from 'tapable';\n\nimport type {\n IMinifierConnection,\n IModuleMinifier,\n IModuleMinificationResult,\n IModuleMinificationErrorResult\n} from '@rushstack/module-minifier';\nimport { getIdentifier } from '@rushstack/module-minifier';\n\nimport {\n CHUNK_MODULE_TOKEN,\n MODULE_WRAPPER_PREFIX,\n MODULE_WRAPPER_SUFFIX,\n STAGE_BEFORE,\n STAGE_AFTER\n} from './Constants';\nimport type {\n IModuleMinifierPluginOptions,\n IModuleMap,\n IAssetMap,\n IFactoryMeta,\n IModuleMinifierPluginHooks,\n IPostProcessFragmentContext,\n IDehydratedAssets,\n IModuleStats,\n IModuleMinifierPluginStats as IModuleMinifierPluginStats,\n IAssetStats\n} from './ModuleMinifierPlugin.types';\nimport { generateLicenseFileForAsset } from './GenerateLicenseFileForAsset';\nimport { rehydrateAsset } from './RehydrateAsset';\n\n// The name of the plugin, for use in taps\nconst PLUGIN_NAME: 'ModuleMinifierPlugin' = 'ModuleMinifierPlugin';\n\n// Monotonically increasing identifier to be incremented any time the code generation logic changes\n// Will be applied to the webpack hash.\nconst CODE_GENERATION_REVISION: number = 1;\n// Match behavior of terser's \"some\" option\n// https://github.com/terser/terser/blob/d3d924fa9e4c57bbe286b811c6068bcc7026e902/lib/output.js#L175\nconst LICENSE_COMMENT_REGEX: RegExp = /@preserve|@lic|@cc_on|^\\**!/i;\n\nconst TAP_BEFORE: Tap = {\n name: PLUGIN_NAME,\n stage: STAGE_BEFORE\n};\nconst TAP_AFTER: Tap = {\n name: PLUGIN_NAME,\n stage: STAGE_AFTER\n};\n\ninterface IOptionsForHash extends Omit<IModuleMinifierPluginOptions, 'minifier'> {\n revision: number;\n minifier: undefined;\n}\n\ninterface ISourceCacheEntry {\n source: sources.Source;\n hash: string;\n}\n\nconst compilationMetadataMap: WeakMap<Compilation, IModuleMinifierPluginStats> = new WeakMap();\n\nfunction hashCodeFragment(code: string): string {\n return createHash('sha256').update(code).digest('hex');\n}\n\n/**\n * Base implementation of asset rehydration\n *\n * @param dehydratedAssets The dehydrated assets\n * @param compilation The webpack compilation\n */\nfunction defaultRehydrateAssets(\n dehydratedAssets: IDehydratedAssets,\n compilation: Compilation\n): IDehydratedAssets {\n const { assets, modules } = dehydratedAssets;\n\n const compilationMetadata: IModuleMinifierPluginStats | undefined = compilationMetadataMap.get(compilation);\n if (!compilationMetadata) {\n throw new Error(`Could not get compilation metadata`);\n }\n\n const { metadataByAssetFileName } = compilationMetadata;\n\n // Now assets/modules contain fully minified code. Rehydrate.\n for (const [assetName, info] of assets) {\n const banner: string = info.type === 'javascript' ? generateLicenseFileForAsset(compilation, info) : '';\n\n const replacementSource: sources.Source = rehydrateAsset(compilation, info, modules, banner, true);\n metadataByAssetFileName.set(assetName, {\n positionByModuleId: info.renderInfo\n });\n compilation.updateAsset(assetName, replacementSource);\n }\n\n return dehydratedAssets;\n}\n\nfunction isMinificationResultError(\n result: IModuleMinificationResult\n): result is IModuleMinificationErrorResult {\n return !!result.error;\n}\n\nfunction isLicenseComment(comment: Comment): boolean {\n return LICENSE_COMMENT_REGEX.test(comment.value);\n}\n\n/**\n * Webpack plugin that minifies code on a per-module basis rather than per-asset. The actual minification is handled by the input `minifier` object.\n * @public\n */\nexport class ModuleMinifierPlugin implements WebpackPluginInstance {\n public readonly hooks: IModuleMinifierPluginHooks;\n public minifier: IModuleMinifier;\n\n private readonly _enhancers: WebpackPluginInstance[];\n private readonly _sourceMap: boolean | undefined;\n\n private readonly _optionsForHash: IOptionsForHash;\n\n public constructor(options: IModuleMinifierPluginOptions) {\n this.hooks = {\n rehydrateAssets: new AsyncSeriesWaterfallHook(['dehydratedContent', 'compilation']),\n\n postProcessCodeFragment: new SyncWaterfallHook(['code', 'context'])\n };\n\n const { minifier, sourceMap } = options;\n\n this._optionsForHash = {\n ...options,\n minifier: undefined,\n revision: CODE_GENERATION_REVISION\n };\n\n this._enhancers = [];\n\n this.hooks.rehydrateAssets.tap(PLUGIN_NAME, defaultRehydrateAssets);\n this.minifier = minifier;\n\n this._sourceMap = sourceMap;\n }\n\n public static getCompilationStatistics(compilation: Compilation): IModuleMinifierPluginStats | undefined {\n return compilationMetadataMap.get(compilation);\n }\n\n public apply(compiler: Compiler): void {\n for (const enhancer of this._enhancers) {\n enhancer.apply(compiler);\n }\n\n const {\n options: { devtool, mode },\n webpack\n } = compiler;\n\n webpack.Template.numberToIdentifier = getIdentifier;\n\n const { CachedSource, ConcatSource, RawSource, ReplaceSource, SourceMapSource } = webpack.sources;\n // The explicit setting is preferred due to accuracy, but try to guess based on devtool\n const useSourceMaps: boolean =\n typeof this._sourceMap === 'boolean'\n ? this._sourceMap\n : typeof devtool === 'string'\n ? devtool.endsWith('source-map')\n : mode === 'production' && devtool !== false;\n\n this._optionsForHash.sourceMap = useSourceMaps;\n const binaryConfig: Buffer = Buffer.from(JSON.stringify(this._optionsForHash), 'utf-8');\n\n compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation, compilationData) => {\n const { normalModuleFactory } = compilationData;\n\n function addCommentExtraction(parser: javascript.JavascriptParser): void {\n parser.hooks.program.tap(PLUGIN_NAME, (program: unknown, comments: Comment[]) => {\n const relevantComments: Comment[] = comments.filter(isLicenseComment);\n if (comments.length > 0) {\n // Webpack's typings now restrict the properties on factoryMeta for unknown reasons\n const module: { factoryMeta?: IFactoryMeta } = parser.state.module as unknown as {\n factoryMeta?: IFactoryMeta;\n };\n if (!module.factoryMeta) {\n module.factoryMeta = {\n comments: relevantComments\n };\n } else {\n (module.factoryMeta as IFactoryMeta).comments = relevantComments;\n }\n }\n });\n }\n\n normalModuleFactory.hooks.parser.for('javascript/auto').tap(PLUGIN_NAME, addCommentExtraction);\n normalModuleFactory.hooks.parser.for('javascript/dynamic').tap(PLUGIN_NAME, addCommentExtraction);\n normalModuleFactory.hooks.parser.for('javascript/esm').tap(PLUGIN_NAME, addCommentExtraction);\n\n /**\n * Set of local module ids that have been processed.\n */\n const submittedModules: Set<string | number> = new Set();\n\n /**\n * The text and comments of all minified modules.\n */\n const minifiedModules: IModuleMap = new Map();\n\n /**\n * The text and comments of all minified chunks. Most of these are trivial, but the runtime chunk is a bit larger.\n */\n const minifiedAssets: IAssetMap = new Map();\n\n const metadataByModule: WeakMap<Module, IModuleStats> = new WeakMap();\n const metadataByAssetFileName: Map<string, IAssetStats> = new Map();\n const compilationStatistics: IModuleMinifierPluginStats = {\n metadataByModule,\n metadataByAssetFileName\n };\n compilationMetadataMap.set(compilation, compilationStatistics);\n function getOrCreateMetadata(mod: Module): IModuleStats {\n let moduleStats: IModuleStats | undefined = metadataByModule.get(mod);\n if (!moduleStats) {\n moduleStats = {\n hashByChunk: new Map(),\n sizeByHash: new Map()\n };\n metadataByModule.set(mod, moduleStats);\n }\n return moduleStats;\n }\n\n let pendingMinificationRequests: number = 0;\n /**\n * Indicates that all files have been sent to the minifier and therefore that when pending hits 0, assets can be rehydrated.\n */\n let allRequestsIssued: boolean = false;\n\n let resolveMinifyPromise: () => void;\n\n const postProcessCode: (\n code: sources.ReplaceSource,\n context: IPostProcessFragmentContext\n ) => sources.ReplaceSource = (code: sources.ReplaceSource, context: IPostProcessFragmentContext) =>\n this.hooks.postProcessCodeFragment.call(code, context);\n\n /**\n * Callback to invoke when a file has finished minifying.\n */\n function onFileMinified(): void {\n if (--pendingMinificationRequests === 0 && allRequestsIssued) {\n resolveMinifyPromise();\n }\n }\n\n const { minifier } = this;\n\n let minifierConnection: IMinifierConnection | undefined;\n\n // Typings for this object are not exposed\n // eslint-disable-next-line @typescript-eslint/typedef\n const javascriptHooks = webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation);\n\n /**\n * The minifier needs to know if the module was wrapped in a factory function, because\n * function (module, exports, require) { // <implementation> }\n * minifies to nothing. Unfortunately we can't tell by inspection if the output was wrapped or not.\n * However, the JavaScriptModulesPlugin invokes three hooks in order when rendering a module:\n * 1) renderModuleContent - Invoked for every module.\n * 2) renderModuleContainer - Invoked when wrapping a module in a factory.\n * 3) renderModulePackage - Invoked for every module as the last hook.\n */\n let nextModule: Module | undefined;\n const sourceCache: WeakMap<sources.Source, ISourceCacheEntry> = new WeakMap();\n javascriptHooks.renderModuleContent.tap(TAP_AFTER, (source) => {\n // Clear the identification state of the current module.\n nextModule = undefined;\n return source;\n });\n javascriptHooks.renderModuleContainer.tap(TAP_AFTER, (source, mod) => {\n // Module is being wrapped in a factory, so it is safe for per-module minification\n // Leave external modules in-place to avoid needing special handling for externals\n if (mod.context !== null || !(mod as ExternalModule).externalType) {\n nextModule = mod;\n }\n return source;\n });\n javascriptHooks.renderModulePackage.tap(\n TAP_AFTER,\n /**\n * Extracts the code for the module and sends it to be minified.\n */\n function minifyModule(\n source: sources.Source,\n mod: Module,\n chunkRenderContext: { chunk: Chunk }\n ): sources.Source {\n if (nextModule !== mod) {\n // This module is being inlined. Abandon per-module minification.\n return source;\n }\n\n const id: string | number | null = compilation.chunkGraph.getModuleId(mod);\n\n if (id === null) {\n // This module has no id. Abandon per-module minification.\n return source;\n }\n\n const metadata: IModuleStats = getOrCreateMetadata(mod);\n const cachedResult: ISourceCacheEntry | undefined = sourceCache.get(source);\n if (cachedResult) {\n metadata.hashByChunk.set(chunkRenderContext.chunk, cachedResult.hash);\n return cachedResult.source;\n }\n\n // If this module is wrapped in a factory, need to add boilerplate so that the minifier keeps the function\n const wrapped: sources.Source = new ConcatSource(\n MODULE_WRAPPER_PREFIX + '\\n',\n source,\n '\\n' + MODULE_WRAPPER_SUFFIX\n );\n\n const nameForMap: string = `(modules)/${id}`;\n\n const { source: wrappedCodeRaw, map } = useSourceMaps\n ? wrapped.sourceAndMap()\n : {\n source: wrapped.source(),\n map: undefined\n };\n\n const wrappedCode: string = wrappedCodeRaw.toString();\n const hash: string = hashCodeFragment(wrappedCode);\n metadata.hashByChunk.set(chunkRenderContext.chunk, hash);\n if (!submittedModules.has(hash)) {\n submittedModules.add(hash);\n\n ++pendingMinificationRequests;\n\n minifier.minify(\n {\n hash,\n code: wrappedCode,\n nameForMap: useSourceMaps ? nameForMap : undefined,\n externals: undefined\n },\n (result: IModuleMinificationResult) => {\n if (isMinificationResultError(result)) {\n compilation.errors.push(result.error as WebpackError);\n } else {\n try {\n const { code: minified, map: minifierMap } = result;\n\n const rawOutput: sources.Source = useSourceMaps\n ? new SourceMapSource(\n minified, // Code\n nameForMap, // File\n minifierMap!, // Base source map\n wrappedCode, // Source from before transform\n map!, // Source Map from before transform\n true // Remove original source\n )\n : new RawSource(minified);\n\n const unwrapped: sources.ReplaceSource = new ReplaceSource(rawOutput);\n const len: number = minified.length;\n\n // Trim off the boilerplate used to preserve the factory\n unwrapped.replace(0, MODULE_WRAPPER_PREFIX.length - 1, '');\n unwrapped.replace(len - MODULE_WRAPPER_SUFFIX.length, len - 1, '');\n\n const withIds: sources.Source = postProcessCode(unwrapped, {\n compilation,\n module: mod,\n loggingName: mod.identifier()\n });\n const cached: sources.CachedSource = new CachedSource(withIds);\n\n const minifiedSize: number = Buffer.byteLength(cached.source(), 'utf-8');\n metadata.sizeByHash.set(hash, minifiedSize);\n\n minifiedModules.set(hash, {\n source: cached,\n module: mod,\n id\n });\n } catch (err) {\n compilation.errors.push(err);\n }\n }\n\n onFileMinified();\n }\n );\n }\n\n const result: sources.Source = new RawSource(`${CHUNK_MODULE_TOKEN}${hash}`);\n sourceCache.set(source, {\n hash,\n source: result\n });\n\n // Return an expression to replace later\n return result;\n }\n );\n\n // The optimizeChunkModules hook is the last async hook that occurs before chunk rendering\n compilation.hooks.optimizeChunkModules.tapPromise(PLUGIN_NAME, async () => {\n minifierConnection = await minifier.connectAsync();\n\n submittedModules.clear();\n });\n\n const isJSAsset: RegExp = /\\.[cm]?js(\\?.+)?$/;\n\n // This should happen before any other tasks that operate during processAssets\n compilation.hooks.processAssets.tapPromise(TAP_BEFORE, async (): Promise<void> => {\n const { chunkGraph, chunks } = compilation;\n\n // Still need to minify the rendered assets\n for (const chunk of chunks) {\n const allChunkModules: Iterable<Module> | undefined =\n chunkGraph.getChunkModulesIterableBySourceType(chunk, 'javascript');\n if (!allChunkModules) {\n // This chunk does not contain javascript modules\n continue;\n }\n\n for (const assetName of chunk.files) {\n const asset: sources.Source = compilation.assets[assetName];\n\n // Verify that this is a JS asset\n if (isJSAsset.test(assetName)) {\n ++pendingMinificationRequests;\n\n const { source: wrappedCodeRaw, map } = useSourceMaps\n ? asset.sourceAndMap()\n : {\n source: asset.source(),\n map: undefined\n };\n\n const rawCode: string = wrappedCodeRaw.toString();\n const nameForMap: string = `(chunks)/${assetName}`;\n\n const hash: string = hashCodeFragment(rawCode);\n\n minifier.minify(\n {\n hash,\n code: rawCode,\n nameForMap: useSourceMaps ? nameForMap : undefined,\n externals: undefined\n },\n (result: IModuleMinificationResult) => {\n if (isMinificationResultError(result)) {\n compilation.errors.push(result.error as WebpackError);\n // eslint-disable-next-line no-console\n console.error(result.error);\n } else {\n try {\n const { code: minified, map: minifierMap } = result;\n\n const rawOutput: sources.Source = useSourceMaps\n ? new SourceMapSource(\n minified, // Code\n nameForMap, // File\n minifierMap ?? undefined, // Base source map\n rawCode, // Source from before transform\n map ?? undefined, // Source Map from before transform\n true // Remove original source\n )\n : new RawSource(minified);\n\n const withIds: sources.Source = postProcessCode(new ReplaceSource(rawOutput), {\n compilation,\n module: undefined,\n loggingName: assetName\n });\n\n minifiedAssets.set(assetName, {\n source: new CachedSource(withIds),\n chunk,\n fileName: assetName,\n renderInfo: new Map(),\n type: 'javascript'\n });\n } catch (err) {\n compilation.errors.push(err);\n }\n }\n\n onFileMinified();\n }\n );\n } else {\n // This isn't a JS asset. Don't try to minify the asset wrapper, though if it contains modules, those might still get replaced with minified versions.\n minifiedAssets.set(assetName, {\n // Still need to restore ids\n source: postProcessCode(new ReplaceSource(asset), {\n compilation,\n module: undefined,\n loggingName: assetName\n }),\n chunk,\n fileName: assetName,\n renderInfo: new Map(),\n type: 'unknown'\n });\n }\n }\n }\n\n allRequestsIssued = true;\n\n if (pendingMinificationRequests) {\n await new Promise<void>((resolve) => {\n resolveMinifyPromise = resolve;\n });\n }\n\n // Handle any error from the minifier.\n await minifierConnection?.disconnectAsync();\n\n // All assets and modules have been minified, hand them off to be rehydrated\n await this.hooks.rehydrateAssets.promise(\n {\n assets: minifiedAssets,\n modules: minifiedModules\n },\n compilation\n );\n });\n\n // Need to update chunk hashes with information from this plugin\n javascriptHooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash): void => {\n // Apply the options hash\n hash.update(binaryConfig);\n // Apply the hash from the minifier\n if (minifierConnection) {\n hash.update(minifierConnection.configHash, 'utf8');\n }\n });\n });\n }\n}\n"]}
1
+ {"version":3,"file":"ModuleMinifierPlugin.js","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { createHash } from 'node:crypto';\n\nimport type { Comment } from 'estree';\nimport type {\n Module,\n Compilation,\n WebpackPluginInstance,\n Compiler,\n javascript,\n WebpackError,\n ExternalModule,\n sources,\n Chunk\n} from 'webpack';\nimport { AsyncSeriesWaterfallHook, SyncWaterfallHook, type Tap } from 'tapable';\n\nimport type {\n IMinifierConnection,\n IModuleMinifier,\n IModuleMinificationResult,\n IModuleMinificationErrorResult\n} from '@rushstack/module-minifier';\nimport { getIdentifier } from '@rushstack/module-minifier';\n\nimport {\n CHUNK_MODULE_TOKEN,\n MODULE_WRAPPER_PREFIX,\n MODULE_WRAPPER_SUFFIX,\n MODULE_WRAPPER_SHORTHAND_PREFIX,\n MODULE_WRAPPER_SHORTHAND_SUFFIX,\n STAGE_BEFORE,\n STAGE_AFTER\n} from './Constants';\nimport type {\n IModuleMinifierPluginOptions,\n IModuleMap,\n IAssetMap,\n IFactoryMeta,\n IModuleMinifierPluginHooks,\n IPostProcessFragmentContext,\n IDehydratedAssets,\n IModuleStats,\n IModuleMinifierPluginStats as IModuleMinifierPluginStats,\n IAssetStats\n} from './ModuleMinifierPlugin.types';\nimport { generateLicenseFileForAsset } from './GenerateLicenseFileForAsset';\nimport { rehydrateAsset } from './RehydrateAsset';\n\n// The name of the plugin, for use in taps\nconst PLUGIN_NAME: 'ModuleMinifierPlugin' = 'ModuleMinifierPlugin';\n\n// Monotonically increasing identifier to be incremented any time the code generation logic changes\n// Will be applied to the webpack hash.\nconst CODE_GENERATION_REVISION: number = 1;\n// Match behavior of terser's \"some\" option\n// https://github.com/terser/terser/blob/d3d924fa9e4c57bbe286b811c6068bcc7026e902/lib/output.js#L175\nconst LICENSE_COMMENT_REGEX: RegExp = /@preserve|@lic|@cc_on|^\\**!/i;\n\nconst TAP_BEFORE: Tap = {\n name: PLUGIN_NAME,\n stage: STAGE_BEFORE\n};\nconst TAP_AFTER: Tap = {\n name: PLUGIN_NAME,\n stage: STAGE_AFTER\n};\n\ninterface IOptionsForHash extends Omit<IModuleMinifierPluginOptions, 'minifier'> {\n revision: number;\n minifier: undefined;\n}\n\ninterface ISourceCacheEntry {\n source: sources.Source;\n hash: string;\n isShorthand: boolean;\n}\n\nconst compilationMetadataMap: WeakMap<Compilation, IModuleMinifierPluginStats> = new WeakMap();\n\nfunction hashCodeFragment(code: string): string {\n return createHash('sha256').update(code).digest('hex');\n}\n\n/**\n * Base implementation of asset rehydration\n *\n * @param dehydratedAssets The dehydrated assets\n * @param compilation The webpack compilation\n */\nfunction defaultRehydrateAssets(\n dehydratedAssets: IDehydratedAssets,\n compilation: Compilation\n): IDehydratedAssets {\n const { assets, modules } = dehydratedAssets;\n\n const compilationMetadata: IModuleMinifierPluginStats | undefined = compilationMetadataMap.get(compilation);\n if (!compilationMetadata) {\n throw new Error(`Could not get compilation metadata`);\n }\n\n const { metadataByAssetFileName } = compilationMetadata;\n\n // Now assets/modules contain fully minified code. Rehydrate.\n for (const [assetName, info] of assets) {\n const banner: string = info.type === 'javascript' ? generateLicenseFileForAsset(compilation, info) : '';\n\n const replacementSource: sources.Source = rehydrateAsset(compilation, info, modules, banner, true);\n metadataByAssetFileName.set(assetName, {\n positionByModuleId: info.renderInfo\n });\n compilation.updateAsset(assetName, replacementSource);\n }\n\n return dehydratedAssets;\n}\n\nfunction isMinificationResultError(\n result: IModuleMinificationResult\n): result is IModuleMinificationErrorResult {\n return !!result.error;\n}\n\nfunction isLicenseComment(comment: Comment): boolean {\n return LICENSE_COMMENT_REGEX.test(comment.value);\n}\n\n/**\n * RegExp for detecting function keyword with optional whitespace\n */\nconst FUNCTION_KEYWORD_REGEX: RegExp = /function\\s*\\(/;\n\n/**\n * Detects if the module code uses ECMAScript method shorthand format.\n * Shorthand format would appear when webpack emits object methods without function keyword\n * For example: `id(params) { body }` instead of `id: function(params) { body }`\n *\n * Following the problem statement's recommendation: inspect the rendered code prior to the first `{`\n * and look for either a `=>` or `function(`. If neither are encountered, assume object shorthand format.\n *\n * @param code - The module source code to check\n * @returns true if the code is in method shorthand format\n */\nfunction isMethodShorthandFormat(code: string): boolean {\n // Find the position of the first opening brace\n const firstBraceIndex: number = code.indexOf('{');\n if (firstBraceIndex < 0) {\n // No brace found, not a function format\n return false;\n }\n\n // Get the code before the first brace\n const beforeBrace: string = code.slice(0, firstBraceIndex);\n\n // Check if it contains '=>' or 'function('\n // If it does, it's a regular arrow function or function expression, not shorthand\n // Use a simple check that handles common whitespace variations\n if (beforeBrace.includes('=>') || FUNCTION_KEYWORD_REGEX.test(beforeBrace)) {\n return false;\n }\n\n // If neither '=>' nor 'function(' are found, assume object method shorthand format\n // ECMAScript method shorthand is used in object literals: { methodName(params){body} }\n // Webpack emits this as just (params){body} which only works in the object literal context\n return true;\n}\n\n/**\n * Webpack plugin that minifies code on a per-module basis rather than per-asset. The actual minification is handled by the input `minifier` object.\n * @public\n */\nexport class ModuleMinifierPlugin implements WebpackPluginInstance {\n public readonly hooks: IModuleMinifierPluginHooks;\n public minifier: IModuleMinifier;\n\n private readonly _enhancers: WebpackPluginInstance[];\n private readonly _sourceMap: boolean | undefined;\n\n private readonly _optionsForHash: IOptionsForHash;\n\n public constructor(options: IModuleMinifierPluginOptions) {\n this.hooks = {\n rehydrateAssets: new AsyncSeriesWaterfallHook(['dehydratedContent', 'compilation']),\n\n postProcessCodeFragment: new SyncWaterfallHook(['code', 'context'])\n };\n\n const { minifier, sourceMap } = options;\n\n this._optionsForHash = {\n ...options,\n minifier: undefined,\n revision: CODE_GENERATION_REVISION\n };\n\n this._enhancers = [];\n\n this.hooks.rehydrateAssets.tap(PLUGIN_NAME, defaultRehydrateAssets);\n this.minifier = minifier;\n\n this._sourceMap = sourceMap;\n }\n\n public static getCompilationStatistics(compilation: Compilation): IModuleMinifierPluginStats | undefined {\n return compilationMetadataMap.get(compilation);\n }\n\n public apply(compiler: Compiler): void {\n for (const enhancer of this._enhancers) {\n enhancer.apply(compiler);\n }\n\n const {\n options: { devtool, mode },\n webpack\n } = compiler;\n\n webpack.Template.numberToIdentifier = getIdentifier;\n\n const { CachedSource, ConcatSource, RawSource, ReplaceSource, SourceMapSource } = webpack.sources;\n // The explicit setting is preferred due to accuracy, but try to guess based on devtool\n const useSourceMaps: boolean =\n typeof this._sourceMap === 'boolean'\n ? this._sourceMap\n : typeof devtool === 'string'\n ? devtool.endsWith('source-map')\n : mode === 'production' && devtool !== false;\n\n this._optionsForHash.sourceMap = useSourceMaps;\n const binaryConfig: Buffer = Buffer.from(JSON.stringify(this._optionsForHash), 'utf-8');\n\n compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation, compilationData) => {\n const { normalModuleFactory } = compilationData;\n\n function addCommentExtraction(parser: javascript.JavascriptParser): void {\n parser.hooks.program.tap(PLUGIN_NAME, (program: unknown, comments: Comment[]) => {\n const relevantComments: Comment[] = comments.filter(isLicenseComment);\n if (comments.length > 0) {\n // Webpack's typings now restrict the properties on factoryMeta for unknown reasons\n const module: { factoryMeta?: IFactoryMeta } = parser.state.module as unknown as {\n factoryMeta?: IFactoryMeta;\n };\n if (!module.factoryMeta) {\n module.factoryMeta = {\n comments: relevantComments\n };\n } else {\n (module.factoryMeta as IFactoryMeta).comments = relevantComments;\n }\n }\n });\n }\n\n normalModuleFactory.hooks.parser.for('javascript/auto').tap(PLUGIN_NAME, addCommentExtraction);\n normalModuleFactory.hooks.parser.for('javascript/dynamic').tap(PLUGIN_NAME, addCommentExtraction);\n normalModuleFactory.hooks.parser.for('javascript/esm').tap(PLUGIN_NAME, addCommentExtraction);\n\n /**\n * Set of local module ids that have been processed.\n */\n const submittedModules: Set<string | number> = new Set();\n\n /**\n * The text and comments of all minified modules.\n */\n const minifiedModules: IModuleMap = new Map();\n\n /**\n * The text and comments of all minified chunks. Most of these are trivial, but the runtime chunk is a bit larger.\n */\n const minifiedAssets: IAssetMap = new Map();\n\n const metadataByModule: WeakMap<Module, IModuleStats> = new WeakMap();\n const metadataByAssetFileName: Map<string, IAssetStats> = new Map();\n const compilationStatistics: IModuleMinifierPluginStats = {\n metadataByModule,\n metadataByAssetFileName\n };\n compilationMetadataMap.set(compilation, compilationStatistics);\n function getOrCreateMetadata(mod: Module): IModuleStats {\n let moduleStats: IModuleStats | undefined = metadataByModule.get(mod);\n if (!moduleStats) {\n moduleStats = {\n hashByChunk: new Map(),\n sizeByHash: new Map()\n };\n metadataByModule.set(mod, moduleStats);\n }\n return moduleStats;\n }\n\n let pendingMinificationRequests: number = 0;\n /**\n * Indicates that all files have been sent to the minifier and therefore that when pending hits 0, assets can be rehydrated.\n */\n let allRequestsIssued: boolean = false;\n\n let resolveMinifyPromise: () => void;\n\n const postProcessCode: (\n code: sources.ReplaceSource,\n context: IPostProcessFragmentContext\n ) => sources.ReplaceSource = (code: sources.ReplaceSource, context: IPostProcessFragmentContext) =>\n this.hooks.postProcessCodeFragment.call(code, context);\n\n /**\n * Callback to invoke when a file has finished minifying.\n */\n function onFileMinified(): void {\n if (--pendingMinificationRequests === 0 && allRequestsIssued) {\n resolveMinifyPromise();\n }\n }\n\n const { minifier } = this;\n\n let minifierConnection: IMinifierConnection | undefined;\n\n // Typings for this object are not exposed\n // eslint-disable-next-line @typescript-eslint/typedef\n const javascriptHooks = webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation);\n\n /**\n * The minifier needs to know if the module was wrapped in a factory function, because\n * function (module, exports, require) { // <implementation> }\n * minifies to nothing. Unfortunately we can't tell by inspection if the output was wrapped or not.\n * However, the JavaScriptModulesPlugin invokes three hooks in order when rendering a module:\n * 1) renderModuleContent - Invoked for every module.\n * 2) renderModuleContainer - Invoked when wrapping a module in a factory.\n * 3) renderModulePackage - Invoked for every module as the last hook.\n */\n let nextModule: Module | undefined;\n const sourceCache: WeakMap<sources.Source, ISourceCacheEntry> = new WeakMap();\n javascriptHooks.renderModuleContent.tap(TAP_AFTER, (source) => {\n // Clear the identification state of the current module.\n nextModule = undefined;\n return source;\n });\n javascriptHooks.renderModuleContainer.tap(TAP_AFTER, (source, mod) => {\n // Module is being wrapped in a factory, so it is safe for per-module minification\n // Leave external modules in-place to avoid needing special handling for externals\n if (mod.context !== null || !(mod as ExternalModule).externalType) {\n nextModule = mod;\n }\n return source;\n });\n javascriptHooks.renderModulePackage.tap(\n TAP_AFTER,\n /**\n * Extracts the code for the module and sends it to be minified.\n */\n function minifyModule(\n source: sources.Source,\n mod: Module,\n chunkRenderContext: { chunk: Chunk }\n ): sources.Source {\n if (nextModule !== mod) {\n // This module is being inlined. Abandon per-module minification.\n return source;\n }\n\n const id: string | number | null = compilation.chunkGraph.getModuleId(mod);\n\n if (id === null) {\n // This module has no id. Abandon per-module minification.\n return source;\n }\n\n const metadata: IModuleStats = getOrCreateMetadata(mod);\n const cachedResult: ISourceCacheEntry | undefined = sourceCache.get(source);\n if (cachedResult) {\n metadata.hashByChunk.set(chunkRenderContext.chunk, cachedResult.hash);\n return cachedResult.source;\n }\n\n // Get the source code to check its format\n const sourceCode: string = source.source().toString();\n\n // Detect if this is ECMAScript method shorthand format\n const isShorthand: boolean = isMethodShorthandFormat(sourceCode);\n\n // If this module is wrapped in a factory, need to add boilerplate so that the minifier keeps the function\n const wrapped: sources.Source = isShorthand\n ? new ConcatSource(MODULE_WRAPPER_SHORTHAND_PREFIX, source, MODULE_WRAPPER_SHORTHAND_SUFFIX)\n : new ConcatSource(MODULE_WRAPPER_PREFIX + '\\n', source, '\\n' + MODULE_WRAPPER_SUFFIX);\n\n const nameForMap: string = `(modules)/${id}`;\n\n const { source: wrappedCodeRaw, map } = useSourceMaps\n ? wrapped.sourceAndMap()\n : {\n source: wrapped.source(),\n map: undefined\n };\n\n const wrappedCode: string = wrappedCodeRaw.toString();\n const hash: string = hashCodeFragment(wrappedCode);\n metadata.hashByChunk.set(chunkRenderContext.chunk, hash);\n if (!submittedModules.has(hash)) {\n submittedModules.add(hash);\n\n ++pendingMinificationRequests;\n\n minifier.minify(\n {\n hash,\n code: wrappedCode,\n nameForMap: useSourceMaps ? nameForMap : undefined,\n externals: undefined\n },\n (result: IModuleMinificationResult) => {\n if (isMinificationResultError(result)) {\n compilation.errors.push(result.error as WebpackError);\n } else {\n try {\n const { code: minified, map: minifierMap } = result;\n\n const rawOutput: sources.Source = useSourceMaps\n ? new SourceMapSource(\n minified, // Code\n nameForMap, // File\n minifierMap!, // Base source map\n wrappedCode, // Source from before transform\n map!, // Source Map from before transform\n true // Remove original source\n )\n : new RawSource(minified);\n\n const unwrapped: sources.ReplaceSource = new ReplaceSource(rawOutput);\n const len: number = minified.length;\n\n // Trim off the boilerplate used to preserve the factory\n // Use different prefix/suffix lengths for shorthand vs regular format\n // Capture isShorthand from closure instead of looking it up\n if (isShorthand) {\n // For shorthand format: __MINIFY_MODULE__({__DEFAULT_ID__(args){...}});\n // Remove prefix and suffix by their lengths\n unwrapped.replace(0, MODULE_WRAPPER_SHORTHAND_PREFIX.length - 1, '');\n unwrapped.replace(len - MODULE_WRAPPER_SHORTHAND_SUFFIX.length, len - 1, '');\n } else {\n // Regular format: __MINIFY_MODULE__(function(args){...}); or __MINIFY_MODULE__((args)=>{...});\n unwrapped.replace(0, MODULE_WRAPPER_PREFIX.length - 1, '');\n unwrapped.replace(len - MODULE_WRAPPER_SUFFIX.length, len - 1, '');\n }\n\n const withIds: sources.Source = postProcessCode(unwrapped, {\n compilation,\n module: mod,\n loggingName: mod.identifier()\n });\n const cached: sources.CachedSource = new CachedSource(withIds);\n\n const minifiedSize: number = Buffer.byteLength(cached.source(), 'utf-8');\n metadata.sizeByHash.set(hash, minifiedSize);\n\n minifiedModules.set(hash, {\n source: cached,\n module: mod,\n id,\n isShorthand\n });\n } catch (err) {\n compilation.errors.push(err);\n }\n }\n\n onFileMinified();\n }\n );\n }\n\n // Create token with optional ':' prefix for shorthand modules\n // For non-shorthand: __WEBPACK_CHUNK_MODULE__hash (becomes \"id\":__WEBPACK_CHUNK_MODULE__hash in object)\n // For shorthand: :__WEBPACK_CHUNK_MODULE__hash (becomes \"id\"__WEBPACK_CHUNK_MODULE__hash, ':' makes it valid property assignment)\n const tokenPrefix: string = isShorthand ? ':' : '';\n const result: sources.Source = new RawSource(`${tokenPrefix}${CHUNK_MODULE_TOKEN}${hash}`);\n sourceCache.set(source, {\n hash,\n source: result,\n isShorthand\n });\n\n // Return an expression to replace later\n return result;\n }\n );\n\n // The optimizeChunkModules hook is the last async hook that occurs before chunk rendering\n compilation.hooks.optimizeChunkModules.tapPromise(PLUGIN_NAME, async () => {\n minifierConnection = await minifier.connectAsync();\n\n submittedModules.clear();\n });\n\n const isJSAsset: RegExp = /\\.[cm]?js(\\?.+)?$/;\n\n // This should happen before any other tasks that operate during processAssets\n compilation.hooks.processAssets.tapPromise(TAP_BEFORE, async (): Promise<void> => {\n const { chunkGraph, chunks } = compilation;\n\n // Still need to minify the rendered assets\n for (const chunk of chunks) {\n const allChunkModules: Iterable<Module> | undefined =\n chunkGraph.getChunkModulesIterableBySourceType(chunk, 'javascript');\n if (!allChunkModules) {\n // This chunk does not contain javascript modules\n continue;\n }\n\n for (const assetName of chunk.files) {\n const asset: sources.Source = compilation.assets[assetName];\n\n // Verify that this is a JS asset\n if (isJSAsset.test(assetName)) {\n ++pendingMinificationRequests;\n\n const { source: wrappedCodeRaw, map } = useSourceMaps\n ? asset.sourceAndMap()\n : {\n source: asset.source(),\n map: undefined\n };\n\n const rawCode: string = wrappedCodeRaw.toString();\n const nameForMap: string = `(chunks)/${assetName}`;\n\n const hash: string = hashCodeFragment(rawCode);\n\n minifier.minify(\n {\n hash,\n code: rawCode,\n nameForMap: useSourceMaps ? nameForMap : undefined,\n externals: undefined\n },\n (result: IModuleMinificationResult) => {\n if (isMinificationResultError(result)) {\n compilation.errors.push(result.error as WebpackError);\n // eslint-disable-next-line no-console\n console.error(result.error);\n } else {\n try {\n const { code: minified, map: minifierMap } = result;\n\n const rawOutput: sources.Source = useSourceMaps\n ? new SourceMapSource(\n minified, // Code\n nameForMap, // File\n minifierMap ?? undefined, // Base source map\n rawCode, // Source from before transform\n map ?? undefined, // Source Map from before transform\n true // Remove original source\n )\n : new RawSource(minified);\n\n const withIds: sources.Source = postProcessCode(new ReplaceSource(rawOutput), {\n compilation,\n module: undefined,\n loggingName: assetName\n });\n\n minifiedAssets.set(assetName, {\n source: new CachedSource(withIds),\n chunk,\n fileName: assetName,\n renderInfo: new Map(),\n type: 'javascript'\n });\n } catch (err) {\n compilation.errors.push(err);\n }\n }\n\n onFileMinified();\n }\n );\n } else {\n // This isn't a JS asset. Don't try to minify the asset wrapper, though if it contains modules, those might still get replaced with minified versions.\n minifiedAssets.set(assetName, {\n // Still need to restore ids\n source: postProcessCode(new ReplaceSource(asset), {\n compilation,\n module: undefined,\n loggingName: assetName\n }),\n chunk,\n fileName: assetName,\n renderInfo: new Map(),\n type: 'unknown'\n });\n }\n }\n }\n\n allRequestsIssued = true;\n\n if (pendingMinificationRequests) {\n await new Promise<void>((resolve) => {\n resolveMinifyPromise = resolve;\n });\n }\n\n // Handle any error from the minifier.\n await minifierConnection?.disconnectAsync();\n\n // All assets and modules have been minified, hand them off to be rehydrated\n await this.hooks.rehydrateAssets.promise(\n {\n assets: minifiedAssets,\n modules: minifiedModules\n },\n compilation\n );\n });\n\n // Need to update chunk hashes with information from this plugin\n javascriptHooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash): void => {\n // Apply the options hash\n hash.update(binaryConfig);\n // Apply the hash from the minifier\n if (minifierConnection) {\n hash.update(minifierConnection.configHash, 'utf8');\n }\n });\n });\n }\n}\n"]}
@@ -61,6 +61,10 @@ export interface IModuleInfo {
61
61
  * The id of the module, from the chunk graph.
62
62
  */
63
63
  id: string | number;
64
+ /**
65
+ * Whether this module was in method shorthand format
66
+ */
67
+ isShorthand?: boolean;
64
68
  }
65
69
  /**
66
70
  * This is the second parameter to the NormalModuleFactory `module` hook
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleMinifierPlugin.types.d.ts","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ModuleMinifierPlugin.types.d.ts","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleMinifierPlugin.types.js","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.types.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { AsyncSeriesWaterfallHook, SyncWaterfallHook } from 'tapable';\nimport type { Chunk, Compilation, Module, sources } from 'webpack';\nimport type { Comment } from 'estree';\n\nimport type { IModuleMinifier } from '@rushstack/module-minifier';\n\n/**\n * Information about where the module was rendered in the emitted asset.\n * @public\n */\nexport interface IRenderedModulePosition {\n /**\n * The offset from the start of tha asset to the start of the module, in characters.\n */\n charOffset: number;\n /**\n * The length of the rendered module, in characters.\n */\n charLength: number;\n}\n\n/**\n * Information about a dehydrated webpack ECMAScript asset\n * @public\n */\nexport interface IAssetInfo {\n /**\n * The (minified) boilerplate code for the asset. Will contain a token to be replaced by the minified modules.\n */\n source: sources.Source;\n\n /**\n * The name of the asset, used to index into compilation.assets\n */\n fileName: string;\n\n /**\n * The raw chunk object from Webpack, in case information from it is necessary for reconstruction\n */\n chunk: Chunk;\n\n /**\n * Information about the offsets and character lengths for each rendered module in the final asset.\n */\n renderInfo: Map<string | number, IRenderedModulePosition>;\n\n /**\n * The type of the asset\n * @example 'javascript'\n * @example 'css'\n */\n type: string;\n}\n\n/**\n * Information about a minified module\n * @public\n */\nexport interface IModuleInfo {\n /**\n * The (minified) code of this module. Will be a function expression.\n */\n source: sources.Source;\n\n /**\n * The raw module object from Webpack, in case information from it is necessary for reconstruction\n */\n module: Module;\n\n /**\n * The id of the module, from the chunk graph.\n */\n id: string | number;\n}\n\n/**\n * This is the second parameter to the NormalModuleFactory `module` hook\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface _INormalModuleFactoryModuleData {\n resourceResolveData?: {\n /**\n * Contents of the description file (package.json) for the module\n */\n descriptionFileData?: {\n /**\n * The name of the package\n */\n name: string;\n };\n /**\n * Absolute path of the description file (package.json) for the module\n */\n descriptionFilePath?: string;\n /**\n * Absolute path of the directory containing the description file (package.json) for the module\n */\n descriptionFileRoot?: string;\n /**\n * Relative path from the description file (package.json) to the module\n */\n relativePath?: string;\n };\n}\n\n/**\n * Properties surfaced via the `factoryMeta` property on webpack modules\n * @public\n */\nexport interface IFactoryMeta {\n comments?: Comment[];\n skipMinification?: boolean;\n}\n\n/**\n * Statistics from the plugin. Namely module sizes.\n * @public\n */\nexport interface IModuleMinifierPluginStats {\n metadataByModule: WeakMap<Module, IModuleStats>;\n metadataByAssetFileName: Map<string, IAssetStats>;\n}\n\n/**\n * Module size data as a function of the target chunk.\n * @public\n */\nexport interface IModuleStats {\n hashByChunk: Map<Chunk, string>;\n sizeByHash: Map<string, number>;\n}\n\n/**\n * Rendered positional data\n * @public\n */\nexport interface IAssetStats {\n positionByModuleId: Map<string | number, IRenderedModulePosition>;\n}\n\n/**\n * A map from file names to dehydrated assets\n * @public\n */\nexport type IAssetMap = Map<string, IAssetInfo>;\n/**\n * A map from module ids to minified modules\n * @public\n */\nexport type IModuleMap = Map<string | number, IModuleInfo>;\n\n/**\n * Options to the ModuleMinifierPlugin constructor\n * @public\n */\nexport interface IModuleMinifierPluginOptions {\n /**\n * Minifier implementation to use. Required.\n */\n minifier: IModuleMinifier;\n\n /**\n * Whether to enable source map processing. If not provided, will attempt to guess based on `mode` and `devtool` in the webpack config.\n * Set to `false` for faster builds at the expense of debuggability.\n */\n sourceMap?: boolean;\n}\n\n/**\n * The set of data remaining to rehydrate in the current compilation\n * @public\n */\nexport interface IDehydratedAssets {\n /**\n * The set of remaining assets to rehydrate. Each tap may remove some or all assets from this collection\n */\n assets: IAssetMap;\n\n /**\n * The set of modules to use for rehydrating assets.\n */\n modules: IModuleMap;\n}\n\n/**\n * Argument to the postProcessCodeFragment hook for the current execution context\n * @public\n */\nexport interface IPostProcessFragmentContext {\n /**\n * The current webpack compilation, for error reporting\n */\n compilation: Compilation;\n /**\n * A name to use for logging\n */\n loggingName: string;\n /**\n * The current module being processed, or `undefined` if not in a module (e.g. the bootstrapper)\n */\n module: Module | undefined;\n}\n\n/**\n * Hooks provided by the ModuleMinifierPlugin\n * @public\n */\nexport interface IModuleMinifierPluginHooks {\n /**\n * Hook invoked at the start of optimizeChunkAssets to rehydrate the minified boilerplate and runtime into chunk assets.\n */\n rehydrateAssets: AsyncSeriesWaterfallHook<[IDehydratedAssets, Compilation]>;\n\n /**\n * Hook invoked on code after it has been returned from the minifier.\n */\n postProcessCodeFragment: SyncWaterfallHook<[sources.ReplaceSource, IPostProcessFragmentContext]>;\n}\n"]}
1
+ {"version":3,"file":"ModuleMinifierPlugin.types.js","sourceRoot":"","sources":["../src/ModuleMinifierPlugin.types.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { AsyncSeriesWaterfallHook, SyncWaterfallHook } from 'tapable';\nimport type { Chunk, Compilation, Module, sources } from 'webpack';\nimport type { Comment } from 'estree';\n\nimport type { IModuleMinifier } from '@rushstack/module-minifier';\n\n/**\n * Information about where the module was rendered in the emitted asset.\n * @public\n */\nexport interface IRenderedModulePosition {\n /**\n * The offset from the start of tha asset to the start of the module, in characters.\n */\n charOffset: number;\n /**\n * The length of the rendered module, in characters.\n */\n charLength: number;\n}\n\n/**\n * Information about a dehydrated webpack ECMAScript asset\n * @public\n */\nexport interface IAssetInfo {\n /**\n * The (minified) boilerplate code for the asset. Will contain a token to be replaced by the minified modules.\n */\n source: sources.Source;\n\n /**\n * The name of the asset, used to index into compilation.assets\n */\n fileName: string;\n\n /**\n * The raw chunk object from Webpack, in case information from it is necessary for reconstruction\n */\n chunk: Chunk;\n\n /**\n * Information about the offsets and character lengths for each rendered module in the final asset.\n */\n renderInfo: Map<string | number, IRenderedModulePosition>;\n\n /**\n * The type of the asset\n * @example 'javascript'\n * @example 'css'\n */\n type: string;\n}\n\n/**\n * Information about a minified module\n * @public\n */\nexport interface IModuleInfo {\n /**\n * The (minified) code of this module. Will be a function expression.\n */\n source: sources.Source;\n\n /**\n * The raw module object from Webpack, in case information from it is necessary for reconstruction\n */\n module: Module;\n\n /**\n * The id of the module, from the chunk graph.\n */\n id: string | number;\n\n /**\n * Whether this module was in method shorthand format\n */\n isShorthand?: boolean;\n}\n\n/**\n * This is the second parameter to the NormalModuleFactory `module` hook\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface _INormalModuleFactoryModuleData {\n resourceResolveData?: {\n /**\n * Contents of the description file (package.json) for the module\n */\n descriptionFileData?: {\n /**\n * The name of the package\n */\n name: string;\n };\n /**\n * Absolute path of the description file (package.json) for the module\n */\n descriptionFilePath?: string;\n /**\n * Absolute path of the directory containing the description file (package.json) for the module\n */\n descriptionFileRoot?: string;\n /**\n * Relative path from the description file (package.json) to the module\n */\n relativePath?: string;\n };\n}\n\n/**\n * Properties surfaced via the `factoryMeta` property on webpack modules\n * @public\n */\nexport interface IFactoryMeta {\n comments?: Comment[];\n skipMinification?: boolean;\n}\n\n/**\n * Statistics from the plugin. Namely module sizes.\n * @public\n */\nexport interface IModuleMinifierPluginStats {\n metadataByModule: WeakMap<Module, IModuleStats>;\n metadataByAssetFileName: Map<string, IAssetStats>;\n}\n\n/**\n * Module size data as a function of the target chunk.\n * @public\n */\nexport interface IModuleStats {\n hashByChunk: Map<Chunk, string>;\n sizeByHash: Map<string, number>;\n}\n\n/**\n * Rendered positional data\n * @public\n */\nexport interface IAssetStats {\n positionByModuleId: Map<string | number, IRenderedModulePosition>;\n}\n\n/**\n * A map from file names to dehydrated assets\n * @public\n */\nexport type IAssetMap = Map<string, IAssetInfo>;\n/**\n * A map from module ids to minified modules\n * @public\n */\nexport type IModuleMap = Map<string | number, IModuleInfo>;\n\n/**\n * Options to the ModuleMinifierPlugin constructor\n * @public\n */\nexport interface IModuleMinifierPluginOptions {\n /**\n * Minifier implementation to use. Required.\n */\n minifier: IModuleMinifier;\n\n /**\n * Whether to enable source map processing. If not provided, will attempt to guess based on `mode` and `devtool` in the webpack config.\n * Set to `false` for faster builds at the expense of debuggability.\n */\n sourceMap?: boolean;\n}\n\n/**\n * The set of data remaining to rehydrate in the current compilation\n * @public\n */\nexport interface IDehydratedAssets {\n /**\n * The set of remaining assets to rehydrate. Each tap may remove some or all assets from this collection\n */\n assets: IAssetMap;\n\n /**\n * The set of modules to use for rehydrating assets.\n */\n modules: IModuleMap;\n}\n\n/**\n * Argument to the postProcessCodeFragment hook for the current execution context\n * @public\n */\nexport interface IPostProcessFragmentContext {\n /**\n * The current webpack compilation, for error reporting\n */\n compilation: Compilation;\n /**\n * A name to use for logging\n */\n loggingName: string;\n /**\n * The current module being processed, or `undefined` if not in a module (e.g. the bootstrapper)\n */\n module: Module | undefined;\n}\n\n/**\n * Hooks provided by the ModuleMinifierPlugin\n * @public\n */\nexport interface IModuleMinifierPluginHooks {\n /**\n * Hook invoked at the start of optimizeChunkAssets to rehydrate the minified boilerplate and runtime into chunk assets.\n */\n rehydrateAssets: AsyncSeriesWaterfallHook<[IDehydratedAssets, Compilation]>;\n\n /**\n * Hook invoked on code after it has been returned from the minifier.\n */\n postProcessCodeFragment: SyncWaterfallHook<[sources.ReplaceSource, IPostProcessFragmentContext]>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"RehydrateAsset.d.ts","sourceRoot":"","sources":["../src/RehydrateAsset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGpD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAe,MAAM,8BAA8B,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC,MAAM,CAwEhB"}
1
+ {"version":3,"file":"RehydrateAsset.d.ts","sourceRoot":"","sources":["../src/RehydrateAsset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGpD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAe,MAAM,8BAA8B,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC,MAAM,CAwFhB"}
@@ -29,7 +29,8 @@ function rehydrateAsset(compilation, asset, moduleMap, banner, emitRenderInfo) {
29
29
  // RegExp.exec uses null or an array as the return type, explicitly
30
30
  let match = null;
31
31
  while ((match = Constants_1.CHUNK_MODULE_REGEX.exec(assetCode))) {
32
- const hash = match[1];
32
+ const leadingColon = match[1]; // Captured ':' or empty string
33
+ const hash = match[2]; // The module hash
33
34
  const moduleSource = moduleMap.get(hash);
34
35
  if (moduleSource === undefined) {
35
36
  compilation.errors.push(new WebpackError(`Missing module source for ${hash} in ${asset.fileName}!`));
@@ -39,6 +40,13 @@ function rehydrateAsset(compilation, asset, moduleMap, banner, emitRenderInfo) {
39
40
  charOffset += separator.size();
40
41
  lastStart = Constants_1.CHUNK_MODULE_REGEX.lastIndex;
41
42
  if (moduleSource) {
43
+ // Check if this module was in shorthand format
44
+ const isShorthand = moduleSource.isShorthand === true;
45
+ // For shorthand format, omit the colon. For regular format, keep it.
46
+ if (!isShorthand && leadingColon) {
47
+ source.add(leadingColon);
48
+ charOffset += leadingColon.length;
49
+ }
42
50
  const charLength = moduleSource.source.source().length;
43
51
  if (emitRenderInfo) {
44
52
  asset.renderInfo.set(moduleSource.id, {
@@ -50,6 +58,11 @@ function rehydrateAsset(compilation, asset, moduleMap, banner, emitRenderInfo) {
50
58
  charOffset += charLength;
51
59
  }
52
60
  else {
61
+ // Keep the colon if present for error module
62
+ if (leadingColon) {
63
+ source.add(leadingColon);
64
+ charOffset += leadingColon.length;
65
+ }
53
66
  const errorModule = `()=>{throw new Error(\`Missing module with hash "${hash}"\`)}`;
54
67
  source.add(errorModule);
55
68
  charOffset += errorModule.length;
@@ -1 +1 @@
1
- {"version":3,"file":"RehydrateAsset.js","sourceRoot":"","sources":["../src/RehydrateAsset.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { sources, Compilation } from 'webpack';\n\nimport { CHUNK_MODULE_TOKEN, CHUNK_MODULE_REGEX } from './Constants';\nimport type { IAssetInfo, IModuleMap, IModuleInfo } from './ModuleMinifierPlugin.types';\n\n/**\n * Rehydrates an asset with minified modules.\n * @param asset - The asset\n * @param moduleMap - The minified modules\n * @param banner - A banner to inject for license information\n * @public\n */\nexport function rehydrateAsset(\n compilation: Compilation,\n asset: IAssetInfo,\n moduleMap: IModuleMap,\n banner: string,\n emitRenderInfo?: boolean\n): sources.Source {\n const { source: assetSource } = asset;\n const {\n webpack: { sources, WebpackError }\n } = compilation.compiler;\n\n const assetCode: string = assetSource.source().toString();\n\n const tokenIndex: number = assetCode.indexOf(CHUNK_MODULE_TOKEN);\n if (tokenIndex < 0) {\n // This is not a JS asset.\n return assetSource;\n }\n\n const { CachedSource, ConcatSource, ReplaceSource } = sources;\n\n CHUNK_MODULE_REGEX.lastIndex = -1;\n let lastStart: number = 0;\n\n const cachedAssetSource: sources.CachedSource = new CachedSource(assetSource);\n\n const source: sources.ConcatSource = new ConcatSource(banner);\n let charOffset: number = banner.length;\n\n // RegExp.exec uses null or an array as the return type, explicitly\n let match: RegExpExecArray | null = null;\n while ((match = CHUNK_MODULE_REGEX.exec(assetCode))) {\n const hash: string = match[1];\n\n const moduleSource: IModuleInfo | undefined = moduleMap.get(hash);\n if (moduleSource === undefined) {\n compilation.errors.push(new WebpackError(`Missing module source for ${hash} in ${asset.fileName}!`));\n }\n\n const separator: sources.ReplaceSource = extractSegmentFromSource(\n ReplaceSource,\n cachedAssetSource,\n lastStart,\n match.index\n );\n\n source.add(separator);\n charOffset += separator.size();\n\n lastStart = CHUNK_MODULE_REGEX.lastIndex;\n\n if (moduleSource) {\n const charLength: number = moduleSource.source.source().length;\n\n if (emitRenderInfo) {\n asset.renderInfo.set(moduleSource.id, {\n charOffset,\n charLength\n });\n }\n\n source.add(moduleSource.source);\n charOffset += charLength;\n } else {\n const errorModule: string = `()=>{throw new Error(\\`Missing module with hash \"${hash}\"\\`)}`;\n\n source.add(errorModule);\n charOffset += errorModule.length;\n }\n\n source.add('\\n');\n charOffset += 1;\n }\n\n source.add(extractSegmentFromSource(ReplaceSource, cachedAssetSource, lastStart, Infinity));\n\n return new CachedSource(source);\n}\n\n// In order to preserve source maps during substitution, have to use a ConcatSource instead of a ReplaceSource, so need to extract the segements from the original\nfunction extractSegmentFromSource(\n replaceSourceConstructor: typeof sources.ReplaceSource,\n source: sources.Source,\n start: number,\n end: number\n): sources.ReplaceSource {\n const result: sources.ReplaceSource = new replaceSourceConstructor(source);\n result.replace(end, Infinity, '');\n result.replace(0, start - 1, '');\n return result;\n}\n"]}
1
+ {"version":3,"file":"RehydrateAsset.js","sourceRoot":"","sources":["../src/RehydrateAsset.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { sources, Compilation } from 'webpack';\n\nimport { CHUNK_MODULE_TOKEN, CHUNK_MODULE_REGEX } from './Constants';\nimport type { IAssetInfo, IModuleMap, IModuleInfo } from './ModuleMinifierPlugin.types';\n\n/**\n * Rehydrates an asset with minified modules.\n * @param asset - The asset\n * @param moduleMap - The minified modules\n * @param banner - A banner to inject for license information\n * @public\n */\nexport function rehydrateAsset(\n compilation: Compilation,\n asset: IAssetInfo,\n moduleMap: IModuleMap,\n banner: string,\n emitRenderInfo?: boolean\n): sources.Source {\n const { source: assetSource } = asset;\n const {\n webpack: { sources, WebpackError }\n } = compilation.compiler;\n\n const assetCode: string = assetSource.source().toString();\n\n const tokenIndex: number = assetCode.indexOf(CHUNK_MODULE_TOKEN);\n if (tokenIndex < 0) {\n // This is not a JS asset.\n return assetSource;\n }\n\n const { CachedSource, ConcatSource, ReplaceSource } = sources;\n\n CHUNK_MODULE_REGEX.lastIndex = -1;\n let lastStart: number = 0;\n\n const cachedAssetSource: sources.CachedSource = new CachedSource(assetSource);\n\n const source: sources.ConcatSource = new ConcatSource(banner);\n let charOffset: number = banner.length;\n\n // RegExp.exec uses null or an array as the return type, explicitly\n let match: RegExpExecArray | null = null;\n while ((match = CHUNK_MODULE_REGEX.exec(assetCode))) {\n const leadingColon: string = match[1]; // Captured ':' or empty string\n const hash: string = match[2]; // The module hash\n\n const moduleSource: IModuleInfo | undefined = moduleMap.get(hash);\n if (moduleSource === undefined) {\n compilation.errors.push(new WebpackError(`Missing module source for ${hash} in ${asset.fileName}!`));\n }\n\n const separator: sources.ReplaceSource = extractSegmentFromSource(\n ReplaceSource,\n cachedAssetSource,\n lastStart,\n match.index\n );\n\n source.add(separator);\n charOffset += separator.size();\n\n lastStart = CHUNK_MODULE_REGEX.lastIndex;\n\n if (moduleSource) {\n // Check if this module was in shorthand format\n const isShorthand: boolean = moduleSource.isShorthand === true;\n\n // For shorthand format, omit the colon. For regular format, keep it.\n if (!isShorthand && leadingColon) {\n source.add(leadingColon);\n charOffset += leadingColon.length;\n }\n\n const charLength: number = moduleSource.source.source().length;\n\n if (emitRenderInfo) {\n asset.renderInfo.set(moduleSource.id, {\n charOffset,\n charLength\n });\n }\n\n source.add(moduleSource.source);\n charOffset += charLength;\n } else {\n // Keep the colon if present for error module\n if (leadingColon) {\n source.add(leadingColon);\n charOffset += leadingColon.length;\n }\n\n const errorModule: string = `()=>{throw new Error(\\`Missing module with hash \"${hash}\"\\`)}`;\n\n source.add(errorModule);\n charOffset += errorModule.length;\n }\n\n source.add('\\n');\n charOffset += 1;\n }\n\n source.add(extractSegmentFromSource(ReplaceSource, cachedAssetSource, lastStart, Infinity));\n\n return new CachedSource(source);\n}\n\n// In order to preserve source maps during substitution, have to use a ConcatSource instead of a ReplaceSource, so need to extract the segements from the original\nfunction extractSegmentFromSource(\n replaceSourceConstructor: typeof sources.ReplaceSource,\n source: sources.Source,\n start: number,\n end: number\n): sources.ReplaceSource {\n const result: sources.ReplaceSource = new replaceSourceConstructor(source);\n result.replace(end, Infinity, '');\n result.replace(0, start - 1, '');\n return result;\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { MODULE_WRAPPER_PREFIX, MODULE_WRAPPER_SUFFIX, CHUNK_MODULE_TOKEN, CHUNK_MODULE_REGEX, STAGE_BEFORE, STAGE_AFTER } from './Constants';
1
+ export { MODULE_WRAPPER_PREFIX, MODULE_WRAPPER_SUFFIX, MODULE_WRAPPER_SHORTHAND_PREFIX, MODULE_WRAPPER_SHORTHAND_SUFFIX, CHUNK_MODULE_TOKEN, CHUNK_MODULE_REGEX, STAGE_BEFORE, STAGE_AFTER } from './Constants';
2
2
  export { generateLicenseFileForAsset } from './GenerateLicenseFileForAsset';
3
3
  export type { IAssetInfo, IAssetMap, IAssetStats, IDehydratedAssets, IFactoryMeta, IModuleInfo, IModuleMap, IModuleMinifierPluginHooks, IModuleMinifierPluginOptions, IModuleMinifierPluginStats, IModuleStats, IPostProcessFragmentContext, IRenderedModulePosition } from './ModuleMinifierPlugin.types';
4
4
  export { ModuleMinifierPlugin } from './ModuleMinifierPlugin';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,YAAY,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,YAAY,EACZ,2BAA2B,EAC3B,uBAAuB,EACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,YAAY,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,YAAY,EACZ,2BAA2B,EAC3B,uBAAuB,EACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
package/lib/index.js CHANGED
@@ -2,10 +2,12 @@
2
2
  // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
3
  // See LICENSE in the project root for license information.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.ModuleMinifierPlugin = exports.generateLicenseFileForAsset = exports.STAGE_AFTER = exports.STAGE_BEFORE = exports.CHUNK_MODULE_REGEX = exports.CHUNK_MODULE_TOKEN = exports.MODULE_WRAPPER_SUFFIX = exports.MODULE_WRAPPER_PREFIX = void 0;
5
+ exports.ModuleMinifierPlugin = exports.generateLicenseFileForAsset = exports.STAGE_AFTER = exports.STAGE_BEFORE = exports.CHUNK_MODULE_REGEX = exports.CHUNK_MODULE_TOKEN = exports.MODULE_WRAPPER_SHORTHAND_SUFFIX = exports.MODULE_WRAPPER_SHORTHAND_PREFIX = exports.MODULE_WRAPPER_SUFFIX = exports.MODULE_WRAPPER_PREFIX = void 0;
6
6
  var Constants_1 = require("./Constants");
7
7
  Object.defineProperty(exports, "MODULE_WRAPPER_PREFIX", { enumerable: true, get: function () { return Constants_1.MODULE_WRAPPER_PREFIX; } });
8
8
  Object.defineProperty(exports, "MODULE_WRAPPER_SUFFIX", { enumerable: true, get: function () { return Constants_1.MODULE_WRAPPER_SUFFIX; } });
9
+ Object.defineProperty(exports, "MODULE_WRAPPER_SHORTHAND_PREFIX", { enumerable: true, get: function () { return Constants_1.MODULE_WRAPPER_SHORTHAND_PREFIX; } });
10
+ Object.defineProperty(exports, "MODULE_WRAPPER_SHORTHAND_SUFFIX", { enumerable: true, get: function () { return Constants_1.MODULE_WRAPPER_SHORTHAND_SUFFIX; } });
9
11
  Object.defineProperty(exports, "CHUNK_MODULE_TOKEN", { enumerable: true, get: function () { return Constants_1.CHUNK_MODULE_TOKEN; } });
10
12
  Object.defineProperty(exports, "CHUNK_MODULE_REGEX", { enumerable: true, get: function () { return Constants_1.CHUNK_MODULE_REGEX; } });
11
13
  Object.defineProperty(exports, "STAGE_BEFORE", { enumerable: true, get: function () { return Constants_1.STAGE_BEFORE; } });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,yCAOqB;AANnB,kHAAA,qBAAqB,OAAA;AACrB,kHAAA,qBAAqB,OAAA;AACrB,+GAAA,kBAAkB,OAAA;AAClB,+GAAA,kBAAkB,OAAA;AAClB,yGAAA,YAAY,OAAA;AACZ,wGAAA,WAAW,OAAA;AAEb,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AAgBpC,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nexport {\n MODULE_WRAPPER_PREFIX,\n MODULE_WRAPPER_SUFFIX,\n CHUNK_MODULE_TOKEN,\n CHUNK_MODULE_REGEX,\n STAGE_BEFORE,\n STAGE_AFTER\n} from './Constants';\nexport { generateLicenseFileForAsset } from './GenerateLicenseFileForAsset';\nexport type {\n IAssetInfo,\n IAssetMap,\n IAssetStats,\n IDehydratedAssets,\n IFactoryMeta,\n IModuleInfo,\n IModuleMap,\n IModuleMinifierPluginHooks,\n IModuleMinifierPluginOptions,\n IModuleMinifierPluginStats,\n IModuleStats,\n IPostProcessFragmentContext,\n IRenderedModulePosition\n} from './ModuleMinifierPlugin.types';\nexport { ModuleMinifierPlugin } from './ModuleMinifierPlugin';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,yCASqB;AARnB,kHAAA,qBAAqB,OAAA;AACrB,kHAAA,qBAAqB,OAAA;AACrB,4HAAA,+BAA+B,OAAA;AAC/B,4HAAA,+BAA+B,OAAA;AAC/B,+GAAA,kBAAkB,OAAA;AAClB,+GAAA,kBAAkB,OAAA;AAClB,yGAAA,YAAY,OAAA;AACZ,wGAAA,WAAW,OAAA;AAEb,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AAgBpC,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nexport {\n MODULE_WRAPPER_PREFIX,\n MODULE_WRAPPER_SUFFIX,\n MODULE_WRAPPER_SHORTHAND_PREFIX,\n MODULE_WRAPPER_SHORTHAND_SUFFIX,\n CHUNK_MODULE_TOKEN,\n CHUNK_MODULE_REGEX,\n STAGE_BEFORE,\n STAGE_AFTER\n} from './Constants';\nexport { generateLicenseFileForAsset } from './GenerateLicenseFileForAsset';\nexport type {\n IAssetInfo,\n IAssetMap,\n IAssetStats,\n IDehydratedAssets,\n IFactoryMeta,\n IModuleInfo,\n IModuleMap,\n IModuleMinifierPluginHooks,\n IModuleMinifierPluginOptions,\n IModuleMinifierPluginStats,\n IModuleStats,\n IPostProcessFragmentContext,\n IRenderedModulePosition\n} from './ModuleMinifierPlugin.types';\nexport { ModuleMinifierPlugin } from './ModuleMinifierPlugin';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rushstack/webpack5-module-minifier-plugin",
3
- "version": "5.6.13",
3
+ "version": "5.7.0",
4
4
  "description": "This plugin splits minification of webpack compilations into smaller units.",
5
5
  "main": "lib/index.js",
6
6
  "typings": "dist/webpack5-module-minifier-plugin.d.ts",
@@ -22,16 +22,16 @@
22
22
  "@types/tapable": "1.0.6",
23
23
  "@types/estree": "1.0.8",
24
24
  "tapable": "2.2.1",
25
- "@rushstack/worker-pool": "0.6.13"
25
+ "@rushstack/worker-pool": "0.6.14"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "20.17.19",
29
29
  "eslint": "~9.37.0",
30
30
  "memfs": "4.12.0",
31
- "webpack": "~5.103.0",
32
- "@rushstack/heft": "1.1.13",
31
+ "webpack": "~5.105.2",
32
+ "@rushstack/heft": "1.1.14",
33
33
  "local-node-rig": "1.0.0",
34
- "@rushstack/module-minifier": "0.8.13"
34
+ "@rushstack/module-minifier": "0.8.14"
35
35
  },
36
36
  "sideEffects": false,
37
37
  "peerDependenciesMeta": {