From db6b4fda90d0627ed0f04a8467db32d041bdfb72 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 1 Jul 2025 16:23:51 +0300 Subject: [PATCH 1/2] refactor: update webpack config --- README.md | 33 +++--- package-lock.json | 174 +++++++++++++++++++++++++++++++- package.json | 48 ++++----- src/index.js | 8 +- src/middleware.js | 28 ++--- src/utils/compatibleAPI.js | 20 ++-- src/utils/getFilenameFromUrl.js | 3 +- test/helpers/runner.js | 5 +- test/logging.test.js | 2 +- test/middleware.test.js | 33 +++--- test/validation-options.test.js | 2 +- types/utils/compatibleAPI.d.ts | 136 ++++++++++++------------- 12 files changed, 326 insertions(+), 166 deletions(-) diff --git a/README.md b/README.md index 2813071b1..c4735c4ee 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ npm install webpack-dev-middleware --save-dev ## Usage ```js +const express = require("express"); const webpack = require("webpack"); const middleware = require("webpack-dev-middleware"); @@ -46,8 +47,6 @@ const compiler = webpack({ // webpack options }); -const express = require("express"); - const app = express(); app.use( @@ -275,10 +274,10 @@ You have to provide `.join()` and `mkdirp` method to the `outputFileSystem` inst This can be done simply by using `path.join`: ```js -const webpack = require("webpack"); const path = require("node:path"); -const myOutputFileSystem = require("my-fs"); const mkdirp = require("mkdirp"); +const myOutputFileSystem = require("my-fs"); +const webpack = require("webpack"); myOutputFileSystem.join = path.join.bind(path); // no need to bind myOutputFileSystem.mkdirp = mkdirp.bind(mkdirp); // no need to bind @@ -475,6 +474,7 @@ Since `output.publicPath` and `output.filename`/`output.chunkFilename` can be dy But there is a solution to avoid it - mount the middleware to a non-root route, for example: ```js +const express = require("express"); const webpack = require("webpack"); const middleware = require("webpack-dev-middleware"); @@ -482,8 +482,6 @@ const compiler = webpack({ // webpack options }); -const express = require("express"); - const app = express(); // Mounting the middleware to the non-root route allows avoids this. @@ -518,15 +516,14 @@ Example Implementation: ```js const express = require("express"); +const isObject = require("is-object"); const webpack = require("webpack"); +const middleware = require("webpack-dev-middleware"); const compiler = webpack({ /* Webpack configuration */ }); -const isObject = require("is-object"); -const middleware = require("webpack-dev-middleware"); - // eslint-disable-next-line new-cap const app = new express(); @@ -606,11 +603,11 @@ Examples of use with other servers will follow here. ### Connect ```js -const connect = require("connect"); const http = require("node:http"); +const connect = require("connect"); const webpack = require("webpack"); -const webpackConfig = require("./webpack.config.js"); const devMiddleware = require("webpack-dev-middleware"); +const webpackConfig = require("./webpack.config.js"); const compiler = webpack(webpackConfig); const devMiddlewareOptions = { @@ -627,11 +624,11 @@ http.createServer(app).listen(3000); ```js const http = require("node:http"); -const Router = require("router"); const finalhandler = require("finalhandler"); +const Router = require("router"); const webpack = require("webpack"); -const webpackConfig = require("./webpack.config.js"); const devMiddleware = require("webpack-dev-middleware"); +const webpackConfig = require("./webpack.config.js"); const compiler = webpack(webpackConfig); const devMiddlewareOptions = { @@ -655,8 +652,8 @@ server.listen(3000); ```js const express = require("express"); const webpack = require("webpack"); -const webpackConfig = require("./webpack.config.js"); const devMiddleware = require("webpack-dev-middleware"); +const webpackConfig = require("./webpack.config.js"); const compiler = webpack(webpackConfig); const devMiddlewareOptions = { @@ -674,8 +671,8 @@ app.listen(3000, () => console.log("Example app listening on port 3000!")); ```js const Koa = require("koa"); const webpack = require("webpack"); -const webpackConfig = require("./webpack.simple.config"); const middleware = require("webpack-dev-middleware"); +const webpackConfig = require("./webpack.simple.config"); const compiler = webpack(webpackConfig); const devMiddlewareOptions = { @@ -693,8 +690,8 @@ app.listen(3000); ```js const Hapi = require("@hapi/hapi"); const webpack = require("webpack"); -const webpackConfig = require("./webpack.config.js"); const devMiddleware = require("webpack-dev-middleware"); +const webpackConfig = require("./webpack.config.js"); const compiler = webpack(webpackConfig); const devMiddlewareOptions = {}; @@ -727,8 +724,8 @@ Fastify interop will require the use of `fastify-express` instead of `middie` fo ```js const fastify = require("fastify")(); const webpack = require("webpack"); -const webpackConfig = require("./webpack.config.js"); const devMiddleware = require("webpack-dev-middleware"); +const webpackConfig = require("./webpack.config.js"); const compiler = webpack(webpackConfig); const devMiddlewareOptions = { @@ -743,9 +740,9 @@ await fastify.listen(3000); ### Hono ```js -import webpack from "webpack"; import { serve } from "@hono/node-server"; import { Hono } from "hono"; +import webpack from "webpack"; import devMiddleware from "webpack-dev-middleware"; import webpackConfig from "./webpack.config.js"; diff --git a/package-lock.json b/package-lock.json index 744bdd00d..48d5c74cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "del-cli": "^6.0.0", "eslint": "^9.28.0", "eslint-config-prettier": "^10.1.5", - "eslint-config-webpack": "^4.1.4", + "eslint-config-webpack": "^4.2.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.12.0", "eslint-plugin-jsdoc": "^50.7.1", @@ -9687,13 +9687,16 @@ } }, "node_modules/eslint-config-webpack": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.1.4.tgz", - "integrity": "sha512-J98kJYTxa+qvai1Lldmk0508EuIno5Wpf8n+QSNud+8YDR8732GXgsxUctAo8tbxOYTaqguf1TJMG5vHYhNvSw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.2.2.tgz", + "integrity": "sha512-2RJhkMxyLiACrsZ/sei3/uLv9DDeAdeZHP9o9Yjyjny0fGcHrvwwc0jmkjlPlmk1h2p1NtFvOYSGOvOuSxhm9g==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.7.2" + "detect-indent": "^7.0.1", + "jsonc-eslint-parser": "^2.4.0", + "semver": "^7.7.2", + "sort-package-json": "^3.3.1" }, "engines": { "node": ">= 18.20.0" @@ -9736,6 +9739,16 @@ } } }, + "node_modules/eslint-config-webpack/node_modules/detect-indent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, "node_modules/eslint-config-webpack/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -11872,6 +11885,16 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/git-hooks-list": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.1.1.tgz", + "integrity": "sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, "node_modules/git-raw-commits": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", @@ -15085,6 +15108,69 @@ "node": ">=6" } }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -19161,6 +19247,84 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sort-package-json": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.3.1.tgz", + "integrity": "sha512-awjhQR2Iy5UN3NuguAK5+RezcEuUg9Ra4O8y2Aj+DlJa7MywyHaipAPf9bu4qqFj0hsYHHoT9sS3aV7Ucu728g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.1", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.0.0", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.1", + "sort-object-keys": "^1.1.3", + "tinyglobby": "^0.2.12" + }, + "bin": { + "sort-package-json": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sort-package-json/node_modules/detect-indent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/sort-package-json/node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-package-json/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-package-json/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", diff --git a/package.json b/package.json index 9197fbb1c..8b888809c 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,26 @@ "name": "webpack-dev-middleware", "version": "7.4.2", "description": "A development middleware for webpack", - "license": "MIT", - "repository": "webpack/webpack-dev-middleware", - "author": "Tobias Koppers @sokra", + "keywords": [ + "webpack", + "middleware", + "development" + ], "homepage": "https://github.com/webpack/webpack-dev-middleware", "bugs": "https://github.com/webpack/webpack-dev-middleware/issues", + "repository": "webpack/webpack-dev-middleware", "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, + "license": "MIT", + "author": "Tobias Koppers @sokra", "main": "dist/index.js", "types": "types/index.d.ts", - "engines": { - "node": ">= 18.12.0" - }, + "files": [ + "dist", + "types" + ], "scripts": { "commitlint": "commitlint --from=master", "security": "npm audit --production", @@ -40,18 +46,6 @@ "prepare": "husky && npm run build", "release": "standard-version" }, - "files": [ - "dist", - "types" - ], - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - }, "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", @@ -85,7 +79,7 @@ "del-cli": "^6.0.0", "globals": "^16.2.0", "eslint": "^9.28.0", - "eslint-config-webpack": "^4.1.4", + "eslint-config-webpack": "^4.2.2", "eslint-config-prettier": "^10.1.5", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.12.0", @@ -114,9 +108,15 @@ "typescript": "^5.3.3", "webpack": "^5.93.0" }, - "keywords": [ - "webpack", - "middleware", - "development" - ] + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + }, + "engines": { + "node": ">= 18.12.0" + } } diff --git a/src/index.js b/src/index.js index 1fdc6ed54..c91f6e723 100644 --- a/src/index.js +++ b/src/index.js @@ -1,13 +1,13 @@ -const { validate } = require("schema-utils"); const mime = require("mime-types"); +const { validate } = require("schema-utils"); const middleware = require("./middleware"); +const schema = require("./options.json"); const getFilenameFromUrl = require("./utils/getFilenameFromUrl"); +const ready = require("./utils/ready"); const setupHooks = require("./utils/setupHooks"); -const setupWriteToDisk = require("./utils/setupWriteToDisk"); const setupOutputFileSystem = require("./utils/setupOutputFileSystem"); -const ready = require("./utils/ready"); -const schema = require("./options.json"); +const setupWriteToDisk = require("./utils/setupWriteToDisk"); const noop = () => {}; diff --git a/src/middleware.js b/src/middleware.js index 745b70531..dd0d75fd2 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -4,30 +4,30 @@ const mime = require("mime-types"); const onFinishedStream = require("on-finished"); -const getFilenameFromUrl = require("./utils/getFilenameFromUrl"); const { - setStatusCode, - getStatusCode, + createReadStreamOrReadFileSync, + finish, + getHeadersSent, + getOutgoing, + getReadyReadableStreamState, getRequestHeader, getRequestMethod, getRequestURL, getResponseHeader, - setResponseHeader, - removeResponseHeader, getResponseHeaders, - getHeadersSent, - send, - finish, - pipe, - createReadStreamOrReadFileSync, - getOutgoing, + getStatusCode, initState, + pipe, + removeResponseHeader, + send, + setResponseHeader, setState, - getReadyReadableStreamState, + setStatusCode, } = require("./utils/compatibleAPI"); -const ready = require("./utils/ready"); -const parseTokenList = require("./utils/parseTokenList"); +const getFilenameFromUrl = require("./utils/getFilenameFromUrl"); const memorize = require("./utils/memorize"); +const parseTokenList = require("./utils/parseTokenList"); +const ready = require("./utils/ready"); /** @typedef {import("./index.js").NextFunction} NextFunction */ /** @typedef {import("./index.js").IncomingMessage} IncomingMessage */ diff --git a/src/utils/compatibleAPI.js b/src/utils/compatibleAPI.js index 6ec7b2751..a28f3a0ad 100644 --- a/src/utils/compatibleAPI.js +++ b/src/utils/compatibleAPI.js @@ -316,22 +316,22 @@ function getReadyReadableStreamState(res) { } module.exports = { - setStatusCode, - getStatusCode, + createReadStreamOrReadFileSync, + finish, + getHeadersSent, + getOutgoing, + getReadyReadableStreamState, getRequestHeader, getRequestMethod, getRequestURL, getResponseHeader, - setResponseHeader, - removeResponseHeader, getResponseHeaders, - getHeadersSent, + getStatusCode, + initState, pipe, + removeResponseHeader, send, - finish, - createReadStreamOrReadFileSync, - getOutgoing, - initState, + setResponseHeader, setState, - getReadyReadableStreamState, + setStatusCode, }; diff --git a/src/utils/getFilenameFromUrl.js b/src/utils/getFilenameFromUrl.js index e650fd8f6..44c7b7bd6 100644 --- a/src/utils/getFilenameFromUrl.js +++ b/src/utils/getFilenameFromUrl.js @@ -1,6 +1,7 @@ const path = require("node:path"); -const { parse } = require("node:url"); const querystring = require("node:querystring"); +// eslint-disable-next-line n/no-deprecated-api +const { parse } = require("node:url"); const getPaths = require("./getPaths"); const memorize = require("./memorize"); diff --git a/test/helpers/runner.js b/test/helpers/runner.js index 164cef1ed..f79b9b83c 100755 --- a/test/helpers/runner.js +++ b/test/helpers/runner.js @@ -1,8 +1,6 @@ -#!/usr/bin/env node - +const merge = require("deepmerge"); const express = require("express"); const webpack = require("webpack"); -const merge = require("deepmerge"); const middleware = require("../../dist"); const defaultConfig = require("../fixtures/webpack.config"); @@ -147,6 +145,7 @@ app.listen((error) => { // }); // break; case "exit": + // eslint-disable-next-line n/no-process-exit process.exit(); break; } diff --git a/test/logging.test.js b/test/logging.test.js index ab5b0615e..eef6021d4 100644 --- a/test/logging.test.js +++ b/test/logging.test.js @@ -1,6 +1,6 @@ import fs from "node:fs"; -import path from "node:path"; import os from "node:os"; +import path from "node:path"; import execa from "execa"; import stripAnsi from "strip-ansi"; diff --git a/test/middleware.test.js b/test/middleware.test.js index 0e48af845..1be597ab5 100644 --- a/test/middleware.test.js +++ b/test/middleware.test.js @@ -1,37 +1,36 @@ import fs from "node:fs"; import path from "node:path"; +import Hapi from "@hapi/hapi"; +import { serve } from "@hono/node-server"; import connect from "connect"; -import expressOld from "express-4"; import express from "express"; -import router from "router"; -import finalhandler from "finalhandler"; +import expressOld from "express-4"; import fastify from "fastify"; -import koa from "koa"; -import Hapi from "@hapi/hapi"; +import finalhandler from "finalhandler"; import { Hono } from "hono"; -import { serve } from "@hono/node-server"; +import koa from "koa"; +import memfs, { Volume, createFsFromVolume } from "memfs"; +import mime from "mime-types"; +import router from "router"; import request from "supertest"; -import memfs, { createFsFromVolume, Volume } from "memfs"; import { Stats } from "webpack"; -import mime from "mime-types"; - import middleware from "../src"; -import getCompiler from "./helpers/getCompiler"; - -import webpackConfig from "./fixtures/webpack.config"; import webpackMultiConfig from "./fixtures/webpack.array.config"; -import webpackWatchOptionsConfig from "./fixtures/webpack.watch-options.config"; +import webpackMultiDevServerFalseConfig from "./fixtures/webpack.array.dev-server-false"; import webpackMultiWatchOptionsConfig from "./fixtures/webpack.array.watch-options.config"; -import webpackQueryStringConfig from "./fixtures/webpack.querystring.config"; import webpackClientServerConfig from "./fixtures/webpack.client.server.config"; -import getCompilerHooks from "./helpers/getCompilerHooks"; -import webpackPublicPathConfig from "./fixtures/webpack.public-path.config"; -import webpackMultiDevServerFalseConfig from "./fixtures/webpack.array.dev-server-false"; +import webpackConfig from "./fixtures/webpack.config"; import webpackConfigImmutable from "./fixtures/webpack.immutable.config"; +import webpackPublicPathConfig from "./fixtures/webpack.public-path.config"; +import webpackQueryStringConfig from "./fixtures/webpack.querystring.config"; +import webpackWatchOptionsConfig from "./fixtures/webpack.watch-options.config"; +import getCompiler from "./helpers/getCompiler"; + +import getCompilerHooks from "./helpers/getCompilerHooks"; // Suppress unnecessary stats output jest.spyOn(globalThis.console, "log").mockImplementation(); diff --git a/test/validation-options.test.js b/test/validation-options.test.js index 9557cbfac..7cdd85b30 100644 --- a/test/validation-options.test.js +++ b/test/validation-options.test.js @@ -1,6 +1,6 @@ import path from "node:path"; -import { createFsFromVolume, Volume } from "memfs"; +import { Volume, createFsFromVolume } from "memfs"; import middleware from "../src"; diff --git a/types/utils/compatibleAPI.d.ts b/types/utils/compatibleAPI.d.ts index 5ef6ed0cb..37aa8f073 100644 --- a/types/utils/compatibleAPI.d.ts +++ b/types/utils/compatibleAPI.d.ts @@ -76,23 +76,54 @@ export type ExpectedServerResponse = { | (() => "ready" | "open" | "readable") | undefined; }; +/** + * @param {string} filename filename + * @param {OutputFileSystem} outputFileSystem output file system + * @param {number} start start + * @param {number} end end + * @returns {{ bufferOrStream: (Buffer | import("fs").ReadStream), byteLength: number }} result with buffer or stream and byte length + */ +export function createReadStreamOrReadFileSync( + filename: string, + outputFileSystem: OutputFileSystem, + start: number, + end: number, +): { + bufferOrStream: Buffer | import("fs").ReadStream; + byteLength: number; +}; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @param {number} code code - * @returns {void} + * @param {(string | Buffer)=} data data */ -export function setStatusCode< +export function finish< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response, code: number): void; +>(res: Response, data?: (string | Buffer) | undefined): void; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @returns {number} status code + * @returns {boolean} true when headers were sent, otherwise false */ -export function getStatusCode< +export function getHeadersSent< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response): number; +>(res: Response): boolean; +/** + * @template {ServerResponse & ExpectedServerResponse} Response + * @param {Response} res res + * @returns {Response} res res + */ +export function getOutgoing< + Response extends ServerResponse & ExpectedServerResponse, +>(res: Response): Response; +/** + * @template {ServerResponse & ExpectedServerResponse} Response + * @param {Response} res res + * @returns {"ready" | "open" | "readable"} state + */ +export function getReadyReadableStreamState< + Response extends ServerResponse & ExpectedServerResponse, +>(res: Response): "ready" | "open" | "readable"; /** @typedef {import("../index.js").IncomingMessage} IncomingMessage */ /** @typedef {import("../index.js").ServerResponse} ServerResponse */ /** @typedef {import("../index").OutputFileSystem} OutputFileSystem */ @@ -155,42 +186,26 @@ export function getResponseHeader< /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @param {string} name name - * @param {number | string | Readonly} value value - * @returns {Response} response - */ -export function setResponseHeader< - Response extends ServerResponse & ExpectedServerResponse, ->( - res: Response, - name: string, - value: number | string | Readonly, -): Response; -/** - * @template {ServerResponse & ExpectedServerResponse} Response - * @param {Response} res res - * @param {string} name name - * @returns {void} + * @returns {string[]} header names */ -export function removeResponseHeader< +export function getResponseHeaders< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response, name: string): void; +>(res: Response): string[]; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @returns {string[]} header names + * @returns {number} status code */ -export function getResponseHeaders< +export function getStatusCode< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response): string[]; +>(res: Response): number; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @returns {boolean} true when headers were sent, otherwise false */ -export function getHeadersSent< +export function initState< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response): boolean; +>(res: Response): void; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res @@ -203,52 +218,36 @@ export function pipe( /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @param {string | Buffer} bufferOrString buffer or string + * @param {string} name name * @returns {void} */ -export function send( - res: Response, - bufferOrString: string | Buffer, -): void; -/** - * @template {ServerResponse & ExpectedServerResponse} Response - * @param {Response} res res - * @param {(string | Buffer)=} data data - */ -export function finish< +export function removeResponseHeader< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response, data?: (string | Buffer) | undefined): void; -/** - * @param {string} filename filename - * @param {OutputFileSystem} outputFileSystem output file system - * @param {number} start start - * @param {number} end end - * @returns {{ bufferOrStream: (Buffer | import("fs").ReadStream), byteLength: number }} result with buffer or stream and byte length - */ -export function createReadStreamOrReadFileSync( - filename: string, - outputFileSystem: OutputFileSystem, - start: number, - end: number, -): { - bufferOrStream: Buffer | import("fs").ReadStream; - byteLength: number; -}; +>(res: Response, name: string): void; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @returns {Response} res res + * @param {string | Buffer} bufferOrString buffer or string + * @returns {void} */ -export function getOutgoing< - Response extends ServerResponse & ExpectedServerResponse, ->(res: Response): Response; +export function send( + res: Response, + bufferOrString: string | Buffer, +): void; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res + * @param {string} name name + * @param {number | string | Readonly} value value + * @returns {Response} response */ -export function initState< +export function setResponseHeader< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response): void; +>( + res: Response, + name: string, + value: number | string | Readonly, +): Response; /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res @@ -262,8 +261,9 @@ export function setState< /** * @template {ServerResponse & ExpectedServerResponse} Response * @param {Response} res res - * @returns {"ready" | "open" | "readable"} state + * @param {number} code code + * @returns {void} */ -export function getReadyReadableStreamState< +export function setStatusCode< Response extends ServerResponse & ExpectedServerResponse, ->(res: Response): "ready" | "open" | "readable"; +>(res: Response, code: number): void; From a665c4a980baefd41442d103a726539c113e12ce Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 1 Jul 2025 16:44:53 +0300 Subject: [PATCH 2/2] refactor: update webpack config --- eslint.config.mjs | 6 ++++++ test/helpers/runner.js | 2 ++ 2 files changed, 8 insertions(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index c2279752f..c2e588884 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -5,4 +5,10 @@ export default defineConfig([ { extends: [configs["recommended-dirty"]], }, + { + files: ["test/helpers/runner.js"], + rules: { + "n/hashbang": "off", + }, + }, ]); diff --git a/test/helpers/runner.js b/test/helpers/runner.js index f79b9b83c..13fba0cae 100755 --- a/test/helpers/runner.js +++ b/test/helpers/runner.js @@ -1,3 +1,5 @@ +#!/usr/bin/env node + const merge = require("deepmerge"); const express = require("express"); const webpack = require("webpack");