From 3e6786671e3cadd308ae6e7e19f13915574eeb60 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 16:04:08 +0300 Subject: [PATCH] fix: export and type the custom server extension class --- .changeset/export-base-server.md | 5 +++++ lib/Server.js | 2 +- package.json | 6 ++++++ scripts/finalize-cjs-build.mjs | 15 ++++++++------- types/lib/Server.d.ts | 4 +++- 5 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 .changeset/export-base-server.md diff --git a/.changeset/export-base-server.md b/.changeset/export-base-server.md new file mode 100644 index 0000000000..3dbbf729df --- /dev/null +++ b/.changeset/export-base-server.md @@ -0,0 +1,5 @@ +--- +"webpack-dev-server": patch +--- + +Export the documented `BaseServer` extension class and accept its constructors in the public `webSocketServer.type` declaration. diff --git a/lib/Server.js b/lib/Server.js index 38577856c9..2b54d1ce21 100644 --- a/lib/Server.js +++ b/lib/Server.js @@ -138,7 +138,7 @@ function loadWebpackPeer() { /** * @typedef {object} WebSocketServerConfiguration - * @property {("ws" | string | (() => WebSocketServerConfiguration))=} type type + * @property {("ws" | string | typeof import("./servers/BaseServer.js").default)=} type type * @property {Record=} options options */ diff --git a/package.json b/package.json index 38fbb1dd59..2c3b186d88 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,12 @@ "default": "./lib/Server.js" }, "./client/*": "./client/*", + "./lib/servers/BaseServer.js": { + "types": "./types/lib/servers/BaseServer.d.ts", + "import": "./lib/servers/BaseServer.js", + "require": "./dist/servers/BaseServer.js", + "default": "./lib/servers/BaseServer.js" + }, "./package.json": "./package.json" }, "main": "./dist/Server.js", diff --git a/scripts/finalize-cjs-build.mjs b/scripts/finalize-cjs-build.mjs index ef4b61c818..6a7ea31be0 100644 --- a/scripts/finalize-cjs-build.mjs +++ b/scripts/finalize-cjs-build.mjs @@ -12,9 +12,8 @@ import { fileURLToPath } from "node:url"; // files in `dist/` as CommonJS regardless of the package's root // `"type": "module"`. // 2. Babel emits the loader as `exports.default`. Append the `module.exports` -// unwrap so `require("webpack-dev-server")` returns the `Server` class -// directly (parity with the pre-ESM `module.exports = Server`), while -// `.default` keeps pointing at it for interop. +// unwrap so the public Server and BaseServer entrypoints return their +// classes directly, while `.default` keeps pointing at them for interop. const CJS_DIR = path.resolve( path.dirname(fileURLToPath(import.meta.url)), @@ -27,7 +26,9 @@ await writeFile( `${JSON.stringify({ type: "commonjs" }, null, 2)}\n`, ); -await appendFile( - path.join(CJS_DIR, "Server.js"), - "module.exports = exports.default;\nmodule.exports.default = exports.default;\n", -); +for (const entry of ["Server.js", "servers/BaseServer.js"]) { + await appendFile( + path.join(CJS_DIR, entry), + "module.exports = exports.default;\nmodule.exports.default = exports.default;\n", + ); +} diff --git a/types/lib/Server.d.ts b/types/lib/Server.d.ts index 476d53ea36..bf1bf008ee 100644 --- a/types/lib/Server.d.ts +++ b/types/lib/Server.d.ts @@ -157,7 +157,9 @@ export type WebSocketServerConfiguration = { /** * type */ - type?: ("ws" | string | (() => WebSocketServerConfiguration)) | undefined; + type?: + | ("ws" | string | typeof import("./servers/BaseServer.js").default) + | undefined; /** * options */