From 1c50b62ddf8cbbc3335fa5ae05bad865c8b57d02 Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 16 Mar 2026 09:04:33 +0800 Subject: [PATCH 1/3] fix: improve URL selection logic for rewritten requests --- src/utils/compatibleAPI.js | 23 ++++++++++++++++++++-- test/utils/compatibleAPI.test.js | 33 ++++++++++++++++++++++++++++++++ types/utils/compatibleAPI.d.ts | 26 ------------------------- 3 files changed, 54 insertions(+), 28 deletions(-) create mode 100644 test/utils/compatibleAPI.test.js diff --git a/src/utils/compatibleAPI.js b/src/utils/compatibleAPI.js index f52d865..ac3424a 100644 --- a/src/utils/compatibleAPI.js +++ b/src/utils/compatibleAPI.js @@ -27,6 +27,24 @@ * @property {((name: string, value: EXPECTED_ANY) => void)=} setState set state */ +/** + * @template {IncomingMessage & ExpectedIncomingMessage} Request + * @param {Request} req req + * @returns {boolean} true when originalUrl should be preferred + */ +function shouldUseOriginalURL(req) { + if ( + typeof req.originalUrl === "string" && + typeof req.url === "string" && + req.originalUrl !== req.url + ) { + try { + return encodeURI(req.url) === req.originalUrl; + } catch {} + } + return false; +} + /** * @template {IncomingMessage & ExpectedIncomingMessage} Request * @param {Request} req req @@ -66,8 +84,9 @@ function getRequestURL(req) { if (typeof req.getURL === "function") { return req.getURL(); } - // Fastify decodes URI by default, Our logic is based on encoded URI - else if (typeof req.originalUrl !== "undefined") { + // Fastify decodes URI by default. Prefer the encoded originalUrl only when + // it still describes the current request, not when another middleware rewrote req.url. + if (shouldUseOriginalURL(req)) { return req.originalUrl; } diff --git a/test/utils/compatibleAPI.test.js b/test/utils/compatibleAPI.test.js new file mode 100644 index 0000000..18cd7e0 --- /dev/null +++ b/test/utils/compatibleAPI.test.js @@ -0,0 +1,33 @@ +import { getRequestURL } from "../../src/utils/compatibleAPI.js"; + +describe("compatibleAPI", () => { + describe("getRequestURL", () => { + it("should return the value from getURL when available", () => { + const req = { + getURL: () => "/from-get-url", + url: "/from-url", + originalUrl: "/from-original-url", + }; + + expect(getRequestURL(req)).toBe("/from-get-url"); + }); + + it("should prefer originalUrl when it is the encoded form of req.url", () => { + const req = { + url: "/pathname with spaces.js?foo=bar", + originalUrl: "/pathname%20with%20spaces.js?foo=bar", + }; + + expect(getRequestURL(req)).toBe("/pathname%20with%20spaces.js?foo=bar"); + }); + + it("should prefer req.url when another middleware rewrote the request", () => { + const req = { + url: "/index.html", + originalUrl: "/foo", + }; + + expect(getRequestURL(req)).toBe("/index.html"); + }); + }); +}); diff --git a/types/utils/compatibleAPI.d.ts b/types/utils/compatibleAPI.d.ts index 7081aa9..b625823 100644 --- a/types/utils/compatibleAPI.d.ts +++ b/types/utils/compatibleAPI.d.ts @@ -115,32 +115,6 @@ export function getHeadersSent< export function getOutgoing< Response extends ServerResponse & ExpectedServerResponse, >(res: Response): Response; -/** @typedef {import("../index").IncomingMessage} IncomingMessage */ -/** @typedef {import("../index").ServerResponse} ServerResponse */ -/** @typedef {import("../index").OutputFileSystem} OutputFileSystem */ -/** @typedef {import("../index").EXPECTED_ANY} EXPECTED_ANY */ -/** - * @typedef {object} ExpectedIncomingMessage - * @property {((name: string) => string | string[] | undefined)=} getHeader get header extra method - * @property {(() => string | undefined)=} getMethod get method extra method - * @property {(() => string | undefined)=} getURL get URL extra method - * @property {string=} originalUrl an extra option for `fastify` (and `@fastify/express`) to get original URL - */ -/** - * @typedef {object} ExpectedServerResponse - * @property {((status: number) => void)=} setStatusCode set status code - * @property {(() => number)=} getStatusCode get status code - * @property {((name: string) => string | string[] | undefined | number)} getHeader get header - * @property {((name: string, value: number | string | Readonly) => ExpectedServerResponse)=} setHeader set header - * @property {((name: string) => void)=} removeHeader remove header - * @property {((data: string | Buffer) => void)=} send send - * @property {((data?: string | Buffer) => void)=} finish finish - * @property {(() => string[])=} getResponseHeaders get response header - * @property {(() => boolean)=} getHeadersSent get headers sent - * @property {((data: EXPECTED_ANY) => void)=} stream stream - * @property {(() => EXPECTED_ANY)=} getOutgoing get outgoing - * @property {((name: string, value: EXPECTED_ANY) => void)=} setState set state - */ /** * @template {IncomingMessage & ExpectedIncomingMessage} Request * @param {Request} req req From b9df7a4a9465d374e9104e57e9715f04d106607d Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 16 Mar 2026 09:07:47 +0800 Subject: [PATCH 2/3] fix --- src/utils/compatibleAPI.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/utils/compatibleAPI.js b/src/utils/compatibleAPI.js index ac3424a..cfe1173 100644 --- a/src/utils/compatibleAPI.js +++ b/src/utils/compatibleAPI.js @@ -34,15 +34,18 @@ */ function shouldUseOriginalURL(req) { if ( - typeof req.originalUrl === "string" && - typeof req.url === "string" && - req.originalUrl !== req.url + typeof req.originalUrl !== "string" || + typeof req.url !== "string" || + req.originalUrl === req.url ) { - try { - return encodeURI(req.url) === req.originalUrl; - } catch {} + return typeof req.originalUrl === "string"; + } + + try { + return encodeURI(req.url) === req.originalUrl; + } catch { + return false; } - return false; } /** From 8bc991221daaf0d29b356cf6979e2309b783f838 Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 16 Mar 2026 09:25:53 +0800 Subject: [PATCH 3/3] fix: remove fastify --- README.md | 22 +- package.json | 2 - pnpm-lock.yaml | 513 ------------------------------- src/utils/compatibleAPI.js | 27 -- test/middleware.test.js | 35 +-- test/utils/compatibleAPI.test.js | 19 -- types/utils/compatibleAPI.d.ts | 29 +- 7 files changed, 33 insertions(+), 614 deletions(-) diff --git a/README.md b/README.md index 3b61cdf..b1a0915 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ app.use( app.listen(3000, () => console.log("Example app listening on port 3000!")); ``` -See [below](#other-servers) for an example of use with fastify. +See [below](#other-servers) for examples of use with other servers. ## Options @@ -685,26 +685,6 @@ process.on("unhandledRejection", (err) => { }); ``` -### Fastify - -Fastify interop will require the use of `fastify-express` instead of `middie` for providing middleware support. As the authors of `fastify-express` recommend, this should only be used as a stopgap while full Fastify support is worked on. - -```js -const { devMiddleware } = require("@rspack/dev-middleware"); -const fastify = require("fastify")(); -const { rspack } = require("@rspack/core"); -const rspackConfig = require("./rspack.config.js"); - -const compiler = rspack(rspackConfig); -const devMiddlewareOptions = { - // options -}; - -await fastify.register(require("@fastify/express")); -await fastify.use(devMiddleware(compiler, devMiddlewareOptions)); -await fastify.listen(3000); -``` - ### Hono ```js diff --git a/package.json b/package.json index b9d8085..ff70fe1 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "bump": "npx bumpp" }, "devDependencies": { - "@fastify/express": "^4.0.2", "@hapi/hapi": "^21.3.7", "@hono/node-server": "^1.12.0", "@rslib/core": "^0.20.0", @@ -48,7 +47,6 @@ "deepmerge": "^4.2.2", "execa": "^5.1.1", "express": "^5.1.0", - "fastify": "^5.2.1", "file-loader": "^6.2.0", "finalhandler": "^2.1.0", "hono": "^4.4.13", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf02d73..3d97e3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: devDependencies: - '@fastify/express': - specifier: ^4.0.2 - version: 4.0.4 '@hapi/hapi': specifier: ^21.3.7 version: 21.4.7 @@ -56,9 +53,6 @@ importers: express: specifier: ^5.1.0 version: 5.2.1 - fastify: - specifier: ^5.2.1 - version: 5.8.2 file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.105.4) @@ -402,27 +396,6 @@ packages: '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} - '@fastify/ajv-compiler@4.0.5': - resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} - - '@fastify/error@4.2.0': - resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} - - '@fastify/express@4.0.4': - resolution: {integrity: sha512-3D4sNT+s66T2yb3ILwv2lU5TB+1sG5gq37Zn1ucCxSk+8P4Bi8QH5Lb6eQ/3tUdg4+W9upWaU+1z0Mt9dTA7hw==} - - '@fastify/fast-json-stringify-compiler@5.0.3': - resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} - - '@fastify/forwarded@3.0.1': - resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==} - - '@fastify/merge-json-schemas@0.2.1': - resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} - - '@fastify/proxy-addr@5.1.0': - resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@hapi/accept@6.0.3': resolution: {integrity: sha512-p72f9k56EuF0n3MwlBNThyVE5PXX40g+aQh+C/xbKrfzahM2Oispv3AXmOIU51t3j77zay1qrX7IIziZXspMlw==} @@ -666,9 +639,6 @@ packages: '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} - '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@rsbuild/core@2.0.0-beta.8': resolution: {integrity: sha512-MUxbKJPE1agOK3eCHjKvBIiA+CcZ0TJU/ANKDBLMjK2Er+wq4r5c2ne53+Pi7DtIExoMbSSWBx+RP3CMewKGVA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -941,9 +911,6 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -971,14 +938,6 @@ packages: ajv: optional: true - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -1007,9 +966,6 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} @@ -1031,17 +987,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - avvio@9.2.0: - resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1053,10 +1002,6 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} @@ -1146,10 +1091,6 @@ packages: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -1158,9 +1099,6 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -1169,10 +1107,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -1288,10 +1222,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -1403,17 +1333,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1424,27 +1347,12 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-json-stringify@6.3.0: - resolution: {integrity: sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==} - - fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fastify-plugin@5.1.0: - resolution: {integrity: sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==} - - fastify@5.8.2: - resolution: {integrity: sha512-lZmt3navvZG915IE+f7/TIVamxIwmBd+OMB+O9WBzcpIwOo6F0LTh0sluoMFk5VkrKTvvrwIaoJPkir4Z+jtAg==} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1464,18 +1372,10 @@ packages: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} - find-my-way@9.5.0: - resolution: {integrity: sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==} - engines: {node: '>=20'} - flatted@3.4.1: resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==} @@ -1619,10 +1519,6 @@ packages: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -1649,10 +1545,6 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.3.0: - resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} - engines: {node: '>= 10'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1771,9 +1663,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-ref-resolver@3.0.0: - resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1796,9 +1685,6 @@ packages: resolution: {integrity: sha512-2LOQnFKu3m0VxpE+5sb5+BRTSKrXmNxGgxVRiKwD9s5KQB1zID/FRXhtzeV7RT1L2GVpdEEAfVuclFOMGl1ikA==} engines: {node: '>= 18'} - light-my-request@6.6.0: - resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -1815,10 +1701,6 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -1832,9 +1714,6 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -1862,11 +1741,6 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} @@ -1930,10 +1804,6 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -1980,9 +1850,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} @@ -2006,16 +1873,6 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - pino-abstract-transport@3.0.0: - resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} - - pino-std-serializers@7.1.0: - resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} - - pino@10.3.1: - resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} - hasBin: true - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -2025,12 +1882,6 @@ packages: engines: {node: '>=14'} hasBin: true - process-warning@4.0.1: - resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} - - process-warning@5.0.0: - resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -2039,25 +1890,14 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.14.2: - resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} - engines: {node: '>=0.6'} - qs@6.15.0: resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} engines: {node: '>=0.6'} - quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} @@ -2066,10 +1906,6 @@ packages: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} - real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -2095,17 +1931,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - ret@0.5.0: - resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} - engines: {node: '>=10'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -2130,9 +1955,6 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -2141,14 +1963,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-regex2@5.1.0: - resolution: {integrity: sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw==} - hasBin: true - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2160,9 +1974,6 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - secure-json-parse@4.1.0: - resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -2172,25 +1983,14 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - set-cookie-parser@2.7.2: - resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2249,9 +2049,6 @@ packages: resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} - sonic-boom@4.2.1: - resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -2271,10 +2068,6 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -2362,10 +2155,6 @@ packages: peerDependencies: tslib: ^2 - thread-stream@4.0.0: - resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} - engines: {node: '>=20'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -2374,10 +2163,6 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -2395,10 +2180,6 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -2795,36 +2576,6 @@ snapshots: tslib: 2.8.1 optional: true - '@fastify/ajv-compiler@4.0.5': - dependencies: - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - fast-uri: 3.1.0 - - '@fastify/error@4.2.0': {} - - '@fastify/express@4.0.4': - dependencies: - express: 4.22.1 - fastify-plugin: 5.1.0 - transitivePeerDependencies: - - supports-color - - '@fastify/fast-json-stringify-compiler@5.0.3': - dependencies: - fast-json-stringify: 6.3.0 - - '@fastify/forwarded@3.0.1': {} - - '@fastify/merge-json-schemas@0.2.1': - dependencies: - dequal: 2.0.3 - - '@fastify/proxy-addr@5.1.0': - dependencies: - '@fastify/forwarded': 3.0.1 - ipaddr.js: 2.3.0 - '@hapi/accept@6.0.3': dependencies: '@hapi/boom': 10.0.1 @@ -3151,8 +2902,6 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 - '@pinojs/redact@0.4.0': {} - '@rsbuild/core@2.0.0-beta.8': dependencies: '@rspack/core': 2.0.0-beta.6(@swc/helpers@0.5.19) @@ -3437,8 +3186,6 @@ snapshots: '@xtuc/long@4.2.2': {} - abstract-logging@2.0.1: {} - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -3459,10 +3206,6 @@ snapshots: optionalDependencies: ajv: 8.18.0 - ajv-formats@3.0.1(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - ajv-keywords@3.5.2(ajv@6.14.0): dependencies: ajv: 6.14.0 @@ -3497,8 +3240,6 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-flatten@1.1.1: {} - array-timsort@1.0.3: {} arraybuffer.prototype.slice@1.0.4: @@ -3519,40 +3260,16 @@ snapshots: asynckit@0.4.0: {} - atomic-sleep@1.0.0: {} - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - avvio@9.2.0: - dependencies: - '@fastify/error': 4.2.0 - fastq: 1.20.1 - balanced-match@1.0.2: {} baseline-browser-mapping@2.10.8: {} big.js@5.2.2: {} - body-parser@1.20.4: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.14.2 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@2.2.2: dependencies: bytes: 3.1.2 @@ -3656,22 +3373,14 @@ snapshots: transitivePeerDependencies: - supports-color - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - content-disposition@1.0.1: {} content-type@1.0.5: {} - cookie-signature@1.0.7: {} - cookie-signature@1.2.2: {} cookie@0.7.2: {} - cookie@1.1.1: {} - cookiejar@2.1.4: {} cookies@0.9.1: @@ -3834,8 +3543,6 @@ snapshots: depd@2.0.0: {} - dequal@2.0.3: {} - destroy@1.2.0: {} dezalgo@1.0.4: @@ -3989,42 +3696,6 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - express@4.22.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.4 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.14.2 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - express@5.2.1: dependencies: accepts: 2.0.0 @@ -4058,55 +3729,16 @@ snapshots: transitivePeerDependencies: - supports-color - fast-decode-uri-component@1.0.1: {} - fast-deep-equal@3.1.3: {} fast-equals@6.0.0: {} fast-json-stable-stringify@2.1.0: {} - fast-json-stringify@6.3.0: - dependencies: - '@fastify/merge-json-schemas': 0.2.1 - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - fast-uri: 3.1.0 - json-schema-ref-resolver: 3.0.0 - rfdc: 1.4.1 - - fast-querystring@1.1.2: - dependencies: - fast-decode-uri-component: 1.0.1 - fast-safe-stringify@2.1.1: {} fast-uri@3.1.0: {} - fastify-plugin@5.1.0: {} - - fastify@5.8.2: - dependencies: - '@fastify/ajv-compiler': 4.0.5 - '@fastify/error': 4.2.0 - '@fastify/fast-json-stringify-compiler': 5.0.3 - '@fastify/proxy-addr': 5.1.0 - abstract-logging: 2.0.1 - avvio: 9.2.0 - fast-json-stringify: 6.3.0 - find-my-way: 9.5.0 - light-my-request: 6.6.0 - pino: 10.3.1 - process-warning: 5.0.0 - rfdc: 1.4.1 - secure-json-parse: 4.1.0 - semver: 7.7.4 - toad-cache: 3.7.0 - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -4129,18 +3761,6 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -4152,12 +3772,6 @@ snapshots: transitivePeerDependencies: - supports-color - find-my-way@9.5.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-querystring: 1.1.2 - safe-regex2: 5.1.0 - flatted@3.4.1: {} for-each@0.3.5: @@ -4299,10 +3913,6 @@ snapshots: hyperdyperid@1.2.0: {} - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -4326,8 +3936,6 @@ snapshots: ipaddr.js@1.9.1: {} - ipaddr.js@2.3.0: {} - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -4450,10 +4058,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-ref-resolver@3.0.0: - dependencies: - dequal: 2.0.3 - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -4487,12 +4091,6 @@ snapshots: type-is: 2.0.1 vary: 1.1.2 - light-my-request@6.6.0: - dependencies: - cookie: 1.1.1 - process-warning: 4.0.1 - set-cookie-parser: 2.7.2 - load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 @@ -4510,8 +4108,6 @@ snapshots: math-intrinsics@1.1.0: {} - media-typer@0.3.0: {} - media-typer@1.1.0: {} memfs@4.56.11(tslib@2.8.1): @@ -4533,8 +4129,6 @@ snapshots: memorystream@0.3.1: {} - merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -4553,8 +4147,6 @@ snapshots: dependencies: mime-db: 1.54.0 - mime@1.6.0: {} - mime@2.6.0: {} mimic-fn@2.1.0: {} @@ -4615,8 +4207,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - on-exit-leak-free@2.1.2: {} - on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -4660,8 +4250,6 @@ snapshots: path-parse@1.0.7: {} - path-to-regexp@0.1.12: {} - path-to-regexp@8.3.0: {} path-type@3.0.0: @@ -4676,34 +4264,10 @@ snapshots: pify@3.0.0: {} - pino-abstract-transport@3.0.0: - dependencies: - split2: 4.2.0 - - pino-std-serializers@7.1.0: {} - - pino@10.3.1: - dependencies: - '@pinojs/redact': 0.4.0 - atomic-sleep: 1.0.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 3.0.0 - pino-std-serializers: 7.1.0 - process-warning: 5.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.5.0 - sonic-boom: 4.2.1 - thread-stream: 4.0.0 - possible-typed-array-names@1.1.0: {} prettier@3.8.1: {} - process-warning@4.0.1: {} - - process-warning@5.0.0: {} - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -4711,25 +4275,12 @@ snapshots: punycode@2.3.1: {} - qs@6.14.2: - dependencies: - side-channel: 1.1.0 - qs@6.15.0: dependencies: side-channel: 1.1.0 - quick-format-unescaped@4.0.4: {} - range-parser@1.2.1: {} - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -4743,8 +4294,6 @@ snapshots: normalize-package-data: 2.5.0 path-type: 3.0.0 - real-require@0.2.0: {} - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -4777,12 +4326,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - ret@0.5.0: {} - - reusify@1.1.0: {} - - rfdc@1.4.1: {} - router@2.2.0: dependencies: debug: 4.4.3 @@ -4808,8 +4351,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -4821,12 +4362,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-regex2@5.1.0: - dependencies: - ret: 0.5.0 - - safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} schema-utils@3.3.0: @@ -4842,30 +4377,10 @@ snapshots: ajv-formats: 2.1.1(ajv@8.18.0) ajv-keywords: 5.1.0(ajv@8.18.0) - secure-json-parse@4.1.0: {} - semver@5.7.2: {} semver@7.7.4: {} - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - send@1.2.1: dependencies: debug: 4.4.3 @@ -4882,15 +4397,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color - serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -4900,8 +4406,6 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@2.7.2: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -4972,10 +4476,6 @@ snapshots: smol-toml@1.6.0: {} - sonic-boom@4.2.1: - dependencies: - atomic-sleep: 1.0.0 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -4997,8 +4497,6 @@ snapshots: spdx-license-ids@3.0.23: {} - split2@4.2.0: {} - statuses@1.5.0: {} statuses@2.0.2: {} @@ -5095,10 +4593,6 @@ snapshots: dependencies: tslib: 2.8.1 - thread-stream@4.0.0: - dependencies: - real-require: 0.2.0 - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -5106,8 +4600,6 @@ snapshots: tinypool@2.1.0: {} - toad-cache@3.7.0: {} - toidentifier@1.0.1: {} tree-dump@1.1.0(tslib@2.8.1): @@ -5118,11 +4610,6 @@ snapshots: tsscmp@1.0.6: {} - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - type-is@2.0.1: dependencies: content-type: 1.0.5 diff --git a/src/utils/compatibleAPI.js b/src/utils/compatibleAPI.js index cfe1173..5e19b74 100644 --- a/src/utils/compatibleAPI.js +++ b/src/utils/compatibleAPI.js @@ -8,7 +8,6 @@ * @property {((name: string) => string | string[] | undefined)=} getHeader get header extra method * @property {(() => string | undefined)=} getMethod get method extra method * @property {(() => string | undefined)=} getURL get URL extra method - * @property {string=} originalUrl an extra option for `fastify` (and `@fastify/express`) to get original URL */ /** @@ -27,27 +26,6 @@ * @property {((name: string, value: EXPECTED_ANY) => void)=} setState set state */ -/** - * @template {IncomingMessage & ExpectedIncomingMessage} Request - * @param {Request} req req - * @returns {boolean} true when originalUrl should be preferred - */ -function shouldUseOriginalURL(req) { - if ( - typeof req.originalUrl !== "string" || - typeof req.url !== "string" || - req.originalUrl === req.url - ) { - return typeof req.originalUrl === "string"; - } - - try { - return encodeURI(req.url) === req.originalUrl; - } catch { - return false; - } -} - /** * @template {IncomingMessage & ExpectedIncomingMessage} Request * @param {Request} req req @@ -87,11 +65,6 @@ function getRequestURL(req) { if (typeof req.getURL === "function") { return req.getURL(); } - // Fastify decodes URI by default. Prefer the encoded originalUrl only when - // it still describes the current request, not when another middleware rewrote req.url. - if (shouldUseOriginalURL(req)) { - return req.originalUrl; - } return req.url; } diff --git a/test/middleware.test.js b/test/middleware.test.js index a7565f4..9eff918 100644 --- a/test/middleware.test.js +++ b/test/middleware.test.js @@ -2,13 +2,11 @@ import fs from "node:fs"; import { createServer } from "node:http"; import path from "node:path"; -import fastifyExpress from "@fastify/express"; import Hapi from "@hapi/hapi"; import { serve } from "@hono/node-server"; import { Stats } from "@rspack/core"; import connect from "connect"; import express from "express"; -import fastify from "fastify"; import finalhandler from "finalhandler"; import { Hono } from "hono"; import koa from "koa"; @@ -169,14 +167,9 @@ async function frameworkFactory( return [server, req, instance.devMiddleware]; } default: { - const isFastify = name === "fastify"; const isRouter = name === "router"; const app = framework(); - if (isFastify) { - await app.register(fastifyExpress); - } - const instance = devMiddleware(compiler, devMiddlewareOptions); const middlewares = typeof options.setupMiddlewares === "function" @@ -191,18 +184,10 @@ async function frameworkFactory( } } - if (isFastify) { - await app.ready(); - } - const server = await startServer(name, app); - const req = isFastify - ? request(app.server) - : isRouter - ? request(server) - : request(app); + const req = isRouter ? request(server) : request(app); - return [isFastify ? app.server : server, req, instance]; + return [server, req, instance]; } } } @@ -280,8 +265,6 @@ function get404ContentTypeHeader(name) { return "text/plain; charset=utf-8"; case "hapi": return "application/json; charset=utf-8"; - case "fastify": - return "application/json; charset=utf-8"; case "hono": return "text/plain; charset=UTF-8"; default: @@ -376,7 +359,6 @@ describe.each([ ["connect", connect], ["express", express], ["router", router], - ["fastify", fastify], ["koa", koa], ["hapi", Hapi], ["hono", Hono], @@ -1676,13 +1658,12 @@ describe.each([ ], }, { - // fastify uses the `frameworkErrors` option to handle broken URLs - file: name === "fastify" ? "/foo/foo.js" : "/%foo%/%foo%.js", + file: "/%foo%/%foo%.js", data: 'console.log("foo");', urls: [ // Filenames can contain characters not allowed in URIs { - value: name === "fastify" ? "foo/foo.js" : "%foo%/%foo%.js", + value: "%foo%/%foo%.js", contentType: getContentTypeHeader(), code: 200, }, @@ -3863,9 +3844,7 @@ describe.each([ const response = await req.get("/file.jpg"); expect(response.statusCode).toBe(200); - expect(response.headers["content-type"]).toMatch( - name === "fastify" ? /text\/plain; charset=utf-8/ : /text\/html/, - ); + expect(response.headers["content-type"]).toMatch(/text\/html/); }); }); }); @@ -5196,8 +5175,8 @@ describe.each([ const response = await req.get("/"); expect(response.statusCode).toBe(200); - expect(response.headers["content-type"]).toBe( - "text/html; charset=utf-8", + expect(response.headers["content-type"]).toMatch( + /^text\/html; charset=utf-8$/i, ); }); }); diff --git a/test/utils/compatibleAPI.test.js b/test/utils/compatibleAPI.test.js index 18cd7e0..3d8f166 100644 --- a/test/utils/compatibleAPI.test.js +++ b/test/utils/compatibleAPI.test.js @@ -6,28 +6,9 @@ describe("compatibleAPI", () => { const req = { getURL: () => "/from-get-url", url: "/from-url", - originalUrl: "/from-original-url", }; expect(getRequestURL(req)).toBe("/from-get-url"); }); - - it("should prefer originalUrl when it is the encoded form of req.url", () => { - const req = { - url: "/pathname with spaces.js?foo=bar", - originalUrl: "/pathname%20with%20spaces.js?foo=bar", - }; - - expect(getRequestURL(req)).toBe("/pathname%20with%20spaces.js?foo=bar"); - }); - - it("should prefer req.url when another middleware rewrote the request", () => { - const req = { - url: "/index.html", - originalUrl: "/foo", - }; - - expect(getRequestURL(req)).toBe("/index.html"); - }); }); }); diff --git a/types/utils/compatibleAPI.d.ts b/types/utils/compatibleAPI.d.ts index b625823..463e745 100644 --- a/types/utils/compatibleAPI.d.ts +++ b/types/utils/compatibleAPI.d.ts @@ -15,10 +15,6 @@ export type ExpectedIncomingMessage = { * get URL extra method */ getURL?: (() => string | undefined) | undefined; - /** - * an extra option for `fastify` (and `@fastify/express`) to get original URL - */ - originalUrl?: string | undefined; }; export type ExpectedServerResponse = { /** @@ -115,6 +111,31 @@ export function getHeadersSent< export function getOutgoing< Response extends ServerResponse & ExpectedServerResponse, >(res: Response): Response; +/** @typedef {import("../index").IncomingMessage} IncomingMessage */ +/** @typedef {import("../index").ServerResponse} ServerResponse */ +/** @typedef {import("../index").OutputFileSystem} OutputFileSystem */ +/** @typedef {import("../index").EXPECTED_ANY} EXPECTED_ANY */ +/** + * @typedef {object} ExpectedIncomingMessage + * @property {((name: string) => string | string[] | undefined)=} getHeader get header extra method + * @property {(() => string | undefined)=} getMethod get method extra method + * @property {(() => string | undefined)=} getURL get URL extra method + */ +/** + * @typedef {object} ExpectedServerResponse + * @property {((status: number) => void)=} setStatusCode set status code + * @property {(() => number)=} getStatusCode get status code + * @property {((name: string) => string | string[] | undefined | number)} getHeader get header + * @property {((name: string, value: number | string | Readonly) => ExpectedServerResponse)=} setHeader set header + * @property {((name: string) => void)=} removeHeader remove header + * @property {((data: string | Buffer) => void)=} send send + * @property {((data?: string | Buffer) => void)=} finish finish + * @property {(() => string[])=} getResponseHeaders get response header + * @property {(() => boolean)=} getHeadersSent get headers sent + * @property {((data: EXPECTED_ANY) => void)=} stream stream + * @property {(() => EXPECTED_ANY)=} getOutgoing get outgoing + * @property {((name: string, value: EXPECTED_ANY) => void)=} setState set state + */ /** * @template {IncomingMessage & ExpectedIncomingMessage} Request * @param {Request} req req