From f378471064a12896e79a168f8673540805fb261e Mon Sep 17 00:00:00 2001 From: hai-x Date: Sun, 20 Apr 2025 02:32:59 +0800 Subject: [PATCH 1/4] fix: ensure HMR recover gracefully when `module render error` occur --- lib/HotModuleReplacementPlugin.js | 32 ++++++++++++++++++++++--------- lib/css/CssModulesPlugin.js | 8 +++++--- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/HotModuleReplacementPlugin.js b/lib/HotModuleReplacementPlugin.js index 4672e2fc9..27b3461be 100644 --- a/lib/HotModuleReplacementPlugin.js +++ b/lib/HotModuleReplacementPlugin.js @@ -41,6 +41,7 @@ const { JAVASCRIPT_MODULE_TYPE_ESM, WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants"); +const ChunkRenderError = require("./ChunkRenderError"); /** @typedef {import("estree").CallExpression} CallExpression */ /** @typedef {import("estree").Expression} Expression */ @@ -731,15 +732,28 @@ class HotModuleReplacementPlugin { entry.pathOptions )); } - const source = entry.render(); - compilation.additionalChunkAssets.push(filename); - compilation.emitAsset(filename, source, { - hotModuleReplacement: true, - ...assetInfo - }); - if (currentChunk) { - currentChunk.files.add(filename); - compilation.hooks.chunkAsset.call(currentChunk, filename); + let source; + try { + source = entry.render(); + } catch (err) { + compilation.errors.push( + new ChunkRenderError( + hotUpdateChunk, + filename, + /** @type {Error} */ (err) + ) + ); + } + if (source) { + compilation.additionalChunkAssets.push(filename); + compilation.emitAsset(filename, source, { + hotModuleReplacement: true, + ...assetInfo + }); + if (currentChunk) { + currentChunk.files.add(filename); + compilation.hooks.chunkAsset.call(currentChunk, filename); + } } } forEachRuntime(newRuntime, runtime => { diff --git a/lib/css/CssModulesPlugin.js b/lib/css/CssModulesPlugin.js index b2d60bb6d..64549caa6 100644 --- a/lib/css/CssModulesPlugin.js +++ b/lib/css/CssModulesPlugin.js @@ -385,9 +385,11 @@ class CssModulesPlugin { compilation ).renderModuleContent.tap(PLUGIN_NAME, (source, module) => { if (module instanceof CssModule && module.hot) { - const exports = - /** @type {BuildInfo} */ - (module.buildInfo).cssData.exports; + const cssData = /** @type {BuildInfo} */ (module.buildInfo).cssData; + if (!cssData) { + return source; + } + const exports = cssData.exports; const stringifiedExports = JSON.stringify( JSON.stringify( Array.from(exports).reduce((obj, [key, value]) => { From 0414fd4f1cc26e5f6d48686ea3e3670729393288 Mon Sep 17 00:00:00 2001 From: hai-x Date: Tue, 22 Apr 2025 23:25:28 +0800 Subject: [PATCH 2/4] Add test --- lib/HotModuleReplacementPlugin.js | 2 +- lib/index.js | 3 ++ .../errors1.js | 10 +++++ .../index.css | 7 ++++ .../index.js | 12 ++++++ .../test.filter.js | 3 ++ .../webpack.config.js | 39 +++++++++++++++++++ types.d.ts | 15 ++++++- 8 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 test/hotCases/recover/recover-after-css-module-render-error/errors1.js create mode 100644 test/hotCases/recover/recover-after-css-module-render-error/index.css create mode 100644 test/hotCases/recover/recover-after-css-module-render-error/index.js create mode 100644 test/hotCases/recover/recover-after-css-module-render-error/test.filter.js create mode 100644 test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js diff --git a/lib/HotModuleReplacementPlugin.js b/lib/HotModuleReplacementPlugin.js index 27b3461be..20c6cb21e 100644 --- a/lib/HotModuleReplacementPlugin.js +++ b/lib/HotModuleReplacementPlugin.js @@ -35,13 +35,13 @@ const { intersectRuntime } = require("./util/runtime"); +const ChunkRenderError = require("./ChunkRenderError"); const { JAVASCRIPT_MODULE_TYPE_AUTO, JAVASCRIPT_MODULE_TYPE_DYNAMIC, JAVASCRIPT_MODULE_TYPE_ESM, WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants"); -const ChunkRenderError = require("./ChunkRenderError"); /** @typedef {import("estree").CallExpression} CallExpression */ /** @typedef {import("estree").Expression} Expression */ diff --git a/lib/index.js b/lib/index.js index 21bcb469d..5a8ae9fe5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -550,6 +550,9 @@ module.exports = mergeExports(fn, { css: { get CssModulesPlugin() { return require("./css/CssModulesPlugin"); + }, + get CssModule() { + return require("./CssModule"); } }, diff --git a/test/hotCases/recover/recover-after-css-module-render-error/errors1.js b/test/hotCases/recover/recover-after-css-module-render-error/errors1.js new file mode 100644 index 000000000..6a04211b6 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-module-render-error/errors1.js @@ -0,0 +1,10 @@ +module.exports = [ + [ + // main.js render error + /Failed/ + ], + [ + // main.hot-update.js render error + /Failed/ + ] +]; diff --git a/test/hotCases/recover/recover-after-css-module-render-error/index.css b/test/hotCases/recover/recover-after-css-module-render-error/index.css new file mode 100644 index 000000000..019649bbb --- /dev/null +++ b/test/hotCases/recover/recover-after-css-module-render-error/index.css @@ -0,0 +1,7 @@ +.html { + color: red; +} +--- +html { + color: blue; +}Failed \ No newline at end of file diff --git a/test/hotCases/recover/recover-after-css-module-render-error/index.js b/test/hotCases/recover/recover-after-css-module-render-error/index.js new file mode 100644 index 000000000..844c31576 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-module-render-error/index.js @@ -0,0 +1,12 @@ +import "./index.css"; + +it("should work", done => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: red;"); + NEXT( + require("../../update")(done, true, () => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: blue;"); + }) + ); +}); diff --git a/test/hotCases/recover/recover-after-css-module-render-error/test.filter.js b/test/hotCases/recover/recover-after-css-module-render-error/test.filter.js new file mode 100644 index 000000000..2be506ab0 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-module-render-error/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return config.target === "web"; +}; diff --git a/test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js b/test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js new file mode 100644 index 000000000..b0610030a --- /dev/null +++ b/test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js @@ -0,0 +1,39 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: ["./index.js"], + experiments: { + css: true + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.additionalTreeRuntimeRequirements.tap( + "Test", + (module, set, context) => { + // To prevent the runtime error `ReferenceError: __webpack_exports__ is not defined`, + // which occurs because the default `output.library` setting is `commonjs2`, + // resulting in adding `module.exports = __webpack_exports__;`. + set.add(webpack.RuntimeGlobals.startup); + set.add(webpack.RuntimeGlobals.exports); + } + ); + + webpack.javascript.JavascriptModulesPlugin.getCompilationHooks( + compilation + ).renderModuleContent.tap("Test", (source, module) => { + if (module instanceof webpack.css.CssModule && module.hot) { + const s = module._source.source(); + if (s.includes("Failed")) { + throw new Error("Failed"); + } + } + return source; + }); + }); + } + } + ] +}; diff --git a/types.d.ts b/types.d.ts index 7a33b50d9..b5c4fd827 100644 --- a/types.d.ts +++ b/types.d.ts @@ -906,6 +906,12 @@ declare abstract class ByTypeGenerator extends Generator { ) => null | Source; } declare const CIRCULAR_CONNECTION: unique symbol; +type CSSModuleCreateData = NormalModuleCreateData & { + cssLayer: CssLayer; + supports: Supports; + media: Media; + inheritance: [CssLayer, Supports, Media][]; +}; declare class Cache { constructor(); hooks: { @@ -3278,11 +3284,16 @@ declare interface CssLoadingRuntimeModulePluginHooks { linkPreload: SyncWaterfallHook<[string, Chunk]>; linkPrefetch: SyncWaterfallHook<[string, Chunk]>; } -declare abstract class CssModule extends NormalModule { +declare class CssModule extends NormalModule { + constructor(options: CSSModuleCreateData); cssLayer: CssLayer; supports: Supports; media: Media; inheritance: [CssLayer, Supports, Media][]; + static deserialize(context: ObjectDeserializerContext): CssModule; + static getCompilationHooks( + compilation: Compilation + ): NormalModuleCompilationHooks; } /** @@ -16550,7 +16561,7 @@ declare namespace exports { export { AsyncWebAssemblyModulesPlugin, EnableWasmLoadingPlugin }; } export namespace css { - export { CssModulesPlugin }; + export { CssModulesPlugin, CssModule }; } export namespace library { export { AbstractLibraryPlugin, EnableLibraryPlugin }; From af2acc56e849cbea455da00a7fc9d2a61b18e59b Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Wed, 23 Apr 2025 05:06:20 +0300 Subject: [PATCH 3/4] test: refactor --- lib/FlagDependencyExportsPlugin.js | 3 +- lib/HotModuleReplacementPlugin.js | 32 ++--- lib/Module.js | 31 +++-- lib/NormalModule.js | 6 +- lib/css/CssGenerator.js | 2 +- lib/css/CssModulesPlugin.js | 2 +- lib/index.js | 3 - .../recover-after-css-loader-error/errors1.js | 3 + .../recover-after-css-loader-error/index.js | 25 ++++ .../recover-after-css-loader-error/loader.js | 10 ++ .../recover-after-css-loader-error/style.css | 11 ++ .../test.filter.js | 0 .../webpack.config.js | 6 + .../errors1.js | 10 -- .../index.css | 7 -- .../index.js | 12 -- .../webpack.config.js | 39 ------ types.d.ts | 112 +++++++++++++++--- 18 files changed, 187 insertions(+), 127 deletions(-) create mode 100644 test/hotCases/recover/recover-after-css-loader-error/errors1.js create mode 100644 test/hotCases/recover/recover-after-css-loader-error/index.js create mode 100644 test/hotCases/recover/recover-after-css-loader-error/loader.js create mode 100644 test/hotCases/recover/recover-after-css-loader-error/style.css rename test/hotCases/recover/{recover-after-css-module-render-error => recover-after-css-loader-error}/test.filter.js (100%) create mode 100644 test/hotCases/recover/recover-after-css-loader-error/webpack.config.js delete mode 100644 test/hotCases/recover/recover-after-css-module-render-error/errors1.js delete mode 100644 test/hotCases/recover/recover-after-css-module-render-error/index.css delete mode 100644 test/hotCases/recover/recover-after-css-module-render-error/index.js delete mode 100644 test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js diff --git a/lib/FlagDependencyExportsPlugin.js b/lib/FlagDependencyExportsPlugin.js index c7737d4b4..dd984e0e5 100644 --- a/lib/FlagDependencyExportsPlugin.js +++ b/lib/FlagDependencyExportsPlugin.js @@ -369,7 +369,8 @@ class FlagDependencyExportsPlugin { (module, callback) => { if ( typeof ( - /** @type {BuildInfo} */ (module.buildInfo).hash + /** @type {BuildInfo} */ + (module.buildInfo).hash ) !== "string" ) { // not cacheable diff --git a/lib/HotModuleReplacementPlugin.js b/lib/HotModuleReplacementPlugin.js index 20c6cb21e..4672e2fc9 100644 --- a/lib/HotModuleReplacementPlugin.js +++ b/lib/HotModuleReplacementPlugin.js @@ -35,7 +35,6 @@ const { intersectRuntime } = require("./util/runtime"); -const ChunkRenderError = require("./ChunkRenderError"); const { JAVASCRIPT_MODULE_TYPE_AUTO, JAVASCRIPT_MODULE_TYPE_DYNAMIC, @@ -732,28 +731,15 @@ class HotModuleReplacementPlugin { entry.pathOptions )); } - let source; - try { - source = entry.render(); - } catch (err) { - compilation.errors.push( - new ChunkRenderError( - hotUpdateChunk, - filename, - /** @type {Error} */ (err) - ) - ); - } - if (source) { - compilation.additionalChunkAssets.push(filename); - compilation.emitAsset(filename, source, { - hotModuleReplacement: true, - ...assetInfo - }); - if (currentChunk) { - currentChunk.files.add(filename); - compilation.hooks.chunkAsset.call(currentChunk, filename); - } + const source = entry.render(); + compilation.additionalChunkAssets.push(filename); + compilation.emitAsset(filename, source, { + hotModuleReplacement: true, + ...assetInfo + }); + if (currentChunk) { + currentChunk.files.add(filename); + compilation.hooks.chunkAsset.call(currentChunk, filename); } } forEachRuntime(newRuntime, runtime => { diff --git a/lib/Module.js b/lib/Module.js index ba45bfeae..c654d1633 100644 --- a/lib/Module.js +++ b/lib/Module.js @@ -28,6 +28,7 @@ const makeSerializable = require("./util/makeSerializable"); /** @typedef {import("./ConcatenationScope")} ConcatenationScope */ /** @typedef {import("./Dependency")} Dependency */ /** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */ +/** @typedef {import("./DependencyTemplate").CssData} CssData */ /** @typedef {import("./DependencyTemplates")} DependencyTemplates */ /** @typedef {import("./ExportsInfo").UsageStateType} UsageStateType */ /** @typedef {import("./FileSystemInfo")} FileSystemInfo */ @@ -120,19 +121,25 @@ const makeSerializable = require("./util/makeSerializable"); * @typedef {object} KnownBuildInfo * @property {boolean=} cacheable * @property {boolean=} parsed - * @property {string=} moduleArgument - * @property {string=} exportsArgument * @property {boolean=} strict - * @property {string=} moduleConcatenationBailout - * @property {LazySet=} fileDependencies - * @property {LazySet=} contextDependencies - * @property {LazySet=} missingDependencies - * @property {LazySet=} buildDependencies - * @property {ValueCacheVersions=} valueDependencies - * @property {TODO=} hash - * @property {Record=} assets - * @property {Map=} assetsInfo - * @property {(Snapshot | null)=} snapshot + * @property {string=} moduleArgument using in AMD + * @property {string=} exportsArgument using in AMD + * @property {string=} moduleConcatenationBailout using in CommonJs + * @property {boolean=} needCreateRequire using in APIPlugin + * @property {string=} resourceIntegrity using in HttpUriPlugin + * @property {LazySet=} fileDependencies using in NormalModule + * @property {LazySet=} contextDependencies using in NormalModule + * @property {LazySet=} missingDependencies using in NormalModule + * @property {LazySet=} buildDependencies using in NormalModule + * @property {ValueCacheVersions=} valueDependencies using in NormalModule + * @property {Record=} assets using in NormalModule + * @property {string=} hash using in NormalModule + * @property {(Snapshot | null)=} snapshot using in ContextModule + * @property {string=} fullContentHash for assets modules + * @property {string=} filename for assets modules + * @property {Map=} assetsInfo for assets modules + * @property {boolean=} dataUrl for assets modules + * @property {CssData=} cssData for css modules */ /** @typedef {Map>} ValueCacheVersions */ diff --git a/lib/NormalModule.js b/lib/NormalModule.js index 2768374d2..d80d717f3 100644 --- a/lib/NormalModule.js +++ b/lib/NormalModule.js @@ -1632,7 +1632,11 @@ class NormalModule extends Module { * @returns {void} */ updateHash(hash, context) { - hash.update(/** @type {BuildInfo} */ (this.buildInfo).hash); + const buildInfo = /** @type {BuildInfo} */ (this.buildInfo); + hash.update( + /** @type {string} */ + (buildInfo.hash) + ); /** @type {Generator} */ (this.generator).updateHash(hash, { module: this, diff --git a/lib/css/CssGenerator.js b/lib/css/CssGenerator.js index 7df10bbbf..d717d9b48 100644 --- a/lib/css/CssGenerator.js +++ b/lib/css/CssGenerator.js @@ -292,7 +292,7 @@ class CssGenerator extends Generator { Array.from(exports).reduce((obj, [key, value]) => { obj[key] = value; return obj; - }, {}) + }, /** @type {Record} */ ({})) ); return stringifiedExports.length + 42; diff --git a/lib/css/CssModulesPlugin.js b/lib/css/CssModulesPlugin.js index 64549caa6..38d3f0bf7 100644 --- a/lib/css/CssModulesPlugin.js +++ b/lib/css/CssModulesPlugin.js @@ -395,7 +395,7 @@ class CssModulesPlugin { Array.from(exports).reduce((obj, [key, value]) => { obj[key] = value; return obj; - }, {}) + }, /** @type {Record} */ ({})) ) ); diff --git a/lib/index.js b/lib/index.js index 5a8ae9fe5..21bcb469d 100644 --- a/lib/index.js +++ b/lib/index.js @@ -550,9 +550,6 @@ module.exports = mergeExports(fn, { css: { get CssModulesPlugin() { return require("./css/CssModulesPlugin"); - }, - get CssModule() { - return require("./CssModule"); } }, diff --git a/test/hotCases/recover/recover-after-css-loader-error/errors1.js b/test/hotCases/recover/recover-after-css-loader-error/errors1.js new file mode 100644 index 000000000..b57c892ca --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/errors1.js @@ -0,0 +1,3 @@ +module.exports = [ + /Error in loader/, +]; diff --git a/test/hotCases/recover/recover-after-css-loader-error/index.js b/test/hotCases/recover/recover-after-css-loader-error/index.js new file mode 100644 index 000000000..b8b73c466 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/index.js @@ -0,0 +1,25 @@ +import "./loader!./style.css"; + +it("should work", async function (done) { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: red;"); + + NEXT(require("../../update")(done, { + ignoreErrored: true + }, () => { + expect(links[0].sheet.css).toContain("Error in loader"); + + NEXT(require("../../update")(done, { + ignoreErrored: true + }, () => { + expect(links[0].sheet.css).toContain("color: blue;"); + + done(); + })); + })); +}); + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept("./loader!./style.css"); +} + diff --git a/test/hotCases/recover/recover-after-css-loader-error/loader.js b/test/hotCases/recover/recover-after-css-loader-error/loader.js new file mode 100644 index 000000000..dec6e4fcd --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/loader.js @@ -0,0 +1,10 @@ +module.exports = function(content) { + const callback = this.async(); + + if (content.includes("Failed")) { + callback(new Error("Error in loader")); + return; + } + + callback(null, content); +}; diff --git a/test/hotCases/recover/recover-after-css-loader-error/style.css b/test/hotCases/recover/recover-after-css-loader-error/style.css new file mode 100644 index 000000000..43985cda0 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/style.css @@ -0,0 +1,11 @@ +.class { + color: red; +} +--- +.class { + color: green; +}Failed +--- +.class { + color: blue; +} diff --git a/test/hotCases/recover/recover-after-css-module-render-error/test.filter.js b/test/hotCases/recover/recover-after-css-loader-error/test.filter.js similarity index 100% rename from test/hotCases/recover/recover-after-css-module-render-error/test.filter.js rename to test/hotCases/recover/recover-after-css-loader-error/test.filter.js diff --git a/test/hotCases/recover/recover-after-css-loader-error/webpack.config.js b/test/hotCases/recover/recover-after-css-loader-error/webpack.config.js new file mode 100644 index 000000000..527c1c2c1 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + css: true + } +}; diff --git a/test/hotCases/recover/recover-after-css-module-render-error/errors1.js b/test/hotCases/recover/recover-after-css-module-render-error/errors1.js deleted file mode 100644 index 6a04211b6..000000000 --- a/test/hotCases/recover/recover-after-css-module-render-error/errors1.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = [ - [ - // main.js render error - /Failed/ - ], - [ - // main.hot-update.js render error - /Failed/ - ] -]; diff --git a/test/hotCases/recover/recover-after-css-module-render-error/index.css b/test/hotCases/recover/recover-after-css-module-render-error/index.css deleted file mode 100644 index 019649bbb..000000000 --- a/test/hotCases/recover/recover-after-css-module-render-error/index.css +++ /dev/null @@ -1,7 +0,0 @@ -.html { - color: red; -} ---- -html { - color: blue; -}Failed \ No newline at end of file diff --git a/test/hotCases/recover/recover-after-css-module-render-error/index.js b/test/hotCases/recover/recover-after-css-module-render-error/index.js deleted file mode 100644 index 844c31576..000000000 --- a/test/hotCases/recover/recover-after-css-module-render-error/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import "./index.css"; - -it("should work", done => { - const links = window.document.getElementsByTagName("link"); - expect(links[0].sheet.css).toContain("color: red;"); - NEXT( - require("../../update")(done, true, () => { - const links = window.document.getElementsByTagName("link"); - expect(links[0].sheet.css).toContain("color: blue;"); - }) - ); -}); diff --git a/test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js b/test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js deleted file mode 100644 index b0610030a..000000000 --- a/test/hotCases/recover/recover-after-css-module-render-error/webpack.config.js +++ /dev/null @@ -1,39 +0,0 @@ -const webpack = require("../../../../"); - -/** @type {import("../../../../").Configuration} */ -module.exports = { - entry: ["./index.js"], - experiments: { - css: true - }, - plugins: [ - { - apply(compiler) { - compiler.hooks.compilation.tap("Test", compilation => { - compilation.hooks.additionalTreeRuntimeRequirements.tap( - "Test", - (module, set, context) => { - // To prevent the runtime error `ReferenceError: __webpack_exports__ is not defined`, - // which occurs because the default `output.library` setting is `commonjs2`, - // resulting in adding `module.exports = __webpack_exports__;`. - set.add(webpack.RuntimeGlobals.startup); - set.add(webpack.RuntimeGlobals.exports); - } - ); - - webpack.javascript.JavascriptModulesPlugin.getCompilationHooks( - compilation - ).renderModuleContent.tap("Test", (source, module) => { - if (module instanceof webpack.css.CssModule && module.hot) { - const s = module._source.source(); - if (s.includes("Failed")) { - throw new Error("Failed"); - } - } - return source; - }); - }); - } - } - ] -}; diff --git a/types.d.ts b/types.d.ts index b5c4fd827..909a7717d 100644 --- a/types.d.ts +++ b/types.d.ts @@ -906,12 +906,6 @@ declare abstract class ByTypeGenerator extends Generator { ) => null | Source; } declare const CIRCULAR_CONNECTION: unique symbol; -type CSSModuleCreateData = NormalModuleCreateData & { - cssLayer: CssLayer; - supports: Supports; - media: Media; - inheritance: [CssLayer, Supports, Media][]; -}; declare class Cache { constructor(); hooks: { @@ -3181,6 +3175,17 @@ declare interface CssAutoParserOptions { */ url?: boolean; } +declare interface CssData { + /** + * whether export __esModule + */ + esModule: boolean; + + /** + * the css exports + */ + exports: Map; +} /** * Generator options for css modules. @@ -3284,16 +3289,11 @@ declare interface CssLoadingRuntimeModulePluginHooks { linkPreload: SyncWaterfallHook<[string, Chunk]>; linkPrefetch: SyncWaterfallHook<[string, Chunk]>; } -declare class CssModule extends NormalModule { - constructor(options: CSSModuleCreateData); +declare abstract class CssModule extends NormalModule { cssLayer: CssLayer; supports: Supports; media: Media; inheritance: [CssLayer, Supports, Media][]; - static deserialize(context: ObjectDeserializerContext): CssModule; - static getCompilationHooks( - compilation: Compilation - ): NormalModuleCompilationHooks; } /** @@ -7725,19 +7725,97 @@ declare interface KnownAssetInfo { declare interface KnownBuildInfo { cacheable?: boolean; parsed?: boolean; - moduleArgument?: string; - exportsArgument?: string; strict?: boolean; + + /** + * using in AMD + */ + moduleArgument?: string; + + /** + * using in AMD + */ + exportsArgument?: string; + + /** + * using in CommonJs + */ moduleConcatenationBailout?: string; + + /** + * using in APIPlugin + */ + needCreateRequire?: boolean; + + /** + * using in HttpUriPlugin + */ + resourceIntegrity?: string; + + /** + * using in NormalModule + */ fileDependencies?: LazySet; + + /** + * using in NormalModule + */ contextDependencies?: LazySet; + + /** + * using in NormalModule + */ missingDependencies?: LazySet; + + /** + * using in NormalModule + */ buildDependencies?: LazySet; + + /** + * using in NormalModule + */ valueDependencies?: Map>; - hash?: any; + + /** + * using in NormalModule + */ assets?: Record; - assetsInfo?: Map; + + /** + * using in NormalModule + */ + hash?: string; + + /** + * using in ContextModule + */ snapshot?: null | Snapshot; + + /** + * for assets modules + */ + fullContentHash?: string; + + /** + * for assets modules + */ + filename?: string; + + /** + * for assets modules + */ + assetsInfo?: Map; + + /** + * for assets modules + */ + dataUrl?: boolean; + + /** + * for css modules + */ + cssData?: CssData; } declare interface KnownBuildMeta { exportsType?: "namespace" | "dynamic" | "default" | "flagged"; @@ -16561,7 +16639,7 @@ declare namespace exports { export { AsyncWebAssemblyModulesPlugin, EnableWasmLoadingPlugin }; } export namespace css { - export { CssModulesPlugin, CssModule }; + export { CssModulesPlugin }; } export namespace library { export { AbstractLibraryPlugin, EnableLibraryPlugin }; From 0778b0408be77578feb4eb2e0b50056e1534f4da Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Wed, 23 Apr 2025 05:31:16 +0300 Subject: [PATCH 4/4] chore: fix types --- test/hotCases/recover/recover-after-css-loader-error/loader.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotCases/recover/recover-after-css-loader-error/loader.js b/test/hotCases/recover/recover-after-css-loader-error/loader.js index dec6e4fcd..fc55a1373 100644 --- a/test/hotCases/recover/recover-after-css-loader-error/loader.js +++ b/test/hotCases/recover/recover-after-css-loader-error/loader.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ module.exports = function(content) { const callback = this.async();