From 44962025eeff415f331dd3f3a4c491d48c342ac0 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 21 Sep 2026 13:23:57 +0200 Subject: [PATCH 1/2] feat!: refactor to be a custom websocket protocol --- README.md | 78 ++++++----- package.json | 5 +- src/index.ts | 265 +++++++++++++++++------------------- tests/socket-io.test.ts | 165 ++++++++++++++++++++++ tests/to-socket-io.test.ts | 182 ------------------------- tests/typings/msw.test-d.ts | 18 +-- 6 files changed, 340 insertions(+), 373 deletions(-) create mode 100644 tests/socket-io.test.ts delete mode 100644 tests/to-socket-io.test.ts diff --git a/README.md b/README.md index 9bf0645..9445ab8 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,12 @@ ## `@mswjs/socket.io-binding` -## Motivation - -This package is intended as a wrapper over the `WebSocketInterceptor` from [`@mswjs/interceptors`](https://github.com/mswjs/interceptors). It provides automatic encoding and decoding of messages, letting you work with the Socket.IO clients and servers as you are used to. - -```js -import { WebSocketInterceptor } from '@mswjs/interceptors' -import { toSocketIo } from '@mswjs/socket.io-binding' - -const interceptor = new WebSocketInterceptor() - -interceptor.on('connection', (connection) => { - connection.client.addEventListener('message', (event) => { - // Socket.IO implements their custom messaging protocol. - // This means that the "raw" event data you get will be - // encoded: e.g. "40", "42['message', 'Hello, John!']". - console.log(event.data) - }) +The Socket.IO protocol as a WebSocket protocol for [`@mswjs/interceptors`](https://github.com/mswjs/interceptors) and [Mock Service Worker](https://github.com/mswjs/msw). Apply it to intercepted WebSocket connections to work with Socket.IO events instead of the raw Engine.IO/Socket.IO frames. - const io = toSocketIo(connection) - - io.client.on('greeting', (event, message) => { - // Using the wrapper, you get the decoded messages, - // as well as support for custom event listeners. - console.log(message) // "Hello, John!" - }) -}) -``` - -> You can also use this package with [Mock Service Worker](https://github.com/mswjs/msw) directly. - -## Limitations +## Motivation -This wrapper is not meant to provide full feature parity with the Socket.IO client API. Some features may be missing (like rooms, namespaces, broadcasting). If you rely of any of the missing features, open a pull request and implement it. Thank you. +Socket.IO implements its own protocol on top of WebSocket: a session handshake, a heartbeat, and a packet framing. Without the protocol, an intercepted connection exposes the raw frames (e.g. `40`, `42["hello","John"]`), expects you to send them back the same way, and never completes the handshake a mocked Socket.IO client waits for. With the protocol, the connection speaks Socket.IO events, and the session is established for you. -> Note that feature parity only concerns the _connection wrapper_. You can still use the entire of the Socket.IO feature set in the actual application code. +An event is represented as the JSON text of its `[event, ...args]` tuple. ## Install @@ -42,23 +14,49 @@ This wrapper is not meant to provide full feature parity with the Socket.IO clie npm install @mswjs/socket.io-binding ``` -## Examples +## Usage -### Using with Mock Service Worker +### With Mock Service Worker ```js import { ws } from 'msw' -import { toSocketIo } from '@mswjs/socket.io-binding' +import { SocketIo } from '@mswjs/socket.io-binding' -const chat = ws.link('wss://example.com/chat') +const chat = ws.link('wss://example.com/chat', { protocol: new SocketIo() }) export const handlers = [ - chat.addEventListener('connection', (connection) => { - const io = toSocketIo(connection) + chat.addEventListener('connection', ({ client }) => { + client.addEventListener('message', (event) => { + const [name, firstName] = JSON.parse(event.data) - io.on('hello', (event, name) => { - console.log('client sent hello:', name) + if (name === 'hello') { + client.send(JSON.stringify(['greeting', `Hello, ${firstName}!`])) + } }) }), ] ``` + +### With Interceptors + +The protocol recognizes Socket.IO connections by their URL, so it applies to them automatically. + +```js +import { WebSocketInterceptor } from '@mswjs/interceptors/WebSocket' +import { SocketIo } from '@mswjs/socket.io-binding' + +const interceptor = new WebSocketInterceptor({ + protocols: [new SocketIo()], +}) + +interceptor.on('connection', ({ server }) => { + server.connect() + server.addEventListener('message', (event) => { + console.log(event.data) // '["greeting","Hello, John!"]' + }) +}) +``` + +## Limitations + +The protocol supports the default namespace and text events only. Custom namespaces, acknowledgements, and binary attachments are not supported. If you rely on any of these, open a pull request and implement them. Thank you. diff --git a/package.json b/package.json index 54cd16b..bf48cbc 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "type": "module", "name": "@mswjs/socket.io-binding", "version": "0.2.0", - "description": "Binding to mock Socket.IO connections with Mock Service Worker", + "description": "WebSocket codec to mock Socket.IO connections with Mock Service Worker", "main": "./build/index.js", "types": "./build/index.d.ts", "scripts": { @@ -30,14 +30,15 @@ "author": "Artem Zakharchenko ", "license": "MIT", "peerDependencies": { + "@mswjs/interceptors": "^0.43.2", "msw": "^2.10.2" }, "dependencies": { - "@mswjs/interceptors": "^0.39.2", "engine.io-parser": "^5.2.3", "socket.io-parser": "^4.2.4" }, "devDependencies": { + "@mswjs/interceptors": "^0.43.2", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/test-server": "^0.6.2", "@ossjs/release": "^0.8.1", diff --git a/src/index.ts b/src/index.ts index c7b1dbb..c6b70c1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,170 +1,161 @@ import { - encodePayload, - decodePayload, + encodePacket, + decodePacket, type Packet as EngineIoPacket, - type BinaryType, } from 'engine.io-parser' import { Encoder, Decoder, - PacketType as SocketIoPacketType, + PacketType, + type Packet as SocketIoPacket, } from 'socket.io-parser' -import type { WebSocketHandlerConnection } from 'msw' -import type { - WebSocketClientConnectionProtocol, - WebSocketServerConnectionProtocol, +import { + WebSocketProtocol, + type WebSocketData, + type WebSocketProtocolContext, + type WebSocketProtocolMessageContext, } from '@mswjs/interceptors/WebSocket' -const encoder = new Encoder() -const decoder = new Decoder() - -type BoundMessageListener = (event: MessageEvent, ...data: Array) => void +const SESSION_ID = 'test' -class SocketIoConnection { - constructor( - private readonly connection: - | WebSocketClientConnectionProtocol - | WebSocketServerConnectionProtocol, - ) {} - - public on(event: string, listener: BoundMessageListener): void { - const addEventListener = this.connection.addEventListener.bind( - this.connection, - ) as WebSocketClientConnectionProtocol['addEventListener'] +/** + * @note Advertise a heartbeat the client will never expect within + * the lifetime of a test (the sum stays below the timer ceiling of 2^31 ms). + * The client drops the connection unless it receives a ping within + * `pingInterval + pingTimeout`, and a mocked server has no reason to ping. + */ +const PING_INTERVAL = 2_000_000_000 +const PING_TIMEOUT = 100_000_000 - addEventListener('message', function (messageEvent) { - const binaryType: BinaryType = - this.binaryType === 'blob' - ? this.binaryType - : typeof Buffer === 'undefined' - ? 'arraybuffer' - : 'nodebuffer' +const encoder = new Encoder() - const rawData = messageEvent.data +function encodeEngineIoPacket(packet: EngineIoPacket): string { + let encodedPacket = '' - /** - * Messages are always decoded as strings. - * Technically, it should be safe to skip non-string messages. - */ - if (typeof rawData !== 'string') { - return - } + // The callback is invoked synchronously for text packets. + encodePacket(packet, false, (result) => { + if (typeof result === 'string') { + encodedPacket = result + } + }) - const engineIoPackets = decodePayload(rawData, binaryType) + return encodedPacket +} - /** - * @todo Check if this works correctly with - * Blob and ArrayBuffer data. - */ - if (engineIoPackets.every((packet) => packet.type !== 'message')) { - return - } +function encodeSocketIoPacket(packet: SocketIoPacket): string { + const [encodedPacket] = encoder.encode(packet) - for (const packet of engineIoPackets) { - decoder.once('decoded', (decodedSocketIoPacket) => { - /** - * @note Ignore any non-event messages. - * To forward all Socket.IO messages one must listen - * to the raw outgoing client events: - * client.on('message', (event) => server.send(event.data)) - */ - if (decodedSocketIoPacket.type !== SocketIoPacketType.EVENT) { - return - } - - const [sentEvent, ...data] = decodedSocketIoPacket.data - - if (sentEvent === event) { - listener.call(undefined, messageEvent, ...data) - } - }) - - decoder.add(packet.data) - } - }) + if (typeof encodedPacket !== 'string') { + throw new Error('Binary Socket.IO packets are not supported') } - public send(...data: Array): void { - this.emit('message', ...data) + return encodeEngineIoPacket({ type: 'message', data: encodedPacket }) +} + +/** + * The Socket.IO protocol over WebSocket. + * + * Messages are Socket.IO events as JSON text: `'["event", ...args]'`. + * The Engine.IO session and the protocol control packets are handled + * by the protocol and never surface. Binary attachments are not supported. + * + * @example + * // With Interceptors: applied to every Socket.IO connection. + * new WebSocketInterceptor({ protocols: [new SocketIo()] }) + * + * @example + * // With Mock Service Worker: applied to the connections of this link. + * const chat = ws.link('wss://example.com/chat', { protocol: new SocketIo() }) + * + * chat.addEventListener('connection', ({ client }) => { + * client.addEventListener('message', (event) => { + * const [name, ...args] = JSON.parse(event.data) + * }) + * client.send(JSON.stringify(['greeting', 'Hello, John!'])) + * }) + */ +export class SocketIo extends WebSocketProtocol { + /** + * The Socket.IO decoder is stateful (binary attachments span + * multiple frames), so keep one per connection. + */ + private readonly decoders = new WeakMap() + + public match({ client }: WebSocketProtocolContext): boolean { + return client.url.searchParams.has('EIO') } - public emit(event: string, ...data: Array): void { - /** - * @todo Check if this correctly encodes Blob - * and ArrayBuffer data. - */ - const encodedSocketIoPacket = encoder.encode({ - type: SocketIoPacketType.EVENT, + public encode(message: string): string { + return encodeSocketIoPacket({ + type: PacketType.EVENT, /** * @todo Support custom namespaces. */ nsp: '/', - data: [event].concat(data), - }) - - const engineIoPackets = encodedSocketIoPacket.map( - (packet) => { - return { - type: 'message', - data: packet, - } - }, - ) - - // Encode the payload in multiple sends - // because Socket.IO represents Blob/Buffer - // data with 2 "message" events dispatched. - encodePayload(engineIoPackets, (encodedPayload) => { - this.connection.send(encodedPayload) + data: JSON.parse(message), }) } -} -class SocketIoDuplexConnection { - public client: SocketIoConnection - public server: SocketIoConnection - - constructor( - readonly rawClient: WebSocketClientConnectionProtocol, - readonly rawServer: WebSocketServerConnectionProtocol, - ) { - queueMicrotask(() => { - try { - // Accessing the "socket" property on the server - // throws if the actual server connection hasn't been established. - // If it doesn't throw, don't mock the namespace approval message. - // That becomes the responsibility of the server. - Reflect.get(this.rawServer, 'socket').readyState - return - } catch { - this.rawClient.send( - '0' + - JSON.stringify({ - sid: 'test', - upgrades: [], - pingInterval: 25000, - pingTimeout: 5000, - }), - ) - this.rawClient.send('40' + JSON.stringify({ sid: 'test' })) + public decode( + frame: WebSocketData, + { connection }: WebSocketProtocolMessageContext, + ): Iterator | undefined { + // Messages are always decoded as strings. + if (typeof frame !== 'string') { + return + } + + const packet = decodePacket(frame, 'arraybuffer') + + // Ignore the Engine.IO control packets (open, ping, pong, etc). + if (packet.type !== 'message') { + return + } + + const decoder = this.#getDecoder(connection) + const events: Array = [] + const collectEvent = (socketIoPacket: SocketIoPacket) => { + // Ignore the Socket.IO control packets (connect, ack, etc). + if (socketIoPacket.type === PacketType.EVENT) { + events.push(JSON.stringify(socketIoPacket.data)) } + } + + decoder.on('decoded', collectEvent) + decoder.add(packet.data) + decoder.off('decoded', collectEvent) + + return events.values() + } + + public *handshake(): Generator { + // Establish the Engine.IO session. + yield encodeEngineIoPacket({ + type: 'open', + data: JSON.stringify({ + sid: SESSION_ID, + upgrades: [], + pingInterval: PING_INTERVAL, + pingTimeout: PING_TIMEOUT, + }), }) - this.client = new SocketIoConnection(this.rawClient) - this.server = new SocketIoConnection(this.rawServer) + // Approve the connection to the default namespace. + yield encodeSocketIoPacket({ + type: PacketType.CONNECT, + nsp: '/', + data: { sid: SESSION_ID }, + }) } -} -/** - * @example - * interceptor.on('connection', (connection) => { - * const { client, server } = toSocketIo(connection) - * - * client.on('hello', (firstName) => { - * client.emit('greetings', `Hello, ${firstName}!`) - * }) - * }) - */ -export function toSocketIo(connection: WebSocketHandlerConnection) { - return new SocketIoDuplexConnection(connection.client, connection.server) + #getDecoder(connection: object): Decoder { + let decoder = this.decoders.get(connection) + + if (!decoder) { + decoder = new Decoder() + this.decoders.set(connection, decoder) + } + + return decoder + } } diff --git a/tests/socket-io.test.ts b/tests/socket-io.test.ts new file mode 100644 index 0000000..fbf5b71 --- /dev/null +++ b/tests/socket-io.test.ts @@ -0,0 +1,165 @@ +// @vitest-environment node-websocket +import { + WebSocketInterceptor, + type WebSocketData, +} from '@mswjs/interceptors/WebSocket' +import { Server } from 'socket.io' +import { HttpServer } from '@open-draft/test-server/http' +import { DeferredPromise } from '@open-draft/deferred-promise' +import { SocketIo } from '../src/index.js' + +const interceptor = new WebSocketInterceptor({ + protocols: [new SocketIo()], +}) + +const httpServer = new HttpServer() +const wsServer = new Server(httpServer['_http']) + +function getWsUrl(): string { + const url = new URL(httpServer.http.address.href) + url.protocol = url.protocol.replace('http', 'ws') + return url.href +} + +beforeAll(async () => { + interceptor.apply() + await httpServer.listen() +}) + +afterEach(() => { + interceptor.removeAllListeners() +}) + +afterAll(async () => { + interceptor.dispose() + await httpServer.close() +}) + +it('decodes outgoing client events', async () => { + const { createSocketClient } = await import('./socket.io-client.js') + + const eventLog: Array = [] + const outgoingDataPromise = new DeferredPromise() + + interceptor.on('connection', ({ client }) => { + client.addEventListener('message', (event) => { + eventLog.push(event.data) + outgoingDataPromise.resolve(event.data) + }) + }) + + const ws = createSocketClient('wss://example.com') + ws.emit('hello', 'John') + + await expect(outgoingDataPromise).resolves.toBe('["hello","John"]') + expect(eventLog, 'exposes no protocol packets').toEqual([ + '["hello","John"]', + ]) +}) + +it('encodes mocked incoming server events', async () => { + const { createSocketClient } = await import('./socket.io-client.js') + + const incomingDataPromise = new DeferredPromise() + + interceptor.on('connection', ({ client }) => { + client.addEventListener('message', (event) => { + if (typeof event.data !== 'string') { + return + } + + const [name, firstName]: [string, string] = JSON.parse(event.data) + + if (name === 'hello') { + client.send(JSON.stringify(['greetings', `Hello, ${firstName}!`])) + } + }) + }) + + const ws = createSocketClient('wss://example.com') + ws.emit('hello', 'John') + ws.on('greetings', (message) => incomingDataPromise.resolve(message)) + + await expect(incomingDataPromise).resolves.toBe('Hello, John!') +}) + +it('decodes incoming server events', async () => { + const { createSocketClient } = await import('./socket.io-client.js') + + const incomingServerDataPromise = new DeferredPromise() + const incomingClientDataPromise = new DeferredPromise() + + wsServer.on('connection', (client) => { + client.on('hello', (name) => { + client.emit('greeting', { id: 1, text: `Hello, ${name}!` }) + }) + }) + + interceptor.on('connection', ({ server }) => { + server.connect() + + server.addEventListener('message', (event) => { + incomingServerDataPromise.resolve(event.data) + }) + }) + + const ws = createSocketClient(getWsUrl()) + ws.emit('hello', 'John') + ws.on('greeting', (message) => { + incomingClientDataPromise.resolve(message) + }) + + await expect( + incomingServerDataPromise, + 'the interceptor gets the decoded event' + ).resolves.toBe('["greeting",{"id":1,"text":"Hello, John!"}]') + await expect( + incomingClientDataPromise, + 'the Socket.IO client gets the original event' + ).resolves.toEqual({ + id: 1, + text: 'Hello, John!', + }) +}) + +it('modifies incoming server events', async () => { + const { createSocketClient } = await import('./socket.io-client.js') + + const incomingServerDataPromise = new DeferredPromise() + const incomingClientDataPromise = new DeferredPromise() + + wsServer.on('connection', (client) => { + client.on('hello', (name) => { + client.emit('greeting', { id: 1, text: `Hello, ${name}!` }) + }) + }) + + interceptor.on('connection', ({ client, server }) => { + server.connect() + + server.addEventListener('message', (event) => { + incomingServerDataPromise.resolve(event.data) + + event.preventDefault() + client.send(JSON.stringify(['greeting', { id: 2, text: 'Hello, Sarah!' }])) + }) + }) + + const ws = createSocketClient(getWsUrl()) + ws.emit('hello', 'John') + ws.on('greeting', (message) => { + incomingClientDataPromise.resolve(message) + }) + + await expect( + incomingServerDataPromise, + 'the interceptor gets the original event' + ).resolves.toBe('["greeting",{"id":1,"text":"Hello, John!"}]') + await expect( + incomingClientDataPromise, + 'the Socket.IO client gets the modified event' + ).resolves.toEqual({ + id: 2, + text: 'Hello, Sarah!', + }) +}) diff --git a/tests/to-socket-io.test.ts b/tests/to-socket-io.test.ts deleted file mode 100644 index f45c0eb..0000000 --- a/tests/to-socket-io.test.ts +++ /dev/null @@ -1,182 +0,0 @@ -// @vitest-environment node-websocket -import { - WebSocketInterceptor, - type WebSocketData, -} from '@mswjs/interceptors/WebSocket' -import { Server } from 'socket.io' -import { HttpServer } from '@open-draft/test-server/http' -import { DeferredPromise } from '@open-draft/deferred-promise' -import { toSocketIo } from '../src/index.js' - -const interceptor = new WebSocketInterceptor() - -const httpServer = new HttpServer() -const wsServer = new Server(httpServer['_http']) - -function getWsUrl(): string { - const url = new URL(httpServer.http.address.href) - url.protocol = url.protocol.replace('http', 'ws') - return url.href -} - -beforeAll(async () => { - interceptor.apply() - await httpServer.listen() -}) - -afterEach(() => { - interceptor.removeAllListeners() -}) - -afterAll(async () => { - interceptor.dispose() - await httpServer.close() -}) - -it('intercepts custom outgoing client event', async () => { - const { createSocketClient } = await import('./socket.io-client.js') - - const eventLog: Array = [] - const outgoingDataPromise = new DeferredPromise() - - interceptor.on('connection', (connection) => { - connection.client.addEventListener('message', (event) => { - eventLog.push(event.data) - }) - - const { client } = toSocketIo(connection) - - client.on('hello', (event, name) => { - outgoingDataPromise.resolve(name) - }) - }) - - const ws = createSocketClient('wss://example.com') - ws.emit('hello', 'John') - - // Must expose the decoded event payload. - expect(await outgoingDataPromise).toBe('John') - // Must emit proper outgoing client messages. - expect(eventLog).toEqual(['40', '42["hello","John"]']) -}) - -it('sends a mocked custom incoming server event', async () => { - const { createSocketClient } = await import('./socket.io-client.js') - - const eventLog: Array = [] - const incomingDataPromise = new DeferredPromise() - - interceptor.on('connection', (connection) => { - connection.client.addEventListener('message', (event) => { - eventLog.push(event.data) - }) - - const { client } = toSocketIo(connection) - - client.on('hello', (event, name) => { - client.emit('greetings', `Hello, ${name}!`) - }) - }) - - const ws = createSocketClient('wss://example.com') - ws.emit('hello', 'John') - ws.on('greetings', (message) => incomingDataPromise.resolve(message)) - - // Must emit proper outgoing server messages. - expect(await incomingDataPromise).toBe('Hello, John!') - // Must expose the decoded event payload. - expect(eventLog).toEqual(['40', '42["hello","John"]']) -}) - -it('intercepts incoming server event', async () => { - const { createSocketClient } = await import('./socket.io-client.js') - - const incomingServerDataPromise = new DeferredPromise() - const incomingClientDataPromise = new DeferredPromise() - - wsServer.on('connection', (client) => { - client.on('hello', (name) => { - client.emit('greeting', { id: 1, text: `Hello, ${name}!` }) - }) - }) - - interceptor.on('connection', (connection) => { - connection.server.connect() - - // Forward the raw outgoing client events - // to the server to establish a Socket.IO connection. - connection.client.addEventListener('message', (event) => { - connection.server.send(event.data) - }) - - const { server } = toSocketIo(connection) - - server.on('greeting', (event, message) => { - incomingServerDataPromise.resolve(message) - }) - }) - - const ws = createSocketClient(getWsUrl()) - ws.emit('hello', 'John') - ws.on('greeting', (message) => { - incomingClientDataPromise.resolve(message) - }) - - expect(await incomingServerDataPromise).toEqual({ - id: 1, - text: 'Hello, John!', - }) - expect(await incomingClientDataPromise).toEqual({ - id: 1, - text: 'Hello, John!', - }) -}) - -it('modifies incoming server event', async () => { - const { createSocketClient } = await import('./socket.io-client.js') - - const incomingServerDataPromise = new DeferredPromise() - const incomingClientDataPromise = new DeferredPromise() - - wsServer.on('connection', (client) => { - client.on('hello', (name) => { - client.emit('greeting', { id: 1, text: `Hello, ${name}!` }) - }) - }) - - interceptor.on('connection', (connection) => { - const io = toSocketIo(connection) - - connection.server.connect() - - // Forward the raw outgoing client events. - // Socket.IO will be encoding/decoding those by itself. - connection.client.addEventListener('message', (event) => { - connection.server.send(event.data) - }) - - io.server.on('greeting', (event, message) => { - incomingServerDataPromise.resolve(message) - - event.preventDefault() - io.client.emit('greeting', { id: 2, text: 'Hello, Sarah!' }) - }) - }) - - const ws = createSocketClient(getWsUrl()) - ws.emit('hello', 'John') - ws.on('greeting', (message) => { - incomingClientDataPromise.resolve(message) - }) - - // The interceptor gets the original incoming message. - expect(await incomingServerDataPromise).toEqual({ - id: 1, - text: 'Hello, John!', - }) - // The WebSocket client gets the modified incoming message. - expect(await incomingClientDataPromise).toEqual({ - id: 2, - text: 'Hello, Sarah!', - }) -}) diff --git a/tests/typings/msw.test-d.ts b/tests/typings/msw.test-d.ts index 0633f58..8c6acec 100644 --- a/tests/typings/msw.test-d.ts +++ b/tests/typings/msw.test-d.ts @@ -1,20 +1,14 @@ import { ws } from 'msw' import { setupWorker } from 'msw/browser' -import { toSocketIo } from '../../src/index.js' +import { SocketIo } from '../../src/index.js' -it('creates a connection object compatible with msw', () => { - const api = ws.link('wss://example.com/') +it('is compatible with the msw WebSocket link', () => { + const api = ws.link('wss://example.com/', { protocol: new SocketIo() }) setupWorker( - api.addEventListener('connection', (connection) => { - const io = toSocketIo(connection) - - io.client.on('message', (data) => { - expectTypeOf(data).toEqualTypeOf>() - }) - io.server.on('message', (data) => { - expectTypeOf(data).toEqualTypeOf>() - }) + api.addEventListener('connection', ({ client, server }) => { + client.send('["hello","John"]') + server.send('["hello","John"]') }), ) }) From b90248772877321e34da7bcaa8241e12b7a08a40 Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Mon, 21 Sep 2026 14:08:59 +0200 Subject: [PATCH 2/2] chore: update `@mswjs/interceptors` to 0.44.0 --- package.json | 2 +- pnpm-lock.yaml | 294 +++++++++++++------------------------------------ 2 files changed, 77 insertions(+), 219 deletions(-) diff --git a/package.json b/package.json index bf48cbc..6f44155 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "socket.io-parser": "^4.2.4" }, "devDependencies": { - "@mswjs/interceptors": "^0.43.2", + "@mswjs/interceptors": "^0.44.0", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/test-server": "^0.6.2", "@ossjs/release": "^0.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba996da..a1337dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - '@mswjs/interceptors': - specifier: ^0.39.2 - version: 0.39.2 engine.io-parser: specifier: ^5.2.3 version: 5.2.3 @@ -18,6 +15,9 @@ importers: specifier: ^4.2.4 version: 4.2.4 devDependencies: + '@mswjs/interceptors': + specifier: ^0.44.0 + version: 0.44.0 '@open-draft/deferred-promise': specifier: ^2.2.0 version: 2.2.0 @@ -53,7 +53,7 @@ importers: version: 6.21.0 vitest: specifier: ^3.2.3 - version: 3.2.3(@types/node@20.17.7)(happy-dom@15.11.6)(jsdom@24.1.3)(msw@2.10.2(@types/node@20.17.7)(typescript@5.8.3)) + version: 3.2.3(@types/debug@4.1.13)(@types/node@20.17.7)(happy-dom@15.11.6)(msw@2.10.2(@types/node@20.17.7)(typescript@5.8.3)) packages: @@ -411,6 +411,10 @@ packages: resolution: {integrity: sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==} engines: {node: '>=18'} + '@mswjs/interceptors@0.44.0': + resolution: {integrity: sha512-IYHevRStF4ijM20GI9c9Ndhw483NSAjCydQhUr4/zIB0BNLsTVw3vFAxTo6TlvX4QnV60wEHttUa9539TTAq+A==} + engines: {node: '>=22'} + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -423,6 +427,9 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@open-draft/until@3.0.1': + resolution: {integrity: sha512-s7/9ELP4aP9YZtW7RJaa0Xf3RISaRH9+EFN18FtykJYRHGNrl8f9ymvoNXzjhrjmftFvkQudtuDU9RYhk0xs3A==} + '@ossjs/release@0.8.1': resolution: {integrity: sha512-gApVH7M47Mkh9GNMpd/LJi72KlCUcl/t0lbTP082APlHIQUzyQObcMyfLOjEwRdxyyYJtKlbTMzoDf/+NNIIiQ==} hasBin: true @@ -495,101 +502,121 @@ packages: resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-gnueabihf@4.43.0': resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.27.4': resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm-musleabihf@4.43.0': resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.27.4': resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.43.0': resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.27.4': resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-musl@4.43.0': resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.43.0': resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.27.4': resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.43.0': resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.43.0': resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.27.4': resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.43.0': resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.27.4': resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.43.0': resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.27.4': resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-linux-x64-musl@4.43.0': resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.27.4': resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} @@ -645,6 +672,9 @@ packages: '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -672,6 +702,9 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} @@ -759,10 +792,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -937,14 +966,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - cssstyle@4.1.0: - resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} - engines: {node: '>=18'} - - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} @@ -974,8 +995,14 @@ packages: supports-color: optional: true - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} @@ -1155,6 +1182,7 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true gopd@1.0.1: @@ -1190,30 +1218,14 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1231,9 +1243,6 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-text-path@2.0.0: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} @@ -1258,15 +1267,6 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - jsdom@24.1.3: - resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -1403,9 +1403,6 @@ packages: encoding: optional: true - nwsapi@2.2.13: - resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1430,9 +1427,6 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -1580,6 +1574,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + rettime@0.11.11: + resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} + rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -1593,9 +1590,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -1609,10 +1603,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -1680,6 +1670,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions spawn-error-forwarder@1.0.0: resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} @@ -1752,9 +1743,6 @@ packages: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -1811,10 +1799,6 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - traverse@0.6.8: resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} engines: {node: '>= 0.4'} @@ -1958,10 +1942,6 @@ packages: jsdom: optional: true - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -1972,22 +1952,10 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -2043,13 +2011,6 @@ packages: utf-8-validate: optional: true - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xmlhttprequest-ssl@2.1.2: resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} @@ -2294,6 +2255,17 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@mswjs/interceptors@0.44.0': + dependencies: + '@open-draft/until': 3.0.1 + '@types/debug': 4.1.13 + debug: 4.4.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + rettime: 0.11.11 + transitivePeerDependencies: + - supports-color + '@open-draft/deferred-promise@2.2.0': {} '@open-draft/logger@0.3.0': @@ -2318,6 +2290,8 @@ snapshots: '@open-draft/until@2.1.0': {} + '@open-draft/until@3.0.1': {} + '@ossjs/release@0.8.1': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -2489,6 +2463,10 @@ snapshots: dependencies: '@types/node': 20.17.7 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.6': {} @@ -2517,6 +2495,8 @@ snapshots: '@types/minimist@1.2.5': {} + '@types/ms@2.1.0': {} + '@types/node-fetch@2.6.12': dependencies: '@types/node': 20.17.7 @@ -2620,13 +2600,6 @@ snapshots: acorn@8.15.0: {} - agent-base@7.1.1: - dependencies: - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -2792,17 +2765,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cssstyle@4.1.0: - dependencies: - rrweb-cssom: 0.7.1 - optional: true - - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - optional: true - dateformat@4.6.3: {} debug@2.6.9: @@ -2817,8 +2779,9 @@ snapshots: dependencies: ms: 2.1.3 - decimal.js@10.4.3: - optional: true + debug@4.4.3: + dependencies: + ms: 2.1.3 deep-eql@5.0.2: {} @@ -3112,11 +3075,6 @@ snapshots: headers-polyfill@4.0.3: {} - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - optional: true - http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -3125,31 +3083,10 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.1 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - optional: true - inherits@2.0.4: {} ini@1.3.8: {} @@ -3160,9 +3097,6 @@ snapshots: is-node-process@1.2.0: {} - is-potential-custom-element-name@1.0.1: - optional: true - is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 @@ -3189,35 +3123,6 @@ snapshots: js-tokens@9.0.1: {} - jsdom@24.1.3: - dependencies: - cssstyle: 4.1.0 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.1 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.13 - parse5: 7.2.1 - rrweb-cssom: 0.7.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.18.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - jsonparse@1.3.1: {} leven@2.1.0: {} @@ -3328,9 +3233,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - nwsapi@2.2.13: - optional: true - object-assign@4.1.1: {} object-inspect@1.13.3: {} @@ -3349,11 +3251,6 @@ snapshots: package-json-from-dist@1.0.1: {} - parse5@7.2.1: - dependencies: - entities: 4.5.0 - optional: true - parseurl@1.3.3: {} path-key@3.1.1: {} @@ -3506,6 +3403,8 @@ snapshots: resolve-from@5.0.0: {} + rettime@0.11.11: {} + rfdc@1.4.1: {} rollup@4.27.4: @@ -3558,9 +3457,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 - rrweb-cssom@0.7.1: - optional: true - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -3569,11 +3465,6 @@ snapshots: safer-buffer@2.1.2: {} - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - optional: true - secure-json-parse@2.7.0: {} semver@7.6.3: {} @@ -3757,9 +3648,6 @@ snapshots: dependencies: has-flag: 3.0.0 - symbol-tree@3.2.4: - optional: true - text-extensions@2.4.0: {} thenify-all@1.6.0: @@ -3811,11 +3699,6 @@ snapshots: dependencies: punycode: 2.3.1 - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - optional: true - traverse@0.6.8: {} tree-kill@1.2.2: {} @@ -3909,7 +3792,7 @@ snapshots: '@types/node': 20.17.7 fsevents: 2.3.3 - vitest@3.2.3(@types/node@20.17.7)(happy-dom@15.11.6)(jsdom@24.1.3)(msw@2.10.2(@types/node@20.17.7)(typescript@5.8.3)): + vitest@3.2.3(@types/debug@4.1.13)(@types/node@20.17.7)(happy-dom@15.11.6)(msw@2.10.2(@types/node@20.17.7)(typescript@5.8.3)): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 @@ -3935,9 +3818,9 @@ snapshots: vite-node: 3.2.3(@types/node@20.17.7) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.13 '@types/node': 20.17.7 happy-dom: 15.11.6 - jsdom: 24.1.3 transitivePeerDependencies: - less - lightningcss @@ -3949,33 +3832,14 @@ snapshots: - supports-color - terser - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - optional: true - webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} webidl-conversions@7.0.0: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - optional: true - whatwg-mimetype@3.0.0: {} - whatwg-mimetype@4.0.0: - optional: true - - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - optional: true - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -4020,12 +3884,6 @@ snapshots: ws@8.18.0: {} - xml-name-validator@5.0.0: - optional: true - - xmlchars@2.2.0: - optional: true - xmlhttprequest-ssl@2.1.2: {} xtend@4.0.2: {}