diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 601903e675..8dd6eac59b 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -69,7 +69,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: [20.x, 22.x, 24.x, 25.x] + node-version: [22.x, 24.x, 25.x] shard: ["1/4", "2/4", "3/4", "4/4"] webpack-version: [latest] diff --git a/babel.config.js b/babel.config.js index a34db39f39..960f6b5739 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,6 +1,4 @@ -"use strict"; - -module.exports = (api) => { +export default (api) => { api.cache(true); return { @@ -24,7 +22,7 @@ module.exports = (api) => { "@babel/preset-env", { targets: { - node: "20.9.0", + node: "22.12.0", }, }, ], diff --git a/bin/webpack-dev-server.js b/bin/webpack-dev-server.js index de0cfd3b32..16e76b136b 100755 --- a/bin/webpack-dev-server.js +++ b/bin/webpack-dev-server.js @@ -2,17 +2,20 @@ /* Based on webpack/bin/webpack.js */ /* eslint-disable no-console */ -"use strict"; +import cp from "node:child_process"; +import nodeModule from "node:module"; +import path from "node:path"; +import readLine from "node:readline"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import fs from "graceful-fs"; /** * @param {string} command process to run * @param {string[]} args command line arguments * @returns {Promise} promise */ -const runCommand = (command, args) => { - const cp = require("node:child_process"); - - return new Promise((resolve, reject) => { +const runCommand = (command, args) => + new Promise((resolve, reject) => { const executedCommand = cp.spawn(command, args, { stdio: "inherit", shell: true, @@ -30,7 +33,6 @@ const runCommand = (command, args) => { } }); }); -}; /** * @param {string} packageName name of the package @@ -41,10 +43,7 @@ const isInstalled = (packageName) => { return true; } - const path = require("node:path"); - const fs = require("graceful-fs"); - - let dir = __dirname; + let dir = path.dirname(fileURLToPath(import.meta.url)); do { try { @@ -58,9 +57,9 @@ const isInstalled = (packageName) => { } } while (dir !== (dir = path.dirname(dir))); - // https://github.com/nodejs/node/blob/v18.9.1/lib/internal/modules/cjs/loader.js#L1274 + // https://github.com/nodejs/node/blob/v22.12.0/lib/internal/modules/cjs/loader.js#L1818 // @ts-expect-error - for (const internalPath of require("node:module").globalPaths) { + for (const internalPath of nodeModule.globalPaths) { try { if (fs.statSync(path.join(internalPath, packageName)).isDirectory()) { return true; @@ -75,29 +74,20 @@ const isInstalled = (packageName) => { /** * @param {CliOption} cli options - * @returns {void} + * @returns {Promise} */ -const runCli = (cli) => { +const runCli = async (cli) => { if (cli.preprocess) { cli.preprocess(); } - const path = require("node:path"); + const pkgUrl = import.meta.resolve(`${cli.package}/package.json`); + const pkgPath = fileURLToPath(pkgUrl); + const pkg = (await import(pkgUrl, { with: { type: "json" } })).default; - const pkgPath = require.resolve(`${cli.package}/package.json`); + const binPath = path.resolve(path.dirname(pkgPath), pkg.bin[cli.binName]); - const pkg = require(pkgPath); - - if (pkg.type === "module" || /\.mjs/i.test(pkg.bin[cli.binName])) { - import(path.resolve(path.dirname(pkgPath), pkg.bin[cli.binName])).catch( - (error) => { - console.error(error); - process.exitCode = 1; - }, - ); - } else { - require(path.resolve(path.dirname(pkgPath), pkg.bin[cli.binName])); - } + await import(pathToFileURL(binPath).href); }; /** @@ -123,10 +113,6 @@ const cli = { }; if (!cli.installed) { - const path = require("node:path"); - const fs = require("graceful-fs"); - const readLine = require("node:readline"); - const notify = `CLI for webpack must be installed.\n ${cli.name} (${cli.url})\n`; console.error(notify); @@ -187,14 +173,17 @@ if (!cli.installed) { ); runCommand(packageManager, [...installOptions, cli.package]) - .then(() => { - runCli(cli); - }) + .then(() => runCli(cli)) .catch((error) => { console.error(error); process.exitCode = 1; }); }); } else { - runCli(cli); + try { + await runCli(cli); + } catch (error) { + console.error(error); + process.exitCode = 1; + } } diff --git a/client-src/webpack.config.js b/client-src/webpack.config.js index 7037f9406f..5aa430209b 100644 --- a/client-src/webpack.config.js +++ b/client-src/webpack.config.js @@ -1,8 +1,9 @@ -"use strict"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import webpack from "webpack"; +import { merge } from "webpack-merge"; -const path = require("node:path"); -const webpack = require("webpack"); -const { merge } = require("webpack-merge"); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const library = { library: { @@ -37,7 +38,7 @@ const baseForModules = { }, }; -module.exports = [ +export default [ merge(baseForModules, { entry: path.join(__dirname, "modules/logger/index.js"), output: { diff --git a/commitlint.config.js b/commitlint.config.js index 1698d22ed8..f0f7617e9e 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,6 +1,4 @@ -"use strict"; - -module.exports = { +export default { extends: ["@commitlint/config-conventional"], rules: { "header-max-length": [0], diff --git a/eslint.config.mjs b/eslint.config.mjs index 52ac3be3ee..f63dcef69a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -7,6 +7,11 @@ export default defineConfig([ { extends: [config], ignores: ["client-src/**/*", "!client-src/webpack.config.js"], + languageOptions: { + // ES2025 needed for import attributes (`import(x, { with: ... })`). + // eslint-config-webpack pins ecmaVersion to 2024 for Node 22. + ecmaVersion: "latest", + }, rules: { // TODO fix me "prefer-destructuring": "off", diff --git a/jest.config.js b/jest.config.js index 7bd7b0bb03..3747b2d2b4 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,4 @@ -"use strict"; - -module.exports = { +export default { testEnvironmentOptions: { url: "http://localhost/", }, diff --git a/lib/Server.js b/lib/Server.js index b5a81f1348..3608b132d2 100644 --- a/lib/Server.js +++ b/lib/Server.js @@ -1,14 +1,21 @@ -"use strict"; - -const os = require("node:os"); -const path = require("node:path"); -const url = require("node:url"); -const fs = require("graceful-fs"); -const ipaddr = require("ipaddr.js"); -const { validate } = require("schema-utils"); -const schema = require("./options.json"); +import net from "node:net"; +import os from "node:os"; +import path from "node:path"; +import url, { fileURLToPath } from "node:url"; +import fs from "graceful-fs"; +import ipaddr from "ipaddr.js"; +import { validate } from "schema-utils"; +import schema from "./options.json" with { type: "json" }; + +/** @type {typeof import("webpack") | undefined} */ +let webpackPeer; +try { + webpackPeer = (await import("webpack")).default; +} catch { + // webpack is an optional peer dependency +} -/** @typedef {import("schema-utils/declarations/validate").Schema} Schema */ +/** @typedef {import("schema-utils").Schema} Schema */ /** @typedef {import("webpack").Compiler} Compiler */ /** @typedef {import("webpack").MultiCompiler} MultiCompiler */ /** @typedef {import("webpack").Configuration} WebpackConfiguration */ @@ -266,7 +273,7 @@ const memoize = (fn) => { }; }; -const getExpress = memoize(() => require("express")); +const getExpress = memoize(async () => (await import("express")).default); /** * @param {OverlayMessageOptions=} setting overlay settings @@ -495,9 +502,8 @@ class Server { return port; } - const pRetry = (await import("p-retry")).default; - - const getPort = require("./getPort"); + const { default: pRetry } = await import("p-retry"); + const { default: getPort } = await import("./getPort.js"); const basePort = typeof process.env.WEBPACK_DEV_SERVER_BASE_PORT !== "undefined" @@ -738,7 +744,9 @@ class Server { additionalEntries.push(clientHotEntry); } - const webpack = compiler.webpack || require("webpack"); + const webpack = + compiler.webpack || + /** @type {NonNullable} */ (webpackPeer); // use a hook to add entries if available for (const additionalEntry of additionalEntries) { @@ -1139,7 +1147,7 @@ class Server { if (!certificateExists) { this.logger.info("Generating SSL certificate..."); - const selfsigned = require("selfsigned"); + const { default: selfsigned } = await import("selfsigned"); const attributes = [{ name: "commonName", value: "localhost" }]; const notBeforeDate = new Date(); @@ -1477,14 +1485,16 @@ class Server { switch (typeof clientTransport) { case "string": - // could be 'ws', or a path that should be required + // could be 'ws', or a path that should be resolved if (clientTransport === "ws") { - clientImplementation = require.resolve( - "../client/clients/WebSocketClient", + clientImplementation = fileURLToPath( + import.meta.resolve("../client/clients/WebSocketClient.js"), ); } else { try { - clientImplementation = require.resolve(clientTransport); + clientImplementation = fileURLToPath( + import.meta.resolve(clientTransport), + ); } catch { clientImplementationFound = false; } @@ -1500,7 +1510,7 @@ class Server { !isKnownWebSocketServerImplementation ? "When you use custom web socket implementation you must explicitly specify client.webSocketTransport. " : "" - }client.webSocketTransport must be a string denoting a default implementation (e.g. 'ws') or a full path to a JS file via require.resolve(...) which exports a class `, + }client.webSocketTransport must be a string denoting a default implementation (e.g. 'ws') or a resolvable module specifier or absolute file path which exports a class `, ); } @@ -1510,9 +1520,9 @@ class Server { /** * @template T * @private - * @returns {T} server transport + * @returns {Promise} server transport */ - getServerTransport() { + async getServerTransport() { let implementation; let implementationFound = true; @@ -1529,13 +1539,17 @@ class Server { this.options.webSocketServer ).type === "ws" ) { - implementation = require("./servers/WebsocketServer"); + implementation = (await import("./servers/WebsocketServer.js")) + .default; } else { try { - implementation = require( - /** @type {WebSocketServerConfiguration} */ - (this.options.webSocketServer).type, + const mod = await import( + /** @type {string} */ ( + /** @type {WebSocketServerConfiguration} */ + (this.options.webSocketServer).type + ) ); + implementation = mod.default || mod; } catch { implementationFound = false; } @@ -1552,9 +1566,9 @@ class Server { if (!implementationFound) { throw new Error( - "webSocketServer (webSocketServer.type) must be a string denoting a default implementation (e.g. 'ws'), a full path to " + - "a JS file which exports a class extending BaseServer (webpack-dev-server/lib/servers/BaseServer.js) " + - "via require.resolve(...), or the class itself which extends BaseServer", + "webSocketServer (webSocketServer.type) must be a string denoting a default implementation (e.g. 'ws'), a resolvable module specifier or absolute file path " + + "which exports a class extending BaseServer (webpack-dev-server/lib/servers/BaseServer.js), " + + "or the class itself which extends BaseServer", ); } @@ -1566,7 +1580,7 @@ class Server { */ getClientEntry() { - return require.resolve("../client/index.js"); + return fileURLToPath(import.meta.resolve("../client/index.js")); } /** @@ -1574,9 +1588,9 @@ class Server { */ getClientHotEntry() { if (this.options.hot === "only") { - return require.resolve("webpack/hot/only-dev-server"); + return fileURLToPath(import.meta.resolve("webpack/hot/only-dev-server")); } else if (this.options.hot) { - return require.resolve("webpack/hot/dev-server"); + return fileURLToPath(import.meta.resolve("webpack/hot/dev-server")); } } @@ -1646,7 +1660,9 @@ class Server { this.addAdditionalEntries(compiler); - const webpack = compiler.webpack || require("webpack"); + const webpack = + compiler.webpack || + /** @type {NonNullable} */ (webpackPeer); new webpack.ProvidePlugin({ __webpack_dev_server_client__: this.getClientTransport(), @@ -1680,9 +1696,9 @@ class Server { } } - this.setupWatchFiles(); - this.setupWatchStaticFiles(); - this.setupMiddlewares(); + await this.setupWatchFiles(); + await this.setupWatchStaticFiles(); + await this.setupMiddlewares(); if (this.options.setupExitSignals) { const signals = ["SIGINT", "SIGTERM"]; @@ -1749,7 +1765,7 @@ class Server { ( typeof this.options.app === "function" ? await this.options.app() - : getExpress()() + : (await getExpress())() ); } @@ -1805,15 +1821,15 @@ class Server { /** * @private - * @returns {void} + * @returns {Promise} */ - setupWatchStaticFiles() { + async setupWatchStaticFiles() { const watchFiles = /** @type {NormalizedStatic[]} */ (this.options.static); if (watchFiles.length > 0) { for (const item of watchFiles) { if (item.watch) { - this.watchFiles(item.directory, item.watch); + await this.watchFiles(item.directory, item.watch); } } } @@ -1821,23 +1837,23 @@ class Server { /** * @private - * @returns {void} + * @returns {Promise} */ - setupWatchFiles() { + async setupWatchFiles() { const watchFiles = /** @type {WatchFiles[]} */ (this.options.watchFiles); if (watchFiles.length > 0) { for (const item of watchFiles) { - this.watchFiles(item.paths, item.options); + await this.watchFiles(item.paths, item.options); } } } /** * @private - * @returns {void} + * @returns {Promise} */ - setupMiddlewares() { + async setupMiddlewares() { /** * @type {Array} */ @@ -1926,7 +1942,7 @@ class Server { // compress is placed last and uses unshift so that it will be the first middleware used if (this.options.compress) { - const compression = require("compression"); + const { default: compression } = await import("compression"); middlewares.push({ name: "compression", middleware: compression() }); } @@ -1971,9 +1987,9 @@ class Server { * @param {Request} req request * @param {Response} res response * @param {NextFunction} next next function - * @returns {void} + * @returns {Promise} */ - middleware: (req, res, next) => { + middleware: async (req, res, next) => { if (req.method !== "GET" && req.method !== "HEAD") { next(); return; @@ -1989,7 +2005,7 @@ class Server { const fileName = params.get("fileName"); if (typeof fileName === "string") { - const launchEditor = require("launch-editor"); + const { default: launchEditor } = await import("launch-editor"); launchEditor(fileName); } @@ -2082,7 +2098,7 @@ class Server { }); if (this.options.proxy) { - const { createProxyMiddleware } = require("http-proxy-middleware"); + const { createProxyMiddleware } = await import("http-proxy-middleware"); /** * @param {ProxyConfigArrayItem} proxyConfig proxy config @@ -2200,7 +2216,7 @@ class Server { middlewares.push({ name: "express-static", path: publicPath, - middleware: getExpress().static( + middleware: (await getExpress()).static( staticOption.directory, staticOption.staticOptions, ), @@ -2210,7 +2226,9 @@ class Server { } if (this.options.historyApiFallback) { - const connectHistoryApiFallback = require("connect-history-api-fallback"); + const { default: connectHistoryApiFallback } = await import( + "connect-history-api-fallback" + ); const { historyApiFallback } = this.options; @@ -2268,7 +2286,7 @@ class Server { middlewares.push({ name: "express-static", path: publicPath, - middleware: getExpress().static( + middleware: (await getExpress()).static( staticOption.directory, staticOption.staticOptions, ), @@ -2279,7 +2297,7 @@ class Server { } if (staticOptions.length > 0) { - const serveIndex = require("serve-index"); + const { default: serveIndex } = await import("serve-index"); for (const staticOption of staticOptions) { for (const publicPath of staticOption.publicPath) { @@ -2336,11 +2354,13 @@ class Server { middlewares = this.options.setupMiddlewares(middlewares, this); } + const { default: webpackDevMiddleware } = await import( + "webpack-dev-middleware" + ); + // Lazy init webpack dev middleware const lazyInitDevMiddleware = () => { if (!this.middleware) { - const webpackDevMiddleware = require("webpack-dev-middleware"); - // middleware for serving webpack bundle /** @type {import("webpack-dev-middleware").API} */ this.middleware = webpackDevMiddleware( @@ -2404,7 +2424,8 @@ class Server { (this.app), ); } else { - const serverType = require(/** @type {string} */ (type)); + const mod = await import(/** @type {string} */ (type)); + const serverType = mod.default || mod; /** @type {S | undefined} */ this.server = @@ -2452,11 +2473,11 @@ class Server { /** * @private - * @returns {void} + * @returns {Promise} */ - createWebSocketServer() { + async createWebSocketServer() { /** @type {WebSocketServerImplementation | undefined | null} */ - this.webSocketServer = new (this.getServerTransport())(this); + this.webSocketServer = new (await this.getServerTransport())(this); /** @type {WebSocketServerImplementation} */ (this.webSocketServer).implementation.on( @@ -2616,10 +2637,10 @@ class Server { /** * @private - * @returns {void} + * @returns {Promise} */ - runBonjour() { - const { Bonjour } = require("bonjour-service"); + async runBonjour() { + const { Bonjour } = await import("bonjour-service"); const type = this.isTlsServer ? "https" : "http"; @@ -3185,11 +3206,11 @@ class Server { /** * @param {string | string[]} watchPath watch path * @param {WatchOptions=} watchOptions watch options + * @returns {Promise} */ - watchFiles(watchPath, watchOptions = {}) { - const chokidar = require("chokidar"); - const path = require("node:path"); - const { globSync, isDynamicPattern } = require("tinyglobby"); + async watchFiles(watchPath, watchOptions = {}) { + const { default: chokidar } = await import("chokidar"); + const { globSync, isDynamicPattern } = await import("tinyglobby"); const isWin = path.sep === "\\"; const toPosix = (/** @type {string} */ filePath) => @@ -3257,8 +3278,6 @@ class Server { if (this.options.ipc) { await /** @type {Promise} */ ( new Promise((resolve, reject) => { - const net = require("node:net"); - const socket = new net.Socket(); socket.on( @@ -3328,11 +3347,11 @@ class Server { } if (this.options.webSocketServer) { - this.createWebSocketServer(); + await this.createWebSocketServer(); } if (this.options.bonjour) { - this.runBonjour(); + await this.runBonjour(); } await this.logStatus(); @@ -3446,4 +3465,4 @@ class Server { } } -module.exports = Server; +export default Server; diff --git a/lib/getPort.js b/lib/getPort.js index 23bc4e348a..032e41f31b 100644 --- a/lib/getPort.js +++ b/lib/getPort.js @@ -1,13 +1,11 @@ -"use strict"; - /* * Based on the packages get-port https://www.npmjs.com/package/get-port * and portfinder https://www.npmjs.com/package/portfinder * The code structure is similar to get-port, but it searches * ports deterministically like portfinder */ -const net = require("node:net"); -const os = require("node:os"); +import net from "node:net"; +import os from "node:os"; const minPort = 1024; const maxPort = 65_535; @@ -129,4 +127,4 @@ async function getPorts(basePort, host) { throw new Error("No available ports found"); } -module.exports = getPorts; +export default getPorts; diff --git a/lib/servers/BaseServer.js b/lib/servers/BaseServer.js index 9f5a18f4e0..13079303b8 100644 --- a/lib/servers/BaseServer.js +++ b/lib/servers/BaseServer.js @@ -1,18 +1,16 @@ -"use strict"; - -/** @typedef {import("../Server").ClientConnection} ClientConnection */ +/** @typedef {import("../Server.js").ClientConnection} ClientConnection */ // base class that users should extend if they are making their own // server implementation -module.exports = class BaseServer { +export default class BaseServer { /** - * @param {import("../Server")} server server + * @param {import("../Server.js").default} server server */ constructor(server) { - /** @type {import("../Server")} */ + /** @type {import("../Server.js").default} */ this.server = server; /** @type {ClientConnection[]} */ this.clients = []; } -}; +} diff --git a/lib/servers/WebsocketServer.js b/lib/servers/WebsocketServer.js index b9071f4bd3..cc3f7b635b 100644 --- a/lib/servers/WebsocketServer.js +++ b/lib/servers/WebsocketServer.js @@ -1,16 +1,14 @@ -"use strict"; +import { WebSocketServer as WsServer } from "ws"; +import BaseServer from "./BaseServer.js"; -const WebSocket = require("ws"); -const BaseServer = require("./BaseServer"); +/** @typedef {import("../Server.js").WebSocketServerConfiguration} WebSocketServerConfiguration */ +/** @typedef {import("../Server.js").ClientConnection} ClientConnection */ -/** @typedef {import("../Server").WebSocketServerConfiguration} WebSocketServerConfiguration */ -/** @typedef {import("../Server").ClientConnection} ClientConnection */ - -module.exports = class WebsocketServer extends BaseServer { +export default class WebsocketServer extends BaseServer { static heartbeatInterval = 1000; /** - * @param {import("../Server")} server server + * @param {import("../Server.js").default} server server */ constructor(server) { super(server); @@ -29,7 +27,7 @@ module.exports = class WebsocketServer extends BaseServer { options.noServer = true; } - this.implementation = new WebSocket.Server(options); + this.implementation = new WsServer(options); /** @type {import("http").Server} */ (this.server.server).on( @@ -108,4 +106,4 @@ module.exports = class WebsocketServer extends BaseServer { clearInterval(interval); }); } -}; +} diff --git a/lint-staged.config.js b/lint-staged.config.js index 2d40a32b75..50d30973d9 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,6 +1,4 @@ -"use strict"; - -module.exports = { +export default { "*": [ "prettier --cache --write --ignore-unknown", "cspell --cache --no-must-find-files", diff --git a/package-lock.json b/package-lock.json index 4647869111..311fc9570a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@babel/eslint-parser": "^7.28.6", "@babel/plugin-transform-object-assign": "^7.27.1", "@babel/plugin-transform-runtime": "^7.29.0", - "@babel/preset-env": "^7.25.9", + "@babel/preset-env": "^7.29.2", "@babel/runtime": "^7.29.2", "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", @@ -101,7 +101,7 @@ "webpack-merge": "^6.0.1" }, "engines": { - "node": ">= 20.9.0" + "node": ">= 22.12.0" }, "funding": { "type": "opencollective", @@ -341,18 +341,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -363,14 +363,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -381,17 +381,17 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" + "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -408,14 +408,14 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -495,15 +495,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -557,15 +557,15 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -669,14 +669,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -754,13 +754,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -770,13 +770,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -987,15 +987,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1005,14 +1005,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { @@ -1039,13 +1039,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1055,14 +1055,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1072,14 +1072,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1089,18 +1089,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1110,14 +1110,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1144,14 +1144,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1177,14 +1177,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1210,14 +1210,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1227,13 +1227,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1294,13 +1294,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1326,13 +1326,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1375,14 +1375,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1392,16 +1392,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1428,14 +1428,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1461,13 +1461,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1477,13 +1477,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1509,17 +1509,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1546,13 +1546,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1562,13 +1562,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1595,14 +1595,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1612,15 +1612,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1646,13 +1646,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1662,14 +1662,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1732,13 +1732,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1813,14 +1813,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1847,14 +1847,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1864,81 +1864,81 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", + "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", "semver": "^6.3.1" }, "engines": { @@ -1948,6 +1948,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -6883,14 +6897,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { @@ -6912,13 +6926,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -9395,13 +9409,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", @@ -20562,13 +20576,14 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, diff --git a/package.json b/package.json index 521f2e716f..112479b937 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ }, "license": "MIT", "author": "Tobias Koppers @sokra", + "type": "module", "main": "lib/Server.js", "types": "types/lib/Server.d.ts", "bin": "bin/webpack-dev-server.js", @@ -76,7 +77,7 @@ "@babel/eslint-parser": "^7.28.6", "@babel/plugin-transform-object-assign": "^7.27.1", "@babel/plugin-transform-runtime": "^7.29.0", - "@babel/preset-env": "^7.25.9", + "@babel/preset-env": "^7.29.2", "@babel/runtime": "^7.29.2", "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", @@ -144,6 +145,6 @@ } }, "engines": { - "node": ">= 20.9.0" + "node": ">= 22.12.0" } } diff --git a/scripts/extend-webpack-types.js b/scripts/extend-webpack-types.js index 36a811a933..5125aa55ed 100644 --- a/scripts/extend-webpack-types.js +++ b/scripts/extend-webpack-types.js @@ -1,13 +1,15 @@ -"use strict"; - -const path = require("node:path"); -const fs = require("graceful-fs"); +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import fs from "graceful-fs"; /** * @returns {Promise} */ async function extendTypes() { - const typesPath = path.resolve(__dirname, "../types/lib/Server.d.ts"); + const typesPath = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "../types/lib/Server.d.ts", + ); const content = await fs.promises.readFile(typesPath, "utf8"); const newContent = `${content} // DO NOT REMOVE THIS! @@ -26,10 +28,4 @@ declare module "webpack" { await fs.promises.writeFile(typesPath, newContent); } -// eslint-disable-next-line unicorn/prefer-top-level-await -Promise.resolve().then( - () => extendTypes(), - (error) => { - throw error; - }, -); +await extendTypes(); diff --git a/tsconfig.json b/tsconfig.json index a28baacbf5..f8f19ec5cb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,16 @@ { "compilerOptions": { - "target": "ES2017", - "module": "commonjs", - "lib": ["es2017", "dom"], + "target": "ES2022", + "module": "nodenext", + "moduleResolution": "nodenext", + "lib": ["es2022", "dom"], "allowJs": true, "checkJs": true, "strict": true, "types": ["node"], "resolveJsonModule": true, - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "esModuleInterop": true }, "include": ["./bin/**/*", "./lib/**/*"] } diff --git a/types/lib/Server.d.ts b/types/lib/Server.d.ts index 80a7fbe2df..678da2b5b1 100644 --- a/types/lib/Server.d.ts +++ b/types/lib/Server.d.ts @@ -1,4 +1,340 @@ -export = Server; +export default Server; +export type Schema = import("schema-utils").Schema; +export type Compiler = import("webpack").Compiler; +export type MultiCompiler = import("webpack").MultiCompiler; +export type WebpackConfiguration = import("webpack").Configuration; +export type StatsOptions = import("webpack").StatsOptions; +export type StatsCompilation = import("webpack").StatsCompilation; +export type Stats = import("webpack").Stats; +export type MultiStats = import("webpack").MultiStats; +export type NetworkInterfaceInfo = import("os").NetworkInterfaceInfo; +export type WatchOptions = import("chokidar").ChokidarOptions; +export type FSWatcher = import("chokidar").FSWatcher; +export type ConnectHistoryApiFallbackOptions = + import("connect-history-api-fallback").Options; +export type Bonjour = import("bonjour-service").Bonjour; +export type BonjourOptions = import("bonjour-service").Service; +export type RequestHandler = import("http-proxy-middleware").RequestHandler; +export type HttpProxyMiddlewareOptions = + import("http-proxy-middleware").Options; +export type HttpProxyMiddlewareOptionsFilter = + import("http-proxy-middleware").Filter; +export type ServeIndexOptions = import("serve-index").Options; +export type ServeStaticOptions = import("serve-static").ServeStaticOptions; +export type IPv4 = import("ipaddr.js").IPv4; +export type IPv6 = import("ipaddr.js").IPv6; +export type Socket = import("net").Socket; +export type HTTPServer = import("http").Server; +export type IncomingMessage = import("http").IncomingMessage; +export type ServerResponse = import("http").ServerResponse; +export type OpenOptions = import("open").Options; +export type ExpressApplication = import("express").Application; +export type ExpressRequestHandler = import("express").RequestHandler; +export type ExpressErrorRequestHandler = import("express").ErrorRequestHandler; +export type ExpressRequest = import("express").Request; +export type ExpressResponse = import("express").Response; +export type EXPECTED_ANY = any; +export type NextFunction = (err?: EXPECTED_ANY) => void; +export type SimpleHandleFunction = ( + req: IncomingMessage, + res: ServerResponse, +) => void; +export type NextHandleFunction = ( + req: IncomingMessage, + res: ServerResponse, + next: NextFunction, +) => void; +export type ErrorHandleFunction = ( + err: EXPECTED_ANY, + req: IncomingMessage, + res: ServerResponse, + next: NextFunction, +) => void; +export type HandleFunction = + | SimpleHandleFunction + | NextHandleFunction + | ErrorHandleFunction; +export type ServerOptions = import("https").ServerOptions; +export type Request< + T extends BasicApplication = import("express").Application, +> = T extends ExpressApplication ? ExpressRequest : IncomingMessage; +export type Response< + T extends BasicApplication = import("express").Application, +> = T extends ExpressApplication ? ExpressResponse : ServerResponse; +export type DevMiddlewareOptions< + T extends Request, + U extends Response, +> = import("webpack-dev-middleware").Options; +export type DevMiddlewareContext< + T extends Request, + U extends Response, +> = import("webpack-dev-middleware").Context; +export type Host = "local-ip" | "local-ipv4" | "local-ipv6" | string; +export type Port = number | string | "auto"; +export type WatchFiles = { + /** + * paths + */ + paths: string | string[]; + /** + * options + */ + options?: + | (WatchOptions & { + aggregateTimeout?: number; + ignored?: WatchOptions["ignored"]; + poll?: number | boolean; + }) + | undefined; +}; +export type Static = { + /** + * directory + */ + directory?: string | undefined; + /** + * public path + */ + publicPath?: (string | string[]) | undefined; + /** + * serve index + */ + serveIndex?: (boolean | ServeIndexOptions) | undefined; + /** + * static options + */ + staticOptions?: ServeStaticOptions | undefined; + /** + * watch and watch options + */ + watch?: + | ( + | boolean + | (WatchOptions & { + aggregateTimeout?: number; + ignored?: WatchOptions["ignored"]; + poll?: number | boolean; + }) + ) + | undefined; +}; +export type NormalizedStatic = { + directory: string; + publicPath: string[]; + serveIndex: false | ServeIndexOptions; + staticOptions: ServeStaticOptions; + watch: false | WatchOptions; +}; +export type ServerType< + A extends BasicApplication = import("express").Application, + S extends BasicServer = import("http").Server< + typeof import("http").IncomingMessage, + typeof import("http").ServerResponse + >, +> = + | "http" + | "https" + | "http2" + | string + | ((serverOptions: ServerOptions, application: A) => S); +export type ServerConfiguration< + A extends BasicApplication = import("express").Application, + S extends BasicServer = import("http").Server< + typeof import("http").IncomingMessage, + typeof import("http").ServerResponse + >, +> = { + /** + * type + */ + type?: ServerType | undefined; + /** + * options + */ + options?: ServerOptions | undefined; +}; +export type WebSocketServerConfiguration = { + /** + * type + */ + type?: ("ws" | string | (() => WebSocketServerConfiguration)) | undefined; + /** + * options + */ + options?: Record | undefined; +}; +export type ClientConnection = (import("ws").WebSocket & { + send: import("ws").WebSocket["send"]; + terminate: import("ws").WebSocket["terminate"]; + ping: import("ws").WebSocket["ping"]; +}) & { + isAlive?: boolean; +}; +export type WebSocketServer = import("ws").WebSocketServer & { + close: import("ws").WebSocketServer["close"]; +}; +export type WebSocketServerImplementation = { + implementation: WebSocketServer; + clients: ClientConnection[]; +}; +export type ProxyConfigArrayItem = { + path?: HttpProxyMiddlewareOptionsFilter | undefined; + context?: HttpProxyMiddlewareOptionsFilter | undefined; +} & HttpProxyMiddlewareOptions; +export type ProxyConfigArray = ( + | ProxyConfigArrayItem + | (( + req?: Request | undefined, + res?: Response | undefined, + next?: NextFunction | undefined, + ) => ProxyConfigArrayItem) +)[]; +export type OpenApp = { + name?: string | undefined; + arguments?: string[] | undefined; +}; +export type Open = { + app?: (string | string[] | OpenApp) | undefined; + /** + * target + */ + target?: (string | string[]) | undefined; +}; +export type NormalizedOpen = { + target: string; + options: import("open").Options; +}; +export type WebSocketURL = { + /** + * hostname + */ + hostname?: string | undefined; + /** + * password + */ + password?: string | undefined; + /** + * pathname + */ + pathname?: string | undefined; + /** + * port + */ + port?: (number | string) | undefined; + /** + * protocol + */ + protocol?: string | undefined; + /** + * username + */ + username?: string | undefined; +}; +export type OverlayMessageOptions = boolean | ((error: Error) => void); +export type ClientConfiguration = { + /** + * logging + */ + logging?: + | ("log" | "info" | "warn" | "error" | "none" | "verbose") + | undefined; + /** + * overlay + */ + overlay?: + | ( + | boolean + | { + warnings?: OverlayMessageOptions; + errors?: OverlayMessageOptions; + runtimeErrors?: OverlayMessageOptions; + } + ) + | undefined; + /** + * progress + */ + progress?: boolean | undefined; + /** + * reconnect + */ + reconnect?: (boolean | number) | undefined; + /** + * web socket transport + */ + webSocketTransport?: ("ws" | string) | undefined; + /** + * web socket URL + */ + webSocketURL?: (string | WebSocketURL) | undefined; +}; +export type Headers = + | Array<{ + key: string; + value: string; + }> + | Record; +export type MiddlewareHandler< + T extends BasicApplication = import("express").Application, +> = T extends ExpressApplication + ? ExpressRequestHandler | ExpressErrorRequestHandler + : HandleFunction; +export type MiddlewareObject = { + name?: string; + path?: string; + middleware: MiddlewareHandler; +}; +export type Middleware = MiddlewareObject | MiddlewareHandler; +export type BasicServer = import("net").Server | import("tls").Server; +export type Configuration< + A extends BasicApplication = import("express").Application, + S extends BasicServer = import("http").Server< + typeof import("http").IncomingMessage, + typeof import("http").ServerResponse + >, +> = { + ipc?: (boolean | string) | undefined; + host?: Host | undefined; + port?: Port | undefined; + hot?: (boolean | "only") | undefined; + liveReload?: boolean | undefined; + devMiddleware?: DevMiddlewareOptions | undefined; + compress?: boolean | undefined; + allowedHosts?: ("auto" | "all" | string | string[]) | undefined; + historyApiFallback?: (boolean | ConnectHistoryApiFallbackOptions) | undefined; + bonjour?: (boolean | Record | BonjourOptions) | undefined; + watchFiles?: + | (string | string[] | WatchFiles | Array) + | undefined; + static?: (boolean | string | Static | Array) | undefined; + server?: (ServerType | ServerConfiguration) | undefined; + app?: (() => Promise) | undefined; + webSocketServer?: + | (boolean | "ws" | string | WebSocketServerConfiguration) + | undefined; + proxy?: ProxyConfigArray | undefined; + open?: (boolean | string | Open | Array) | undefined; + setupExitSignals?: boolean | undefined; + client?: (boolean | ClientConfiguration) | undefined; + headers?: + | ( + | Headers + | (( + req: Request, + res: Response, + context: DevMiddlewareContext | undefined, + ) => Headers) + ) + | undefined; + onListening?: ((devServer: Server) => void) | undefined; + setupMiddlewares?: + | ((middlewares: Middleware[], devServer: Server) => Middleware[]) + | undefined; +}; +export type FunctionReturning = () => T; +export type BasicApplication = { + use: typeof useFn; +}; /** * @typedef {object} BasicApplication * @property {typeof useFn} use @@ -1219,7 +1555,7 @@ declare class Server< /** * @template T * @private - * @returns {T} server transport + * @returns {Promise} server transport */ private getServerTransport; /** @@ -1265,17 +1601,17 @@ declare class Server< private stats; /** * @private - * @returns {void} + * @returns {Promise} */ private setupWatchStaticFiles; /** * @private - * @returns {void} + * @returns {Promise} */ private setupWatchFiles; /** * @private - * @returns {void} + * @returns {Promise} */ private setupMiddlewares; /** @type {import("webpack-dev-middleware").API} */ @@ -1285,534 +1621,133 @@ declare class Server< import("express-serve-static-core").ParamsDictionary, any, any, - qs.ParsedQs, + import("qs").ParsedQs, Record >, import("express").Response> > | undefined; /** - * @private - * @returns {Promise} - */ - private createServer; - /** @type {S | undefined} */ - server: S | undefined; - isTlsServer: boolean | undefined; - /** - * @private - * @returns {void} - */ - private createWebSocketServer; - /** @type {WebSocketServerImplementation | undefined | null} */ - webSocketServer: WebSocketServerImplementation | undefined | null; - /** - * @private - * @param {string} defaultOpenTarget default open target - * @returns {Promise} - */ - private openBrowser; - /** - * @private - * @returns {void} - */ - private runBonjour; - /** - * @private - * @type {Bonjour | undefined} - */ - private bonjour; - /** - * @private - * @param {() => void} callback callback - * @returns {void} - */ - private stopBonjour; - /** - * @private - * @returns {Promise} - */ - private logStatus; - /** - * @private - * @param {Request} req request - * @param {Response} res response - * @param {NextFunction} next next function - */ - private setHeaders; - /** - * @private - * @param {string} value value - * @returns {boolean} true when host allowed, otherwise false - */ - private isHostAllowed; - /** - * @private - * @param {{ [key: string]: string | undefined }} headers headers - * @param {string} headerToCheck header to check - * @param {boolean} validateHost need to validate host - * @returns {boolean} true when host is valid, otherwise false - */ - private isValidHost; - /** - * @private - * @param {{ [key: string]: string | undefined }} headers headers - * @returns {boolean} true when is same origin, otherwise false - */ - private isSameOrigin; - /** - * @param {ClientConnection[]} clients clients - * @param {string} type type - * @param {EXPECTED_ANY=} data data - * @param {EXPECTED_ANY=} params params - */ - sendMessage( - clients: ClientConnection[], - type: string, - data?: EXPECTED_ANY | undefined, - params?: EXPECTED_ANY | undefined, - ): void; - /** - * @private - * @param {ClientConnection[]} clients clients - * @param {StatsCompilation} stats stats - * @param {boolean=} force force - */ - private sendStats; - /** - * @param {string | string[]} watchPath watch path - * @param {WatchOptions=} watchOptions watch options - */ - watchFiles( - watchPath: string | string[], - watchOptions?: WatchOptions | undefined, - ): void; - /** - * @param {import("webpack-dev-middleware").Callback=} callback callback - */ - invalidate( - callback?: import("webpack-dev-middleware").Callback | undefined, - ): void; - /** - * @returns {Promise} - */ - start(): Promise; - /** - * @param {((err?: Error) => void)=} callback callback - */ - startCallback(callback?: ((err?: Error) => void) | undefined): void; - /** - * @returns {Promise} - */ - stop(): Promise; - /** - * @param {((err?: Error) => void)=} callback callback - */ - stopCallback(callback?: ((err?: Error) => void) | undefined): void; - #private; -} -declare namespace Server { - export { - Schema, - Compiler, - MultiCompiler, - WebpackConfiguration, - StatsOptions, - StatsCompilation, - Stats, - MultiStats, - NetworkInterfaceInfo, - WatchOptions, - FSWatcher, - ConnectHistoryApiFallbackOptions, - Bonjour, - BonjourOptions, - RequestHandler, - HttpProxyMiddlewareOptions, - HttpProxyMiddlewareOptionsFilter, - ServeIndexOptions, - ServeStaticOptions, - IPv4, - IPv6, - Socket, - HTTPServer, - IncomingMessage, - ServerResponse, - OpenOptions, - ExpressApplication, - ExpressRequestHandler, - ExpressErrorRequestHandler, - ExpressRequest, - ExpressResponse, - EXPECTED_ANY, - NextFunction, - SimpleHandleFunction, - NextHandleFunction, - ErrorHandleFunction, - HandleFunction, - ServerOptions, - Request, - Response, - DevMiddlewareOptions, - DevMiddlewareContext, - Host, - Port, - WatchFiles, - Static, - NormalizedStatic, - ServerType, - ServerConfiguration, - WebSocketServerConfiguration, - ClientConnection, - WebSocketServer, - WebSocketServerImplementation, - ProxyConfigArrayItem, - ProxyConfigArray, - OpenApp, - Open, - NormalizedOpen, - WebSocketURL, - OverlayMessageOptions, - ClientConfiguration, - Headers, - MiddlewareHandler, - MiddlewareObject, - Middleware, - BasicServer, - Configuration, - FunctionReturning, - BasicApplication, - }; -} -type Schema = import("schema-utils/declarations/validate").Schema; -type Compiler = import("webpack").Compiler; -type MultiCompiler = import("webpack").MultiCompiler; -type WebpackConfiguration = import("webpack").Configuration; -type StatsOptions = import("webpack").StatsOptions; -type StatsCompilation = import("webpack").StatsCompilation; -type Stats = import("webpack").Stats; -type MultiStats = import("webpack").MultiStats; -type NetworkInterfaceInfo = import("os").NetworkInterfaceInfo; -type WatchOptions = import("chokidar").ChokidarOptions; -type FSWatcher = import("chokidar").FSWatcher; -type ConnectHistoryApiFallbackOptions = - import("connect-history-api-fallback").Options; -type Bonjour = import("bonjour-service").Bonjour; -type BonjourOptions = import("bonjour-service").Service; -type RequestHandler = import("http-proxy-middleware").RequestHandler; -type HttpProxyMiddlewareOptions = import("http-proxy-middleware").Options; -type HttpProxyMiddlewareOptionsFilter = import("http-proxy-middleware").Filter; -type ServeIndexOptions = import("serve-index").Options; -type ServeStaticOptions = import("serve-static").ServeStaticOptions; -type IPv4 = import("ipaddr.js").IPv4; -type IPv6 = import("ipaddr.js").IPv6; -type Socket = import("net").Socket; -type HTTPServer = import("http").Server; -type IncomingMessage = import("http").IncomingMessage; -type ServerResponse = import("http").ServerResponse; -type OpenOptions = import("open").Options; -type ExpressApplication = import("express").Application; -type ExpressRequestHandler = import("express").RequestHandler; -type ExpressErrorRequestHandler = import("express").ErrorRequestHandler; -type ExpressRequest = import("express").Request; -type ExpressResponse = import("express").Response; -type EXPECTED_ANY = any; -type NextFunction = (err?: EXPECTED_ANY) => void; -type SimpleHandleFunction = (req: IncomingMessage, res: ServerResponse) => void; -type NextHandleFunction = ( - req: IncomingMessage, - res: ServerResponse, - next: NextFunction, -) => void; -type ErrorHandleFunction = ( - err: EXPECTED_ANY, - req: IncomingMessage, - res: ServerResponse, - next: NextFunction, -) => void; -type HandleFunction = - | SimpleHandleFunction - | NextHandleFunction - | ErrorHandleFunction; -type ServerOptions = import("https").ServerOptions; -type Request = - T extends ExpressApplication ? ExpressRequest : IncomingMessage; -type Response = - T extends ExpressApplication ? ExpressResponse : ServerResponse; -type DevMiddlewareOptions< - T extends Request, - U extends Response, -> = import("webpack-dev-middleware").Options; -type DevMiddlewareContext< - T extends Request, - U extends Response, -> = import("webpack-dev-middleware").Context; -type Host = "local-ip" | "local-ipv4" | "local-ipv6" | string; -type Port = number | string | "auto"; -type WatchFiles = { - /** - * paths - */ - paths: string | string[]; - /** - * options - */ - options?: - | (WatchOptions & { - aggregateTimeout?: number; - ignored?: WatchOptions["ignored"]; - poll?: number | boolean; - }) - | undefined; -}; -type Static = { - /** - * directory - */ - directory?: string | undefined; - /** - * public path - */ - publicPath?: (string | string[]) | undefined; - /** - * serve index - */ - serveIndex?: (boolean | ServeIndexOptions) | undefined; - /** - * static options + * @private + * @returns {Promise} */ - staticOptions?: ServeStaticOptions | undefined; + private createServer; + /** @type {S | undefined} */ + server: S | undefined; + isTlsServer: boolean | undefined; /** - * watch and watch options + * @private + * @returns {Promise} */ - watch?: - | ( - | boolean - | (WatchOptions & { - aggregateTimeout?: number; - ignored?: WatchOptions["ignored"]; - poll?: number | boolean; - }) - ) - | undefined; -}; -type NormalizedStatic = { - directory: string; - publicPath: string[]; - serveIndex: false | ServeIndexOptions; - staticOptions: ServeStaticOptions; - watch: false | WatchOptions; -}; -type ServerType< - A extends BasicApplication = import("express").Application, - S extends BasicServer = import("http").Server< - typeof import("http").IncomingMessage, - typeof import("http").ServerResponse - >, -> = - | "http" - | "https" - | "http2" - | string - | ((serverOptions: ServerOptions, application: A) => S); -type ServerConfiguration< - A extends BasicApplication = import("express").Application, - S extends BasicServer = import("http").Server< - typeof import("http").IncomingMessage, - typeof import("http").ServerResponse - >, -> = { + private createWebSocketServer; + /** @type {WebSocketServerImplementation | undefined | null} */ + webSocketServer: WebSocketServerImplementation | undefined | null; /** - * type + * @private + * @param {string} defaultOpenTarget default open target + * @returns {Promise} */ - type?: ServerType | undefined; + private openBrowser; /** - * options + * @private + * @returns {Promise} */ - options?: ServerOptions | undefined; -}; -type WebSocketServerConfiguration = { + private runBonjour; /** - * type + * @private + * @type {Bonjour | undefined} */ - type?: ("ws" | string | (() => WebSocketServerConfiguration)) | undefined; + private bonjour; /** - * options + * @private + * @param {() => void} callback callback + * @returns {void} */ - options?: Record | undefined; -}; -type ClientConnection = (import("ws").WebSocket & { - send: import("ws").WebSocket["send"]; - terminate: import("ws").WebSocket["terminate"]; - ping: import("ws").WebSocket["ping"]; -}) & { - isAlive?: boolean; -}; -type WebSocketServer = import("ws").WebSocketServer & { - close: import("ws").WebSocketServer["close"]; -}; -type WebSocketServerImplementation = { - implementation: WebSocketServer; - clients: ClientConnection[]; -}; -type ProxyConfigArrayItem = { - path?: HttpProxyMiddlewareOptionsFilter | undefined; - context?: HttpProxyMiddlewareOptionsFilter | undefined; -} & HttpProxyMiddlewareOptions; -type ProxyConfigArray = ( - | ProxyConfigArrayItem - | (( - req?: Request | undefined, - res?: Response | undefined, - next?: NextFunction | undefined, - ) => ProxyConfigArrayItem) -)[]; -type OpenApp = { - name?: string | undefined; - arguments?: string[] | undefined; -}; -type Open = { - app?: (string | string[] | OpenApp) | undefined; + private stopBonjour; /** - * target + * @private + * @returns {Promise} */ - target?: (string | string[]) | undefined; -}; -type NormalizedOpen = { - target: string; - options: import("open").Options; -}; -type WebSocketURL = { + private logStatus; /** - * hostname + * @private + * @param {Request} req request + * @param {Response} res response + * @param {NextFunction} next next function */ - hostname?: string | undefined; + private setHeaders; /** - * password + * @private + * @param {string} value value + * @returns {boolean} true when host allowed, otherwise false */ - password?: string | undefined; + private isHostAllowed; /** - * pathname + * @private + * @param {{ [key: string]: string | undefined }} headers headers + * @param {string} headerToCheck header to check + * @param {boolean} validateHost need to validate host + * @returns {boolean} true when host is valid, otherwise false */ - pathname?: string | undefined; + private isValidHost; /** - * port + * @private + * @param {{ [key: string]: string | undefined }} headers headers + * @returns {boolean} true when is same origin, otherwise false */ - port?: (number | string) | undefined; + private isSameOrigin; /** - * protocol + * @param {ClientConnection[]} clients clients + * @param {string} type type + * @param {EXPECTED_ANY=} data data + * @param {EXPECTED_ANY=} params params */ - protocol?: string | undefined; + sendMessage( + clients: ClientConnection[], + type: string, + data?: EXPECTED_ANY | undefined, + params?: EXPECTED_ANY | undefined, + ): void; /** - * username + * @private + * @param {ClientConnection[]} clients clients + * @param {StatsCompilation} stats stats + * @param {boolean=} force force */ - username?: string | undefined; -}; -type OverlayMessageOptions = boolean | ((error: Error) => void); -type ClientConfiguration = { + private sendStats; /** - * logging + * @param {string | string[]} watchPath watch path + * @param {WatchOptions=} watchOptions watch options + * @returns {Promise} */ - logging?: - | ("log" | "info" | "warn" | "error" | "none" | "verbose") - | undefined; + watchFiles( + watchPath: string | string[], + watchOptions?: WatchOptions | undefined, + ): Promise; /** - * overlay + * @param {import("webpack-dev-middleware").Callback=} callback callback */ - overlay?: - | ( - | boolean - | { - warnings?: OverlayMessageOptions; - errors?: OverlayMessageOptions; - runtimeErrors?: OverlayMessageOptions; - } - ) - | undefined; + invalidate( + callback?: import("webpack-dev-middleware").Callback | undefined, + ): void; /** - * progress + * @returns {Promise} */ - progress?: boolean | undefined; + start(): Promise; /** - * reconnect + * @param {((err?: Error) => void)=} callback callback */ - reconnect?: (boolean | number) | undefined; + startCallback(callback?: ((err?: Error) => void) | undefined): void; /** - * web socket transport + * @returns {Promise} */ - webSocketTransport?: ("ws" | string) | undefined; + stop(): Promise; /** - * web socket URL + * @param {((err?: Error) => void)=} callback callback */ - webSocketURL?: (string | WebSocketURL) | undefined; -}; -type Headers = - | Array<{ - key: string; - value: string; - }> - | Record; -type MiddlewareHandler< - T extends BasicApplication = import("express").Application, -> = T extends ExpressApplication - ? ExpressRequestHandler | ExpressErrorRequestHandler - : HandleFunction; -type MiddlewareObject = { - name?: string; - path?: string; - middleware: MiddlewareHandler; -}; -type Middleware = MiddlewareObject | MiddlewareHandler; -type BasicServer = import("net").Server | import("tls").Server; -type Configuration< - A extends BasicApplication = import("express").Application, - S extends BasicServer = import("http").Server< - typeof import("http").IncomingMessage, - typeof import("http").ServerResponse - >, -> = { - ipc?: (boolean | string) | undefined; - host?: Host | undefined; - port?: Port | undefined; - hot?: (boolean | "only") | undefined; - liveReload?: boolean | undefined; - devMiddleware?: DevMiddlewareOptions | undefined; - compress?: boolean | undefined; - allowedHosts?: ("auto" | "all" | string | string[]) | undefined; - historyApiFallback?: (boolean | ConnectHistoryApiFallbackOptions) | undefined; - bonjour?: (boolean | Record | BonjourOptions) | undefined; - watchFiles?: - | (string | string[] | WatchFiles | Array) - | undefined; - static?: (boolean | string | Static | Array) | undefined; - server?: (ServerType | ServerConfiguration) | undefined; - app?: (() => Promise) | undefined; - webSocketServer?: - | (boolean | "ws" | string | WebSocketServerConfiguration) - | undefined; - proxy?: ProxyConfigArray | undefined; - open?: (boolean | string | Open | Array) | undefined; - setupExitSignals?: boolean | undefined; - client?: (boolean | ClientConfiguration) | undefined; - headers?: - | ( - | Headers - | (( - req: Request, - res: Response, - context: DevMiddlewareContext | undefined, - ) => Headers) - ) - | undefined; - onListening?: ((devServer: Server) => void) | undefined; - setupMiddlewares?: - | ((middlewares: Middleware[], devServer: Server) => Middleware[]) - | undefined; -}; -type FunctionReturning = () => T; -type BasicApplication = { - use: typeof useFn; -}; + stopCallback(callback?: ((err?: Error) => void) | undefined): void; + #private; +} /** * @overload * @param {NextHandleFunction} fn function diff --git a/types/lib/getPort.d.ts b/types/lib/getPort.d.ts index 677eb97671..d6eec701a3 100644 --- a/types/lib/getPort.d.ts +++ b/types/lib/getPort.d.ts @@ -1,4 +1,4 @@ -export = getPorts; +export default getPorts; /** * @param {number} basePort base port * @param {string=} host host diff --git a/types/lib/servers/BaseServer.d.ts b/types/lib/servers/BaseServer.d.ts index 07d29fb4b5..4094129b1a 100644 --- a/types/lib/servers/BaseServer.d.ts +++ b/types/lib/servers/BaseServer.d.ts @@ -1,15 +1,12 @@ -export = BaseServer; -declare class BaseServer { +/** @typedef {import("../Server.js").ClientConnection} ClientConnection */ +export default class BaseServer { /** - * @param {import("../Server")} server server + * @param {import("../Server.js").default} server server */ - constructor(server: import("../Server")); - /** @type {import("../Server")} */ - server: import("../Server"); + constructor(server: import("../Server.js").default); + /** @type {import("../Server.js").default} */ + server: import("../Server.js").default; /** @type {ClientConnection[]} */ clients: ClientConnection[]; } -declare namespace BaseServer { - export { ClientConnection }; -} -type ClientConnection = import("../Server").ClientConnection; +export type ClientConnection = import("../Server.js").ClientConnection; diff --git a/types/lib/servers/WebsocketServer.d.ts b/types/lib/servers/WebsocketServer.d.ts index ce8c693789..19e7acbcd8 100644 --- a/types/lib/servers/WebsocketServer.d.ts +++ b/types/lib/servers/WebsocketServer.d.ts @@ -1,16 +1,13 @@ -export = WebsocketServer; -declare class WebsocketServer extends BaseServer { +/** @typedef {import("../Server.js").WebSocketServerConfiguration} WebSocketServerConfiguration */ +/** @typedef {import("../Server.js").ClientConnection} ClientConnection */ +export default class WebsocketServer extends BaseServer { static heartbeatInterval: number; - implementation: WebSocket.Server< - typeof WebSocket, + implementation: import("ws").Server< + typeof import("ws").default, typeof import("http").IncomingMessage >; } -declare namespace WebsocketServer { - export { WebSocketServerConfiguration, ClientConnection }; -} -import BaseServer = require("./BaseServer"); -import WebSocket = require("ws"); -type WebSocketServerConfiguration = - import("../Server").WebSocketServerConfiguration; -type ClientConnection = import("../Server").ClientConnection; +export type WebSocketServerConfiguration = + import("../Server.js").WebSocketServerConfiguration; +export type ClientConnection = import("../Server.js").ClientConnection; +import BaseServer from "./BaseServer.js";