From f2e3d162ab4b294aa53091bf3b0aa38551de7bf5 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 14 Jun 2021 07:59:12 +0200 Subject: [PATCH 01/51] Initial commit --- .github/workflows/ci.yml | 42 + .gitignore | 3 + CHANGELOG.md | 0 LICENSE | 7 + README.md | 141 +++ assets/emitter.excalidraw | 1380 +++++++++++++++++++++ assets/emitter.png | Bin 0 -> 102189 bytes docker-compose.yml | 9 + lib/index.ts | 533 +++++++++ lib/typed-events.ts | 37 + package-lock.json | 2377 +++++++++++++++++++++++++++++++++++++ package.json | 48 + test/index.ts | 278 +++++ test/util.ts | 13 + tsconfig.json | 12 + 15 files changed, 4880 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/emitter.excalidraw create mode 100644 assets/emitter.png create mode 100644 docker-compose.yml create mode 100644 lib/index.ts create mode 100644 lib/typed-events.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 test/index.ts create mode 100644 test/util.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..7f12b300a2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: CI + +on: + push: + pull_request: + schedule: + - cron: '0 0 * * 0' + +jobs: + test-node: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + + services: + postgres: + image: postgres + env: + POSTGRES_PASSWORD: changeit + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - run: npm ci + + - run: npm test + env: + CI: true + timeout-minutes: 10 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..044c54805f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist/ +.nyc_output/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..afc17bc357 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2021 Damien Arrachequesne (@darrachequesne) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..048416b534 --- /dev/null +++ b/README.md @@ -0,0 +1,141 @@ +# Socket.IO Postgres emitter + +The `@socket.io/postgres-emitter` package allows you to easily communicate with a group of Socket.IO servers from another Node.js process (server-side). + +![Emitter diagram](./assets/emitter.png) + +It must be used in conjunction with [`@socket.io/posgres-adapter`](https://github.com/socketio/socket.io-posgres-adapter/). + +Supported features: + +- [broadcasting](https://socket.io/docs/v4/broadcasting-events/) +- [utility methods](https://socket.io/docs/v4/server-instance/#Utility-methods) + - [`socketsJoin`](https://socket.io/docs/v4/server-instance/#socketsJoin) + - [`socketsLeave`](https://socket.io/docs/v4/server-instance/#socketsLeave) + - [`disconnectSockets`](https://socket.io/docs/v4/server-instance/#disconnectSockets) + - [`serverSideEmit`](https://socket.io/docs/v4/server-instance/#serverSideEmit) + +**Table of contents** + +- [Installation](#installation) +- [Usage](#usage) +- [API](#api) +- [Known errors](#known-errors) +- [License](#license) + +## Installation + +``` +npm install @socket.io/postgres-emitter pg +``` + +For TypeScript users, you might also need `@types/pg`. + +## Usage + +```js +const { Emitter } = require("@socket.io/postgres-emitter"); +const { Pool } = require("pg"); + +const pool = new Pool({ + user: "postgres", + host: "localhost", + database: "postgres", + password: "changeit", + port: 5432, +}); + +const io = new Emitter(pool); + +setInterval(() => { + io.emit("ping", new Date()); +}, 1000); +``` + +## API + +### `Emitter(pool[, nsp][, opts])` + +```js +const io = new Emitter(pool); +``` + +The `pool` argument is a [Pool object](https://node-postgres.com/api/pool) from the `pg` package. + +### `Emitter#to(room:string):BroadcastOperator` +### `Emitter#in(room:string):BroadcastOperator` + +Specifies a specific `room` that you want to emit to. + +```js +io.to("room1").emit("hello"); +``` + +### `Emitter#except(room:string):BroadcastOperator` + +Specifies a specific `room` that you want to exclude from broadcasting. + +```js +io.except("room2").emit("hello"); +``` + +### `Emitter#of(namespace:string):Emitter` + +Specifies a specific namespace that you want to emit to. + +```js +const customNamespace = io.of("/custom"); + +customNamespace.emit("hello"); +``` + +### `Emitter#socketsJoin(rooms:string|string[])` + +Makes the matching socket instances join the specified rooms: + +```js +// make all Socket instances join the "room1" room +io.socketsJoin("room1"); + +// make all Socket instances of the "admin" namespace in the "room1" room join the "room2" room +io.of("/admin").in("room1").socketsJoin("room2"); +``` + +### `Emitter#socketsLeave(rooms:string|string[])` + +Makes the matching socket instances leave the specified rooms: + +```js +// make all Socket instances leave the "room1" room +io.socketsLeave("room1"); + +// make all Socket instances of the "admin" namespace in the "room1" room leave the "room2" room +io.of("/admin").in("room1").socketsLeave("room2"); +``` + +### `Emitter#disconnectSockets(close:boolean)` + +Makes the matching socket instances disconnect: + +```js +// make all Socket instances disconnect +io.disconnectSockets(); + +// make all Socket instances of the "admin" namespace in the "room1" room disconnect +io.of("/admin").in("room1").disconnectSockets(); + +// this also works with a single socket ID +io.of("/admin").in(theSocketId).disconnectSockets(); +``` + +### `Emitter#serverSideEmit(ev:string[,...args:any[]])` + +Emits an event that will be received by each Socket.IO server of the cluster. + +```js +io.serverSideEmit("ping"); +``` + +## License + +[MIT](LICENSE) diff --git a/assets/emitter.excalidraw b/assets/emitter.excalidraw new file mode 100644 index 0000000000..d80d011f57 --- /dev/null +++ b/assets/emitter.excalidraw @@ -0,0 +1,1380 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "text", + "version": 124, + "versionNonce": 379934487, + "isDeleted": false, + "id": "5hUB5ALUlsn26W0PzU4fM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 894, + "y": 3.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64, + "height": 25, + "seed": 28708370, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "socket", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 124, + "versionNonce": 307268057, + "isDeleted": false, + "id": "lmQ4o4New7xuXQLwavuSn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 824, + "y": -80, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 277, + "height": 311, + "seed": 1594950354, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "_wBO22vaQplcoKyBXbWRC", + "BZVwnsrGk9G-X87ZHkh-6" + ] + }, + { + "type": "text", + "version": 65, + "versionNonce": 1614306359, + "isDeleted": false, + "id": "ZQsZmj4NaTubBHMkVG2dl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 843, + "y": -69, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 85, + "height": 26, + "seed": 126533902, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "Server A", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "arrow", + "version": 143, + "versionNonce": 754409079, + "isDeleted": false, + "id": "ABQydsvmkN5ptLyYQaUA3", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 837.8983868047594, + "y": 21.868707241881623, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 251.33111393617446, + "height": 0.7613046474941143, + "seed": 1466702734, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -251.33111393617446, + -0.7613046474941143 + ] + ] + }, + { + "type": "rectangle", + "version": 150, + "versionNonce": 1198374231, + "isDeleted": false, + "id": "x54ljUV2PW8AfubZ6fiVJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 436, + "y": -8, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 486293390, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "arrow", + "version": 159, + "versionNonce": 563246999, + "isDeleted": false, + "id": "zdzgdf3hgOYX0SgjEtyIZ", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 837.2434176281095, + "y": 87.19281457587147, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 247.23231148719788, + "height": 2.2114410393964476, + "seed": 1674715794, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -247.23231148719788, + 2.2114410393964476 + ] + ] + }, + { + "type": "text", + "version": 127, + "versionNonce": 530184823, + "isDeleted": false, + "id": "dXknKeuYe3X3K-0Hw9P95", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 484, + "y": 9, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 40, + "height": 20, + "seed": 1858283854, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "client", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "rectangle", + "version": 170, + "versionNonce": 988957817, + "isDeleted": false, + "id": "Ce1Lw4MMOtiunstd3FPJv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 437.5, + "y": 67, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 568384654, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 148, + "versionNonce": 1568773015, + "isDeleted": false, + "id": "rcCUGk-XM0jKzcGaeO0iS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 484.5, + "y": 84, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 40, + "height": 20, + "seed": 244546386, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "client", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "rectangle", + "version": 211, + "versionNonce": 1673811289, + "isDeleted": false, + "id": "4iido5zQ7QhoIfnOzWp3h", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 437.5, + "y": 142, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1055485070, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 189, + "versionNonce": 1767442615, + "isDeleted": false, + "id": "D1E2DkimaDb8hGxIfXKmq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 484.5, + "y": 159, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 40, + "height": 20, + "seed": 270265170, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "client", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "rectangle", + "version": 182, + "versionNonce": 992100921, + "isDeleted": false, + "id": "RRrk3Vsl-pM8Z1r8Fj3Vu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 860.5, + "y": -8, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1013161166, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 165, + "versionNonce": 818207191, + "isDeleted": false, + "id": "8pCtm42TpakWdZ7WNS4VN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 893, + "y": 73.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64, + "height": 25, + "seed": 684338382, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "socket", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 223, + "versionNonce": 1307546393, + "isDeleted": false, + "id": "thsI1AfZ_VshmC8wdQoT_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 859.5, + "y": 62, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1104563986, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 186, + "versionNonce": 2027521783, + "isDeleted": false, + "id": "dfFxeVTIg6OH8ny7WuBsb", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890, + "y": 150.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64, + "height": 25, + "seed": 1000469902, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "socket", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 244, + "versionNonce": 1084213241, + "isDeleted": false, + "id": "Ejm4QTgpRy-0064kg5DDC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 856.5, + "y": 139, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1070363218, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "arrow", + "version": 194, + "versionNonce": 1101884599, + "isDeleted": false, + "id": "yn0_EJ_FjGmr2PHYTCPsC", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 837.6161557435989, + "y": 166.89427948030175, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 247.23231148719788, + "height": 2.2114410393964476, + "seed": 1559186084, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -247.23231148719788, + 2.2114410393964476 + ] + ] + }, + { + "type": "text", + "version": 169, + "versionNonce": 1563844825, + "isDeleted": false, + "id": "2KQuRzgUL-iSoMHZQ9zbS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.5, + "y": 406, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64, + "height": 25, + "seed": 1479277478, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "socket", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 200, + "versionNonce": 8353079, + "isDeleted": false, + "id": "dJhDWOnAJOszWt_UNEXdt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 822.5, + "y": 322.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 277, + "height": 280, + "seed": 224360890, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "qmYaJfZ9NO1RK7YHGQGo6", + "GsCkqpyPppqmnpvbaTChx", + "x_nMpLlFEV43XGOAM6Gxj" + ] + }, + { + "type": "text", + "version": 106, + "versionNonce": 1632034233, + "isDeleted": false, + "id": "lyh4RgaTTCZNLUjl519k9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 841.5, + "y": 333.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 87, + "height": 26, + "seed": 364484326, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "Server B", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "arrow", + "version": 181, + "versionNonce": 1223474647, + "isDeleted": false, + "id": "x7ujWlTTvv0aN7XIFTWjr", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 842.3983868047594, + "y": 425.3687072418816, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 251.33111393617446, + "height": 0.7613046474941143, + "seed": 1836855930, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -251.33111393617446, + -0.7613046474941143 + ] + ] + }, + { + "type": "rectangle", + "version": 188, + "versionNonce": 200588953, + "isDeleted": false, + "id": "cqdTPTcZefvtqeNEAMTBe", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 440.5, + "y": 395.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1567738406, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "arrow", + "version": 197, + "versionNonce": 174385911, + "isDeleted": false, + "id": "59kripFevaDD2Mo2bkYk-", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 841.7434176281095, + "y": 490.69281457587147, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 247.23231148719788, + "height": 2.2114410393964476, + "seed": 1124324154, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -247.23231148719788, + 2.2114410393964476 + ] + ] + }, + { + "type": "text", + "version": 165, + "versionNonce": 1811121017, + "isDeleted": false, + "id": "U0x2FIFxg4BZgOIK6sVnW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 488.5, + "y": 412.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 40, + "height": 20, + "seed": 1044485478, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "client", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "rectangle", + "version": 208, + "versionNonce": 563301527, + "isDeleted": false, + "id": "NU9potS0F6f8sxY5IT0Lt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 442, + "y": 470.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1884904442, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 186, + "versionNonce": 1837542489, + "isDeleted": false, + "id": "IpJJ20xja0yqXQC_netfw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 489, + "y": 487.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 40, + "height": 20, + "seed": 1635121318, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "client", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "rectangle", + "version": 227, + "versionNonce": 348889527, + "isDeleted": false, + "id": "scSxnujNYgELyMUDbnTNS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 859, + "y": 394.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 303703418, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 210, + "versionNonce": 679590201, + "isDeleted": false, + "id": "Lyv2NwV0SfYm5kvp9sJEn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 891.5, + "y": 476, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 64, + "height": 25, + "seed": 1344309030, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "socket", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 268, + "versionNonce": 1685869271, + "isDeleted": false, + "id": "e3D2rl_rbVQwQUKshOG8E", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 858, + "y": 464.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 627795514, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "diamond", + "version": 248, + "versionNonce": 1850223129, + "isDeleted": false, + "id": "k0pJTVL4F3HHsfRPlE-gO", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1149, + "y": 66, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 46, + "height": 46, + "seed": 1260350118, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "Sp9AvxDh8gwRvSC53VFKe" + ] + }, + { + "type": "text", + "version": 239, + "versionNonce": 1348441349, + "isDeleted": false, + "id": "DiLMkDsU2SrPef3STL9fw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1114.5, + "y": 22.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 176, + "height": 26, + "seed": 1810644198, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "Postgres adapter", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "type": "arrow", + "version": 19, + "versionNonce": 399343353, + "isDeleted": false, + "id": "Sp9AvxDh8gwRvSC53VFKe", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1129, + "y": 89, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 109, + "height": 1, + "seed": 714162918, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "k0pJTVL4F3HHsfRPlE-gO", + "focus": -0.01715197447147986, + "gap": 14.142135623730947 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -109, + -1 + ] + ] + }, + { + "type": "arrow", + "version": 35, + "versionNonce": 889768215, + "isDeleted": false, + "id": "_wBO22vaQplcoKyBXbWRC", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1126, + "y": 83, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 105, + "height": 57, + "seed": 1243541542, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "lmQ4o4New7xuXQLwavuSn", + "focus": 0.35224176368590543, + "gap": 25 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -105, + -57 + ] + ] + }, + { + "type": "arrow", + "version": 50, + "versionNonce": 328546265, + "isDeleted": false, + "id": "BZVwnsrGk9G-X87ZHkh-6", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1128, + "y": 96, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 95, + "height": 62, + "seed": 1890534970, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "lmQ4o4New7xuXQLwavuSn", + "focus": -0.522635330379503, + "gap": 27 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -95, + 62 + ] + ] + }, + { + "type": "diamond", + "version": 355, + "versionNonce": 90017335, + "isDeleted": false, + "id": "vJwd2LS9grrvUFlbCugEG", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1149.25, + "y": 467, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 46, + "height": 46, + "seed": 1072510330, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "x_nMpLlFEV43XGOAM6Gxj" + ] + }, + { + "type": "arrow", + "version": 239, + "versionNonce": 891072343, + "isDeleted": false, + "id": "x_nMpLlFEV43XGOAM6Gxj", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1123.25, + "y": 489, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 109, + "height": 1, + "seed": 1180464698, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "dJhDWOnAJOszWt_UNEXdt", + "focus": -0.17704646556482773, + "gap": 23.75 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -109, + -1 + ] + ] + }, + { + "type": "arrow", + "version": 230, + "versionNonce": 1003083161, + "isDeleted": false, + "id": "qmYaJfZ9NO1RK7YHGQGo6", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1119.9214748277186, + "y": 479.7229508196721, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 104.67147482771861, + "height": 53.72295081967212, + "seed": 880321126, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "dJhDWOnAJOszWt_UNEXdt", + "focus": 0.304824173970933, + "gap": 20.421474827718612 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -104.67147482771861, + -53.72295081967212 + ] + ] + }, + { + "type": "ellipse", + "version": 150, + "versionNonce": 1527992587, + "isDeleted": false, + "id": "EQmjbilyrf3OcSwGbMZrg", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1203, + "y": 221, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 138.0000000000001, + "height": 94.00000000000001, + "seed": 1885795942, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "xDobZ6graJnZZP8g59wJ4", + "ZwSlmk3G5YWvU1BN3Aoh_", + "eU1gfEXnHSjxc-pEgv43A" + ] + }, + { + "type": "text", + "version": 32, + "versionNonce": 1329091685, + "isDeleted": false, + "id": "wV6Y3XyIP5TbX50EF6xs6", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1217.5, + "y": 256.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 114, + "height": 26, + "seed": 1433614630, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "PostgreSQL", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "arrow", + "version": 205, + "versionNonce": 1081064421, + "isDeleted": false, + "id": "eU1gfEXnHSjxc-pEgv43A", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1231.3032386555233, + "y": 209.73280760837395, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 38.30323865552327, + "height": 92.73280760837395, + "seed": 1145880934, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "EQmjbilyrf3OcSwGbMZrg", + "gap": 18.76496421842689, + "focus": -0.23200003253698098 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -38.30323865552327, + -92.73280760837395 + ] + ] + }, + { + "type": "arrow", + "version": 186, + "versionNonce": 256792869, + "isDeleted": false, + "id": "xDobZ6graJnZZP8g59wJ4", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1245.605826516406, + "y": 329.3085913454021, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 39.321068840273256, + "height": 89.69140865459792, + "seed": 1443544058, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "EQmjbilyrf3OcSwGbMZrg", + "focus": -0.006717816566995138, + "gap": 17.320930477764534 + }, + "endBinding": { + "elementId": "8mohQ2rfKubVo6W8gvlz7", + "focus": -0.15011582418406128, + "gap": 11.75 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -39.321068840273256, + 89.69140865459792 + ] + ] + }, + { + "type": "rectangle", + "version": 32, + "versionNonce": 559233719, + "isDeleted": false, + "id": "vJCC3fZPhzuOSUDm-IELz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1424, + "y": 236, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 126, + "height": 54, + "seed": 1521447142, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 12, + "versionNonce": 901394489, + "isDeleted": false, + "id": "85ta6aPywjSaHanhmwnmS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1459.5, + "y": 252.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 55, + "height": 21, + "seed": 1601504934, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "emitter", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "arrow", + "version": 140, + "versionNonce": 666542667, + "isDeleted": false, + "id": "ZwSlmk3G5YWvU1BN3Aoh_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1405, + "y": 266, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 45.91567192209823, + "height": 0.7121352093494124, + "seed": 14898170, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": { + "elementId": "EQmjbilyrf3OcSwGbMZrg", + "gap": 18.159861146516803, + "focus": -0.08641975308641975 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -45.91567192209823, + -0.7121352093494124 + ] + ] + }, + { + "type": "text", + "version": 302, + "versionNonce": 372963243, + "isDeleted": false, + "id": "8mohQ2rfKubVo6W8gvlz7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1121.5, + "y": 430.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 176, + "height": 26, + "seed": 382986699, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "xDobZ6graJnZZP8g59wJ4" + ], + "fontSize": 20, + "fontFamily": 1, + "text": "Postgres adapter", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + } +} \ No newline at end of file diff --git a/assets/emitter.png b/assets/emitter.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd451293d0e696cba7551c3dc6e2c900528685c GIT binary patch literal 102189 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 Mwxey*t)_(hAAwDxoB#j- literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..2e8322150b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +version: "3" + +services: + postgres: + image: postgres:12 + ports: + - "5432:5432" + environment: + POSTGRES_PASSWORD: "changeit" diff --git a/lib/index.ts b/lib/index.ts new file mode 100644 index 0000000000..1c6cc9f55b --- /dev/null +++ b/lib/index.ts @@ -0,0 +1,533 @@ +import debugModule from "debug"; +import type { + DefaultEventsMap, + EventNames, + EventParams, + EventsMap, + TypedEventBroadcaster, +} from "./typed-events"; +import { encode } from "@msgpack/msgpack"; + +const debug = debugModule("socket.io-postgres-emitter"); +const EMITTER_UID = "emitter"; + +const hasBinary = (obj: any, toJSON?: boolean): boolean => { + if (!obj || typeof obj !== "object") { + return false; + } + + if (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj)) { + return true; + } + + if (Array.isArray(obj)) { + for (let i = 0, l = obj.length; i < l; i++) { + if (hasBinary(obj[i])) { + return true; + } + } + return false; + } + + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) { + return true; + } + } + + if (obj.toJSON && typeof obj.toJSON === "function" && !toJSON) { + return hasBinary(obj.toJSON(), true); + } + + return false; +}; + +/** + * Event types, for messages between nodes + */ + +enum EventType { + INITIAL_HEARTBEAT = 1, + HEARTBEAT, + BROADCAST, + SOCKETS_JOIN, + SOCKETS_LEAVE, + DISCONNECT_SOCKETS, + FETCH_SOCKETS, + FETCH_SOCKETS_RESPONSE, + SERVER_SIDE_EMIT, + SERVER_SIDE_EMIT_RESPONSE, +} + +interface BroadcastFlags { + volatile?: boolean; + compress?: boolean; +} + +export interface PostgresEmitterOptions { + /** + * The prefix of the notification channel + * @default "socket.io" + */ + channelPrefix: string; + /** + * The name of the table for payloads over the 8000 bytes limit or containing binary data + */ + tableName: string; + /** + * The threshold for the payload size in bytes (see https://www.postgresql.org/docs/current/sql-notify.html) + * @default 8000 + */ + payloadThreshold: number; +} + +export class Emitter< + EmitEvents extends EventsMap = DefaultEventsMap, + ServerSideEvents extends EventsMap = DefaultEventsMap +> { + public readonly channel: string; + public readonly tableName: string; + public payloadThreshold: number; + + constructor( + readonly pool: any, + readonly nsp: string = "/", + opts: Partial = {} + ) { + const channelPrefix = opts.channelPrefix || "socket.io"; + this.channel = `${channelPrefix}#${nsp}`; + this.tableName = opts.tableName || "socket_io_attachments"; + this.payloadThreshold = opts.payloadThreshold || 8000; + } + + /** + * Return a new emitter for the given namespace. + * + * @param nsp - namespace + * @public + */ + public of(nsp: string): Emitter { + return new Emitter(this.pool, (nsp[0] !== "/" ? "/" : "") + nsp); + } + + /** + * Emits to all clients. + * + * @return Always true + * @public + */ + public emit>( + ev: Ev, + ...args: EventParams + ): true { + return new BroadcastOperator(this).emit( + ev, + ...args + ); + } + + /** + * Targets a room when emitting. + * + * @param room + * @return BroadcastOperator + * @public + */ + public to( + room: string | string[] + ): BroadcastOperator { + return new BroadcastOperator(this).to(room); + } + + /** + * Targets a room when emitting. + * + * @param room + * @return BroadcastOperator + * @public + */ + public in( + room: string | string[] + ): BroadcastOperator { + return new BroadcastOperator(this).in(room); + } + + /** + * Excludes a room when emitting. + * + * @param room + * @return BroadcastOperator + * @public + */ + public except( + room: string | string[] + ): BroadcastOperator { + return new BroadcastOperator(this).except(room); + } + + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return BroadcastOperator + * @public + */ + public get volatile(): BroadcastOperator { + return new BroadcastOperator(this).volatile; + } + + /** + * Sets the compress flag. + * + * @param compress - if `true`, compresses the sending data + * @return BroadcastOperator + * @public + */ + public compress( + compress: boolean + ): BroadcastOperator { + return new BroadcastOperator(this).compress(compress); + } + + /** + * Makes the matching socket instances join the specified rooms + * + * @param rooms + * @public + */ + public socketsJoin(rooms: string | string[]): void { + return new BroadcastOperator(this).socketsJoin(rooms); + } + + /** + * Makes the matching socket instances leave the specified rooms + * + * @param rooms + * @public + */ + public socketsLeave(rooms: string | string[]): void { + return new BroadcastOperator(this).socketsLeave(rooms); + } + + /** + * Makes the matching socket instances disconnect + * + * @param close - whether to close the underlying connection + * @public + */ + public disconnectSockets(close: boolean = false): void { + return new BroadcastOperator(this).disconnectSockets(close); + } + + /** + * Send a packet to the Socket.IO servers in the cluster + * + * @param ev - the event name + * @param args - any number of serializable arguments + */ + public serverSideEmit>( + ev: Ev, + ...args: EventParams + ): void { + return new BroadcastOperator( + this + ).serverSideEmit(ev, ...args); + } +} + +export const RESERVED_EVENTS: ReadonlySet = new Set([ + "connect", + "connect_error", + "disconnect", + "disconnecting", + "newListener", + "removeListener", +]); + +export class BroadcastOperator< + EmitEvents extends EventsMap, + ServerSideEvents extends EventsMap +> implements TypedEventBroadcaster { + constructor( + private readonly emitter: Emitter, + private readonly rooms: Set = new Set(), + private readonly exceptRooms: Set = new Set(), + private readonly flags: BroadcastFlags = {} + ) {} + + /** + * Targets a room when emitting. + * + * @param room + * @return a new BroadcastOperator instance + * @public + */ + public to( + room: string | string[] + ): BroadcastOperator { + const rooms = new Set(this.rooms); + if (Array.isArray(room)) { + room.forEach((r) => rooms.add(r)); + } else { + rooms.add(room); + } + return new BroadcastOperator( + this.emitter, + rooms, + this.exceptRooms, + this.flags + ); + } + + /** + * Targets a room when emitting. + * + * @param room + * @return a new BroadcastOperator instance + * @public + */ + public in( + room: string | string[] + ): BroadcastOperator { + return this.to(room); + } + + /** + * Excludes a room when emitting. + * + * @param room + * @return a new BroadcastOperator instance + * @public + */ + public except( + room: string | string[] + ): BroadcastOperator { + const exceptRooms = new Set(this.exceptRooms); + if (Array.isArray(room)) { + room.forEach((r) => exceptRooms.add(r)); + } else { + exceptRooms.add(room); + } + return new BroadcastOperator( + this.emitter, + this.rooms, + exceptRooms, + this.flags + ); + } + + /** + * Sets the compress flag. + * + * @param compress - if `true`, compresses the sending data + * @return a new BroadcastOperator instance + * @public + */ + public compress( + compress: boolean + ): BroadcastOperator { + const flags = Object.assign({}, this.flags, { compress }); + return new BroadcastOperator( + this.emitter, + this.rooms, + this.exceptRooms, + flags + ); + } + + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return a new BroadcastOperator instance + * @public + */ + public get volatile(): BroadcastOperator { + const flags = Object.assign({}, this.flags, { volatile: true }); + return new BroadcastOperator( + this.emitter, + this.rooms, + this.exceptRooms, + flags + ); + } + + private async publish(document: any) { + document.uid = EMITTER_UID; + + try { + if ( + [ + EventType.BROADCAST, + EventType.SERVER_SIDE_EMIT, + EventType.SERVER_SIDE_EMIT_RESPONSE, + ].includes(document.type) && + hasBinary(document) + ) { + return await this.publishWithAttachment(document); + } + + const payload = JSON.stringify(document); + if (Buffer.byteLength(payload) > this.emitter.payloadThreshold) { + return await this.publishWithAttachment(document); + } + + debug( + "sending event of type %s to channel %s", + document.type, + this.emitter.channel + ); + await this.emitter.pool.query( + `NOTIFY "${this.emitter.channel}", '${payload}'` + ); + } catch (err) { + // @ts-ignore + this.emit("error", err); + } + } + + private async publishWithAttachment(document: any) { + const payload = encode(document); + + debug( + "sending event of type %s with attachment to channel %s", + document.type, + this.emitter.channel + ); + const result = await this.emitter.pool.query( + `INSERT INTO ${this.emitter.tableName} (payload) VALUES ($1) RETURNING id;`, + [payload] + ); + const attachmentId = result.rows[0].id; + const headerPayload = JSON.stringify({ + uid: document.uid, + type: document.type, + attachmentId, + }); + this.emitter.pool.query( + `NOTIFY "${this.emitter.channel}", '${headerPayload}'` + ); + } + + /** + * Emits to all clients. + * + * @return Always true + * @public + */ + public emit>( + ev: Ev, + ...args: EventParams + ): true { + if (RESERVED_EVENTS.has(ev)) { + throw new Error(`"${ev}" is a reserved event name`); + } + + // set up packet object + const data = [ev, ...args]; + const packet = { + type: 2, // EVENT + data: data, + nsp: this.emitter.nsp, + }; + + const opts = { + rooms: [...this.rooms], + flags: this.flags, + except: [...this.exceptRooms], + }; + + this.publish({ + type: EventType.BROADCAST, + data: { + packet, + opts, + }, + }); + + return true; + } + + /** + * Makes the matching socket instances join the specified rooms + * + * @param rooms + * @public + */ + public socketsJoin(rooms: string | string[]): void { + this.publish({ + type: EventType.SOCKETS_JOIN, + data: { + opts: { + rooms: [...this.rooms], + except: [...this.exceptRooms], + }, + rooms: Array.isArray(rooms) ? rooms : [rooms], + }, + }); + } + + /** + * Makes the matching socket instances leave the specified rooms + * + * @param rooms + * @public + */ + public socketsLeave(rooms: string | string[]): void { + this.publish({ + type: EventType.SOCKETS_LEAVE, + data: { + opts: { + rooms: [...this.rooms], + except: [...this.exceptRooms], + }, + rooms: Array.isArray(rooms) ? rooms : [rooms], + }, + }); + } + + /** + * Makes the matching socket instances disconnect + * + * @param close - whether to close the underlying connection + * @public + */ + public disconnectSockets(close: boolean = false): void { + this.publish({ + type: EventType.DISCONNECT_SOCKETS, + data: { + opts: { + rooms: [...this.rooms], + except: [...this.exceptRooms], + }, + close, + }, + }); + } + + /** + * Send a packet to the Socket.IO servers in the cluster + * + * @param ev - the event name + * @param args - any number of serializable arguments + */ + public serverSideEmit>( + ev: Ev, + ...args: EventParams + ): void { + const withAck = args.length && typeof args[args.length - 1] === "function"; + + if (withAck) { + throw new Error("Acknowledgements are not supported"); + } + + this.publish({ + type: EventType.SERVER_SIDE_EMIT, + data: { + packet: [ev, ...args], + }, + }); + } +} diff --git a/lib/typed-events.ts b/lib/typed-events.ts new file mode 100644 index 0000000000..33f7bb8bff --- /dev/null +++ b/lib/typed-events.ts @@ -0,0 +1,37 @@ +/** + * An events map is an interface that maps event names to their value, which + * represents the type of the `on` listener. + */ +export interface EventsMap { + [event: string]: any; +} + +/** + * The default events map, used if no EventsMap is given. Using this EventsMap + * is equivalent to accepting all event names, and any data. + */ +export interface DefaultEventsMap { + [event: string]: (...args: any[]) => void; +} + +/** + * Returns a union type containing all the keys of an event map. + */ +export type EventNames = keyof Map & (string | symbol); + +/** The tuple type representing the parameters of an event listener */ +export type EventParams< + Map extends EventsMap, + Ev extends EventNames +> = Parameters; + +/** + * Interface for classes that aren't `EventEmitter`s, but still expose a + * strictly typed `emit` method. + */ +export interface TypedEventBroadcaster { + emit>( + ev: Ev, + ...args: EventParams + ): boolean; +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..12141c5622 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2377 @@ +{ + "name": "@socket.io/postgres-emitter", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.11.tgz", + "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==", + "dev": true + }, + "@babel/core": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", + "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.10", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", + "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", + "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", + "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", + "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", + "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", + "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.0", + "@babel/types": "^7.13.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", + "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@msgpack/msgpack": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.0.tgz", + "integrity": "sha512-mlRYq9FSsOd4m+3wZWatemn3hGFZPWNJ4JQOdrir4rrMK2PyIk26idKBoUWrqF3HJJHl+5GpRU+M0wEruJwecg==" + }, + "@socket.io/postgres-adapter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/postgres-adapter/-/postgres-adapter-0.1.0.tgz", + "integrity": "sha512-WzoH87gs2Yo5DB/KwPEuQmlikFO1/s2NT9kRuB7XilcvFzQdj32X9FUaCwq2XnyRC9Uj0wdBGppB4sT6B6aO2A==", + "dev": true, + "requires": { + "@msgpack/msgpack": "~2.7.0", + "debug": "~4.3.1", + "socket.io-adapter": "~2.3.0" + } + }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "dev": true + }, + "@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "dev": true + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/expect.js": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@types/expect.js/-/expect.js-0.3.29.tgz", + "integrity": "sha1-KN01kVW4S47LCUr8P0t0wyItyjs=", + "dev": true + }, + "@types/mocha": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==", + "dev": true + }, + "@types/node": { + "version": "14.14.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", + "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==", + "dev": true + }, + "@types/pg": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.0.tgz", + "integrity": "sha512-3JXFrsl8COoqVB1+2Pqelx6soaiFVXzkT3fkuSNe7GB40ysfT0FHphZFPiqIXpMyTHSFRdLTyZzrFBrJRPAArA==", + "dev": true, + "requires": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001232", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001232.tgz", + "integrity": "sha512-e4Gyp7P8vqC2qV2iHA+cJNf/yqUKOShXQOJHQt81OHxlIZl/j/j3soEA0adAQi8CPUQgvOdDENyQ5kd6a6mNSg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.743", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.743.tgz", + "integrity": "sha512-K2wXfo9iZQzNJNx67+Pld0DRF+9bYinj62gXCdgPhcu1vidwVuLPHQPPFnCdO55njWigXXpfBiT90jGUPbw8Zg==", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "engine.io": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.0.tgz", + "integrity": "sha512-A2i4kVvOA3qezQLlMz+FayGFdqOo0LP3fYrb0VqXMDXKoXcbgM0KxcEYnsdVzOMJQErIAb1GIStRj7UWFoiqlQ==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + } + }, + "engine.io-client": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.1.tgz", + "integrity": "sha512-jPFpw2HLL0lhZ2KY0BpZhIJdleQcUO9W1xkIpo0h3d6s+5D6+EV/xgQw9qWOmymszv2WXef/6KUUehyxEKomlQ==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "requires": { + "mime-db": "1.47.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mocha": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", + "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", + "dev": true + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pg": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz", + "integrity": "sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==", + "dev": true, + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.3.0", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==", + "dev": true + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "dev": true + }, + "pg-pool": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz", + "integrity": "sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==", + "dev": true + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==", + "dev": true + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dev": true, + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", + "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", + "dev": true, + "requires": { + "split2": "^3.1.1" + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "dev": true + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", + "dev": true + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "dev": true + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dev": true, + "requires": { + "xtend": "^4.0.0" + } + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "socket.io": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.1.tgz", + "integrity": "sha512-YKPdhaYRGEXjP+VqoKlfOEPgDjm0aMq1YWonjHg4rBU1xJCmgceNh2XL1vO4czWupH+WX1+d9Wqb768h7BC5kw==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~5.1.0", + "socket.io-adapter": "~2.3.0", + "socket.io-parser": "~4.0.3" + }, + "dependencies": { + "socket.io-adapter": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.0.tgz", + "integrity": "sha512-jdIbSFRWOkaZpo5mXy8T7rXEN6qo3bOFuq4nVeX1ZS7AtFlkbk39y153xTXEIW7W94vZfhVOux1wTU88YxcM1w==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz", + "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw==", + "dev": true + }, + "socket.io-client": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.1.tgz", + "integrity": "sha512-avzRzFZIkmyNxqvhmm5ns0Itq5dgEkesDPB6Tl0Yben47U08MvdFnVXAuFDULQhDXjuYdCb6QUEILYLUKQEuGg==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "backo2": "~1.0.2", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-client": "~5.1.1", + "parseuri": "0.0.6", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..26502e69f7 --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "@socket.io/postgres-emitter", + "version": "0.0.1", + "description": "The Socket.IO Postgres emitter, allowing to communicate with a group of Socket.IO servers from another Node.js process", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/socketio/socket.io-postgres-emitter.git" + }, + "files": [ + "dist/" + ], + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "test": "npm run format:check && tsc && nyc mocha --require ts-node/register --timeout 5000 test/index.ts", + "format:check": "prettier --parser typescript --check 'lib/**/*.ts' 'test/**/*.ts'", + "format:fix": "prettier --parser typescript --write 'lib/**/*.ts' 'test/**/*.ts'", + "prepack": "tsc" + }, + "dependencies": { + "@msgpack/msgpack": "^2.7.0", + "debug": "~4.3.1" + }, + "devDependencies": { + "@socket.io/postgres-adapter": "^0.1.0", + "@types/debug": "^4.1.5", + "@types/expect.js": "^0.3.29", + "@types/mocha": "^8.2.1", + "@types/node": "^14.14.35", + "@types/pg": "^8.6.0", + "expect.js": "~0.3.1", + "mocha": "^8.3.2", + "nyc": "^15.1.0", + "pg": "^8.6.0", + "prettier": "^2.2.1", + "socket.io": "^4.1.1", + "socket.io-client": "^4.1.1", + "ts-node": "^9.1.1", + "typescript": "^4.2.3" + }, + "keywords": [ + "socket.io", + "postgres", + "postgresql", + "emitter" + ] +} diff --git a/test/index.ts b/test/index.ts new file mode 100644 index 0000000000..0fed699ffb --- /dev/null +++ b/test/index.ts @@ -0,0 +1,278 @@ +import { createServer } from "http"; +import { Server, Socket as ServerSocket } from "socket.io"; +import { io as ioc, Socket as ClientSocket } from "socket.io-client"; +import expect = require("expect.js"); +import { createAdapter } from "@socket.io/postgres-adapter"; +import type { AddressInfo } from "net"; +import { Pool } from "pg"; +import { times, sleep } from "./util"; +import { Emitter } from ".."; + +const NODES_COUNT = 3; + +describe("@socket.io/postgres-emitter", () => { + let servers: Server[], + serverSockets: ServerSocket[], + clientSockets: ClientSocket[], + pool: Pool, + emitter: Emitter; + + beforeEach((done) => { + servers = []; + serverSockets = []; + clientSockets = []; + pool = new Pool({ + user: "postgres", + host: "localhost", + database: "postgres", + password: "changeit", + port: 5432, + }); + + pool.query( + ` + CREATE TABLE IF NOT EXISTS socket_io_attachments ( + id bigserial UNIQUE, + created_at timestamptz DEFAULT NOW(), + payload bytea + ); + `, + () => {} + ); + + emitter = new Emitter(pool); + + for (let i = 1; i <= NODES_COUNT; i++) { + const httpServer = createServer(); + const io = new Server(httpServer); + // @ts-ignore + io.adapter(createAdapter(pool)); + httpServer.listen(() => { + const port = (httpServer.address() as AddressInfo).port; + const clientSocket = ioc(`http://localhost:${port}`); + + io.on("connection", async (socket) => { + clientSockets.push(clientSocket); + serverSockets.push(socket); + servers.push(io); + if (servers.length === NODES_COUNT) { + // ensure all nodes know each other + servers[0].emit("ping"); + servers[1].emit("ping"); + servers[2].emit("ping"); + + await sleep(200); + + done(); + } + }); + }); + } + }); + + afterEach((done) => { + servers.forEach((server) => { + // @ts-ignore + server.httpServer.close(); + server.of("/").adapter.close(); + }); + clientSockets.forEach((socket) => { + socket.disconnect(); + }); + pool.end(done); + }); + + describe("broadcast", function () { + it("broadcasts to all clients", (done) => { + const partialDone = times(3, done); + + clientSockets.forEach((clientSocket) => { + clientSocket.on("test", (arg1, arg2, arg3) => { + expect(arg1).to.eql(1); + expect(arg2).to.eql("2"); + expect(Buffer.isBuffer(arg3)).to.be(true); + partialDone(); + }); + }); + + emitter.emit("test", 1, "2", Buffer.from([3, 4])); + }); + + it("broadcasts to all clients in a namespace", (done) => { + const partialDone = times(3, () => { + servers.forEach((server) => server.of("/custom").adapter.close()); + done(); + }); + + servers.forEach((server) => server.of("/custom")); + + const onConnect = times(3, async () => { + await sleep(200); + + emitter.of("/custom").emit("test"); + }); + + clientSockets.forEach((clientSocket) => { + const socket = clientSocket.io.socket("/custom"); + socket.on("connect", onConnect); + socket.on("test", () => { + socket.disconnect(); + partialDone(); + }); + }); + }); + + it("broadcasts to all clients in a room", (done) => { + serverSockets[1].join("room1"); + + clientSockets[0].on("test", () => { + done(new Error("should not happen")); + }); + + clientSockets[1].on("test", () => { + done(); + }); + + clientSockets[2].on("test", () => { + done(new Error("should not happen")); + }); + + emitter.to("room1").emit("test"); + }); + + it("broadcasts to all clients except in room", (done) => { + const partialDone = times(2, done); + serverSockets[1].join("room1"); + + clientSockets[0].on("test", () => { + partialDone(); + }); + + clientSockets[1].on("test", () => { + done(new Error("should not happen")); + }); + + clientSockets[2].on("test", () => { + partialDone(); + }); + + emitter.of("/").except("room1").emit("test"); + }); + }); + + describe("socketsJoin", () => { + it("makes all socket instances join the specified room", async () => { + emitter.socketsJoin("room1"); + + await sleep(200); + + expect(serverSockets[0].rooms.has("room1")).to.be(true); + expect(serverSockets[1].rooms.has("room1")).to.be(true); + expect(serverSockets[2].rooms.has("room1")).to.be(true); + }); + + it("makes the matching socket instances join the specified room", async () => { + serverSockets[0].join("room1"); + serverSockets[2].join("room1"); + + emitter.in("room1").socketsJoin("room2"); + + await sleep(200); + + expect(serverSockets[0].rooms.has("room2")).to.be(true); + expect(serverSockets[1].rooms.has("room2")).to.be(false); + expect(serverSockets[2].rooms.has("room2")).to.be(true); + }); + + it("makes the given socket instance join the specified room", async () => { + emitter.in(serverSockets[1].id).socketsJoin("room3"); + + await sleep(200); + + expect(serverSockets[0].rooms.has("room3")).to.be(false); + expect(serverSockets[1].rooms.has("room3")).to.be(true); + expect(serverSockets[2].rooms.has("room3")).to.be(false); + }); + }); + + describe("socketsLeave", () => { + it("makes all socket instances leave the specified room", async () => { + serverSockets[0].join("room1"); + serverSockets[2].join("room1"); + + emitter.socketsLeave("room1"); + + await sleep(200); + + expect(serverSockets[0].rooms.has("room1")).to.be(false); + expect(serverSockets[1].rooms.has("room1")).to.be(false); + expect(serverSockets[2].rooms.has("room1")).to.be(false); + }); + + it("makes the matching socket instances leave the specified room", async () => { + serverSockets[0].join(["room1", "room2"]); + serverSockets[1].join(["room1", "room2"]); + serverSockets[2].join(["room2"]); + + emitter.in("room1").socketsLeave("room2"); + + await sleep(200); + + expect(serverSockets[0].rooms.has("room2")).to.be(false); + expect(serverSockets[1].rooms.has("room2")).to.be(false); + expect(serverSockets[2].rooms.has("room2")).to.be(true); + }); + + it("makes the given socket instance leave the specified room", async () => { + serverSockets[0].join("room3"); + serverSockets[1].join("room3"); + serverSockets[2].join("room3"); + + emitter.in(serverSockets[1].id).socketsLeave("room3"); + + await sleep(200); + + expect(serverSockets[0].rooms.has("room3")).to.be(true); + expect(serverSockets[1].rooms.has("room3")).to.be(false); + expect(serverSockets[2].rooms.has("room3")).to.be(true); + }); + }); + + describe("disconnectSockets", () => { + it("makes all socket instances disconnect", (done) => { + const partialDone = times(3, done); + + clientSockets.forEach((clientSocket) => { + clientSocket.on("disconnect", (reason) => { + expect(reason).to.eql("io server disconnect"); + partialDone(); + }); + }); + + emitter.disconnectSockets(); + }); + }); + + describe("serverSideEmit", () => { + it("sends an event to other server instances", (done) => { + const partialDone = times(3, done); + + emitter.serverSideEmit("hello", "world", 1, "2"); + + servers[0].on("hello", (arg1, arg2, arg3) => { + expect(arg1).to.eql("world"); + expect(arg2).to.eql(1); + expect(arg3).to.eql("2"); + partialDone(); + }); + + servers[1].on("hello", (arg1, arg2, arg3) => { + partialDone(); + }); + + servers[2].of("/").on("hello", () => { + partialDone(); + }); + }); + }); +}); diff --git a/test/util.ts b/test/util.ts new file mode 100644 index 0000000000..c815f22c30 --- /dev/null +++ b/test/util.ts @@ -0,0 +1,13 @@ +export function times(count: number, fn: () => void) { + let i = 0; + return () => { + i++; + if (i === count) { + fn(); + } + }; +} + +export function sleep(duration: number) { + return new Promise((resolve) => setTimeout(resolve, duration)); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..87d51bf0e1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "allowJs": false, + "target": "es2017", + "module": "commonjs", + "declaration": true + }, + "include": [ + "./lib/**/*" + ] +} From eb01ff5803a46457a6fb8c48e4ff145b7d4821a1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 14 Jun 2021 08:02:20 +0200 Subject: [PATCH 02/51] chore(release): 0.1.0 --- CHANGELOG.md | 4 ++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29bb2..d8ed55115a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +# 0.1.0 (2021-06-14) + +Initial commit + diff --git a/package-lock.json b/package-lock.json index 12141c5622..4277e42a97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@socket.io/postgres-emitter", - "version": "0.0.1", + "version": "0.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 26502e69f7..15f5bbac4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/postgres-emitter", - "version": "0.0.1", + "version": "0.1.0", "description": "The Socket.IO Postgres emitter, allowing to communicate with a group of Socket.IO servers from another Node.js process", "license": "MIT", "repository": { From 1f8a6c4ecbdc896c19eeedb79dafdab538e56f6c Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 14 Jun 2021 08:21:28 +0200 Subject: [PATCH 03/51] docs: add link to related packages --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 048416b534..c723b86fe5 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,14 @@ Supported features: - [`disconnectSockets`](https://socket.io/docs/v4/server-instance/#disconnectSockets) - [`serverSideEmit`](https://socket.io/docs/v4/server-instance/#serverSideEmit) +Related packages: + +- Postgres adapter: https://github.com/socketio/socket.io-postgres-adapter/ +- Redis adapter: https://github.com/socketio/socket.io-redis-adapter/ +- Redis emitter: https://github.com/socketio/socket.io-redis-emitter/ +- MongoDB adapter: https://github.com/socketio/socket.io-mongo-adapter/ +- MongoDB emitter: https://github.com/socketio/socket.io-mongo-emitter/ + **Table of contents** - [Installation](#installation) From ff370cfc46c307ee969d881dcd6241f2b8ef0e35 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 22 Jun 2021 07:02:16 +0200 Subject: [PATCH 04/51] Initial commit --- .github/workflows/ci.yml | 29 + .gitignore | 18 + CHANGELOG.md | 0 LICENSE | 7 + README.md | 100 ++ assets/adapter.excalidraw | 822 ++++++++++++++ assets/adapter.png | Bin 0 -> 69176 bytes lib/index.ts | 498 +++++++++ package-lock.json | 2160 +++++++++++++++++++++++++++++++++++++ package.json | 46 + test/index.ts | 292 +++++ test/util.ts | 13 + test/worker.js | 132 +++ tsconfig.json | 12 + 14 files changed, 4129 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/adapter.excalidraw create mode 100644 assets/adapter.png create mode 100644 lib/index.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 test/index.ts create mode 100644 test/util.ts create mode 100644 test/worker.js create mode 100644 tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..544577492b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI + +on: + push: + pull_request: + schedule: + - cron: '0 0 * * 0' + +jobs: + test-node: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - run: npm ci + + - run: npm test + env: + CI: true + timeout-minutes: 10 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..bc54f5be2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +npm-debug.log +node_modules +.idea +.nyc_output/ +dist/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..afc17bc357 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2021 Damien Arrachequesne (@darrachequesne) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..0f66edbde6 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# Socket.IO cluster adapter + +The `@socket.io/cluster-adapter` package allows broadcasting packets between multiple Socket.IO servers. + +![Adapter diagram](./assets/adapter.png) + +It can be used in conjunction with [`@socket.io/sticky`](https://github.com/socketio/socket.io-sticky) to broadcast packets between the workers of the same Node.js [cluster](https://nodejs.org/api/cluster.html). + +Supported features: + +- [broadcasting](https://socket.io/docs/v4/broadcasting-events/) +- [utility methods](https://socket.io/docs/v4/server-instance/#Utility-methods) + - [`socketsJoin`](https://socket.io/docs/v4/server-instance/#socketsJoin) + - [`socketsLeave`](https://socket.io/docs/v4/server-instance/#socketsLeave) + - [`disconnectSockets`](https://socket.io/docs/v4/server-instance/#disconnectSockets) + - [`fetchSockets`](https://socket.io/docs/v4/server-instance/#fetchSockets) + - [`serverSideEmit`](https://socket.io/docs/v4/server-instance/#serverSideEmit) + +Related packages: + +- Postgres adapter: https://github.com/socketio/socket.io-postgres-adapter/ +- Redis adapter: https://github.com/socketio/socket.io-redis-adapter/ +- MongoDB adapter: https://github.com/socketio/socket.io-mongo-adapter/ + +**Table of contents** + +- [Installation](#installation) +- [Usage](#usage) +- [License](#license) + +## Installation + +``` +npm install @socket.io/cluster-adapter +``` + +## Usage + +```js +const cluster = require("cluster"); +const http = require("http"); +const { Server } = require("socket.io"); +const numCPUs = require("os").cpus().length; +const { setupMaster, setupWorker } = require("@socket.io/sticky"); +const { createAdapter, setupPrimary } = require("@socket.io/cluster-adapter"); + +if (cluster.isMaster) { + console.log(`Master ${process.pid} is running`); + + const httpServer = http.createServer(); + + // setup sticky sessions + setupMaster(httpServer, { + loadBalancingMethod: "least-connection", + }); + + // setup connections between the workers + setupPrimary(); + + // needed for packets containing buffers (you can ignore it if you only send plaintext objects) + // Node.js < 16.0.0 + cluster.setupMaster({ + serialization: "advanced", + }); + // Node.js > 16.0.0 + // cluster.setupPrimary({ + // serialization: "advanced", + // }); + + httpServer.listen(3000); + + for (let i = 0; i < numCPUs; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker) => { + console.log(`Worker ${worker.process.pid} died`); + cluster.fork(); + }); +} else { + console.log(`Worker ${process.pid} started`); + + const httpServer = http.createServer(); + const io = new Server(httpServer); + + // use the cluster adapter + io.adapter(createAdapter()); + + // setup connection with the primary process + setupWorker(io); + + io.on("connection", (socket) => { + /* ... */ + }); +} +``` + +## License + +[MIT](LICENSE) diff --git a/assets/adapter.excalidraw b/assets/adapter.excalidraw new file mode 100644 index 0000000000..0cfcf79d89 --- /dev/null +++ b/assets/adapter.excalidraw @@ -0,0 +1,822 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "text", + "version": 345, + "versionNonce": 1782313961, + "isDeleted": false, + "id": "5hUB5ALUlsn26W0PzU4fM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 777, + "y": -89.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 78, + "height": 26, + "seed": 28708370, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "_wBO22vaQplcoKyBXbWRC" + ], + "fontSize": 20, + "fontFamily": 1, + "text": "worker 1", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 230, + "versionNonce": 1587305255, + "isDeleted": false, + "id": "lmQ4o4New7xuXQLwavuSn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 725, + "y": -169, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 345.00000000000006, + "height": 311, + "seed": 1594950354, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "_wBO22vaQplcoKyBXbWRC", + "BZVwnsrGk9G-X87ZHkh-6", + "eU1gfEXnHSjxc-pEgv43A", + "XZpY0rnxgeDlxu5b8fgRQ", + "4mjxZzapHnLuRx7KU2JeH", + "mV8ZNfAcYrxGLJ7b9a_kn" + ] + }, + { + "type": "text", + "version": 152, + "versionNonce": 742887113, + "isDeleted": false, + "id": "ZQsZmj4NaTubBHMkVG2dl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745, + "y": -159, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 43, + "height": 26, + "seed": 126533902, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "Host", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top" + }, + { + "type": "rectangle", + "version": 334, + "versionNonce": 1221877319, + "isDeleted": false, + "id": "RRrk3Vsl-pM8Z1r8Fj3Vu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 749.5, + "y": -105, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1013161166, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "use4Bp2hbb77Fq5njtwBi", + "U7UCkn3nVHlWGYetjII_Z" + ] + }, + { + "type": "text", + "version": 386, + "versionNonce": 601673129, + "isDeleted": false, + "id": "qfQdcJHnwYnCMtLCV51X8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 773, + "y": -18.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 90, + "height": 26, + "seed": 1535426147, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "_wBO22vaQplcoKyBXbWRC", + "2DIFacJXJtC5QIuMuo3pK" + ], + "fontSize": 20, + "fontFamily": 1, + "text": "worker 2", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 330, + "versionNonce": 794754407, + "isDeleted": false, + "id": "IRd1nPQbv0PQdJQn_yLOs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 749.5, + "y": -36, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 452398413, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "2DIFacJXJtC5QIuMuo3pK", + "NhqDM6wVMhgbRvXrQJQge", + "C1IueNJdiTSkqUxSTEvKe" + ] + }, + { + "type": "text", + "version": 374, + "versionNonce": 942092425, + "isDeleted": false, + "id": "ENOSqQ4visNbCN7ZMZwxP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 770.5, + "y": 48.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 89, + "height": 26, + "seed": 1916984429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "_wBO22vaQplcoKyBXbWRC" + ], + "fontSize": 20, + "fontFamily": 1, + "text": "worker 3", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 314, + "versionNonce": 629717127, + "isDeleted": false, + "id": "IqdB8EO7s50UY1EU9TVVP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 750.5, + "y": 30, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129, + "height": 56, + "seed": 1832463587, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "NhqDM6wVMhgbRvXrQJQge" + ] + }, + { + "type": "rectangle", + "version": 115, + "versionNonce": 997860361, + "isDeleted": false, + "id": "9grXh8d6z3-WENQLWSBP6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 338, + "y": -95, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 140, + "height": 49, + "seed": 1667334019, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 95, + "versionNonce": 1806744839, + "isDeleted": false, + "id": "uw4DcwoucyYZxQuvW-XdC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 383, + "y": -83.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 50, + "height": 26, + "seed": 1216901411, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "id": "ZR4mzBF0WDviz0UhZ4jZM", + "type": "diamond", + "x": 891.5, + "y": -87, + "width": 35, + "height": 18, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1951590473, + "version": 87, + "versionNonce": 232917705, + "isDeleted": false, + "boundElementIds": [ + "LgoBfF5uxSyzlQnWpzp21", + "VzzoutsEZMxQbMloZdWpR", + "OEzsLqAW3F-2LE0bnPrtx" + ] + }, + { + "id": "tpect-oo26kMVbG_xdqoO", + "type": "text", + "x": 895.5, + "y": -130, + "width": 157, + "height": 26, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 294816809, + "version": 104, + "versionNonce": 2120602793, + "isDeleted": false, + "boundElementIds": null, + "text": "cluster adapter", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 18 + }, + { + "type": "diamond", + "version": 113, + "versionNonce": 1690814889, + "isDeleted": false, + "id": "ScoFMjrxukGD1efHfKiFH", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 894.5, + "y": -20, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 35, + "height": 18, + "seed": 696687431, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "VzzoutsEZMxQbMloZdWpR" + ] + }, + { + "type": "diamond", + "version": 158, + "versionNonce": 1317846759, + "isDeleted": false, + "id": "wj2HZ2scg4U6UtpfK8x3e", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 893.5, + "y": 46, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 35, + "height": 18, + "seed": 1469547015, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "OEzsLqAW3F-2LE0bnPrtx" + ] + }, + { + "id": "U7UCkn3nVHlWGYetjII_Z", + "type": "arrow", + "x": 734.5, + "y": -74, + "width": 238, + "height": 4, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1537057031, + "version": 61, + "versionNonce": 1166788937, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -238, + 4 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "RRrk3Vsl-pM8Z1r8Fj3Vu", + "focus": -0.05720889916209189, + "gap": 15 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "rectangle", + "version": 163, + "versionNonce": 15141831, + "isDeleted": false, + "id": "mv6FEWy7Oux1XBpOeYKlJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 337.25, + "y": -26.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 140, + "height": 49, + "seed": 1927924585, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 143, + "versionNonce": 766883881, + "isDeleted": false, + "id": "sBk2P5AAiZa36HbnmeRLi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 382.25, + "y": -15, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 50, + "height": 26, + "seed": 1643756455, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "arrow", + "version": 111, + "versionNonce": 2076179175, + "isDeleted": false, + "id": "C1IueNJdiTSkqUxSTEvKe", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 733.75, + "y": -5.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 238, + "height": 4, + "seed": 542013001, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "IRd1nPQbv0PQdJQn_yLOs", + "focus": -0.03958393527882115, + "gap": 15.75 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -238, + 4 + ] + ] + }, + { + "type": "rectangle", + "version": 138, + "versionNonce": 478071561, + "isDeleted": false, + "id": "6r_-m_ehoDx3FlKI9YqbJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 337.25, + "y": 40.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 140, + "height": 49, + "seed": 704870919, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [] + }, + { + "type": "text", + "version": 118, + "versionNonce": 133039623, + "isDeleted": false, + "id": "EEhePeT66oko7kRekPQGo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 382.25, + "y": 52, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 50, + "height": 26, + "seed": 93212137, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "arrow", + "version": 86, + "versionNonce": 979534313, + "isDeleted": false, + "id": "etOb8BtJX8fUgxXsPOX2F", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 733.75, + "y": 61.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 238, + "height": 4, + "seed": 464822567, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -238, + 4 + ] + ] + }, + { + "type": "rectangle", + "version": 184, + "versionNonce": 1953344807, + "isDeleted": false, + "id": "G6-PJf8TRngnFyuC3A0QC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 337.25, + "y": 105.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 140, + "height": 49, + "seed": 1627945223, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [ + "JFhaNprFAz7gl6FY48Aps" + ] + }, + { + "type": "text", + "version": 163, + "versionNonce": 342645961, + "isDeleted": false, + "id": "UEv3oUzBr56Mj6Mz7hG-B", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 382.25, + "y": 117, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 50, + "height": 26, + "seed": 1822211817, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "arrow", + "version": 135, + "versionNonce": 2091610183, + "isDeleted": false, + "id": "JFhaNprFAz7gl6FY48Aps", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 731.1770639400929, + "y": 74.303452225402, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 240.42706394009292, + "height": 54.196547774598, + "seed": 1203879975, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": { + "elementId": "G6-PJf8TRngnFyuC3A0QC", + "focus": 0.4300574064368146, + "gap": 13.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -240.42706394009292, + 54.196547774598 + ] + ] + }, + { + "id": "VzzoutsEZMxQbMloZdWpR", + "type": "arrow", + "x": 929.5, + "y": -70, + "width": 17, + "height": 53, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1957283401, + "version": 330, + "versionNonce": 1093640775, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 16, + 23 + ], + [ + -1, + 53 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ZR4mzBF0WDviz0UhZ4jZM", + "focus": -0.853416149068323, + "gap": 8.48634645640746 + }, + "endBinding": { + "elementId": "ScoFMjrxukGD1efHfKiFH", + "focus": 0.7485714285714284, + "gap": 4.878378801288122 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "arrow", + "version": 440, + "versionNonce": 2038871081, + "isDeleted": false, + "id": "OEzsLqAW3F-2LE0bnPrtx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 930.5, + "y": -71, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 42, + "height": 116, + "seed": 1990607913, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "ZR4mzBF0WDviz0UhZ4jZM", + "focus": -0.8894409937888198, + "gap": 8.054406666710076 + }, + "endBinding": { + "elementId": "wj2HZ2scg4U6UtpfK8x3e", + "focus": 0.6, + "gap": 8.435530010560711 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39, + 46 + ], + [ + -3, + 116 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + } +} \ No newline at end of file diff --git a/assets/adapter.png b/assets/adapter.png new file mode 100644 index 0000000000000000000000000000000000000000..a1de176ac87bfc06611d6b43c7e70dc6dc71a65a GIT binary patch literal 69176 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 cZ9uW_Pdbzd{Q3UfV*H randomBytes(8).toString("hex"); +const debug = require("debug")("socket.io-cluster-adapter"); + +const MESSAGE_SOURCE = "_sio_adapter"; +const hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * Event types, for messages between nodes + */ + +enum EventType { + WORKER_INIT = 1, + WORKER_PING, + WORKER_EXIT, + BROADCAST, + SOCKETS_JOIN, + SOCKETS_LEAVE, + DISCONNECT_SOCKETS, + FETCH_SOCKETS, + FETCH_SOCKETS_RESPONSE, + SERVER_SIDE_EMIT, + SERVER_SIDE_EMIT_RESPONSE, +} + +interface Request { + type: EventType; + resolve: Function; + timeout: NodeJS.Timeout; + expected: number; + current: number; + responses: any[]; +} + +export interface ClusterAdapterOptions { + /** + * after this timeout the adapter will stop waiting from responses to request + * @default 5000 + */ + requestsTimeout: number; +} + +/** + * Returns a function that will create a ClusterAdapter instance. + * + * @param opts - additional options + * + * @public + */ +export function createAdapter(opts: Partial = {}) { + return function (nsp) { + return new ClusterAdapter(nsp, opts); + }; +} + +export class ClusterAdapter extends Adapter { + public requestsTimeout: number; + + private workerIds: Set = new Set(); + private requests: Map = new Map(); + + /** + * Adapter constructor. + * + * @param nsp - the namespace + * @param opts - additional options + * + * @public + */ + constructor(nsp: any, opts: Partial = {}) { + super(nsp); + this.requestsTimeout = opts.requestsTimeout || 5000; + + this.publish({ + type: EventType.WORKER_INIT, + data: cluster.worker.id, + }); + + process.on("message", this.onMessage.bind(this)); + } + + public async onMessage(message: any) { + const isValidSource = message?.source === MESSAGE_SOURCE; + if (!isValidSource) { + return; + } + + if (message.type === EventType.WORKER_EXIT) { + this.workerIds.delete(message.data); + debug("workers count is now %d", this.workerIds.size); + return; + } + + if (message.nsp !== this.nsp.name) { + debug("ignore other namespace"); + return; + } + + switch (message.type) { + case EventType.WORKER_INIT: + this.workerIds.add(message.data); + debug("workers count is now %d", this.workerIds.size); + this.publish({ + type: EventType.WORKER_PING, + data: cluster.worker.id, + }); + break; + case EventType.WORKER_PING: + this.workerIds.add(message.data); + debug("workers count is now %d", this.workerIds.size); + break; + case EventType.BROADCAST: { + debug("broadcast with opts %j", message.data.opts); + super.broadcast( + message.data.packet, + ClusterAdapter.deserializeOptions(message.data.opts) + ); + break; + } + case EventType.SOCKETS_JOIN: { + debug("calling addSockets with opts %j", message.data.opts); + super.addSockets( + ClusterAdapter.deserializeOptions(message.data.opts), + message.data.rooms + ); + break; + } + case EventType.SOCKETS_LEAVE: { + debug("calling delSockets with opts %j", message.data.opts); + super.delSockets( + ClusterAdapter.deserializeOptions(message.data.opts), + message.data.rooms + ); + break; + } + case EventType.DISCONNECT_SOCKETS: { + debug("calling disconnectSockets with opts %j", message.data.opts); + super.disconnectSockets( + ClusterAdapter.deserializeOptions(message.data.opts), + message.data.close + ); + break; + } + case EventType.FETCH_SOCKETS: { + debug("calling fetchSockets with opts %j", message.data.opts); + const localSockets = await super.fetchSockets( + ClusterAdapter.deserializeOptions(message.data.opts) + ); + + this.publish({ + type: EventType.FETCH_SOCKETS_RESPONSE, + data: { + requestId: message.data.requestId, + workerId: message.data.workerId, + sockets: localSockets.map((socket) => ({ + id: socket.id, + handshake: socket.handshake, + rooms: [...socket.rooms], + data: socket.data, + })), + }, + }); + break; + } + case EventType.FETCH_SOCKETS_RESPONSE: { + const request = this.requests.get(message.data.requestId); + + if (!request) { + return; + } + + request.current++; + message.data.sockets.forEach((socket: any) => + request.responses.push(socket) + ); + + if (request.current === request.expected) { + clearTimeout(request.timeout); + request.resolve(request.responses); + this.requests.delete(message.data.requestId); + } + break; + } + case EventType.SERVER_SIDE_EMIT: { + const packet = message.data.packet; + const withAck = message.data.requestId !== undefined; + if (!withAck) { + this.nsp._onServerSideEmit(packet); + return; + } + let called = false; + const callback = (arg: any) => { + // only one argument is expected + if (called) { + return; + } + called = true; + debug("calling acknowledgement with %j", arg); + this.publish({ + type: EventType.SERVER_SIDE_EMIT_RESPONSE, + data: { + requestId: message.data.requestId, + workerId: message.data.workerId, + packet: arg, + }, + }); + }; + + packet.push(callback); + this.nsp._onServerSideEmit(packet); + break; + } + case EventType.SERVER_SIDE_EMIT_RESPONSE: { + const request = this.requests.get(message.data.requestId); + + if (!request) { + return; + } + + request.current++; + request.responses.push(message.data.packet); + + if (request.current === request.expected) { + clearTimeout(request.timeout); + request.resolve(null, request.responses); + this.requests.delete(message.data.requestId); + } + } + } + } + + private async publish(message: any) { + // to be able to ignore unrelated messages on the cluster message bus + message.source = MESSAGE_SOURCE; + // to be able to ignore messages from other namespaces + message.nsp = this.nsp.name; + + debug( + "publish event of type %s for namespace %s", + message.type, + message.nsp + ); + + process.send(message); + } + + /** + * Transform ES6 Set into plain arrays. + * + * Note: we manually serialize ES6 Sets so that using `serialization: "advanced"` is not needed when using plaintext + * packets (reference: https://nodejs.org/api/child_process.html#child_process_advanced_serialization) + */ + private static serializeOptions(opts: BroadcastOptions) { + return { + rooms: [...opts.rooms], + except: opts.except ? [...opts.except] : [], + flags: opts.flags, + }; + } + + private static deserializeOptions(opts: any): BroadcastOptions { + return { + rooms: new Set(opts.rooms), + except: new Set(opts.except), + flags: opts.flags, + }; + } + + public broadcast(packet: any, opts: BroadcastOptions) { + const onlyLocal = opts?.flags?.local; + if (!onlyLocal) { + this.publish({ + type: EventType.BROADCAST, + data: { + packet, + opts: ClusterAdapter.serializeOptions(opts), + }, + }); + } + + // packets with binary contents are modified by the broadcast method, hence the nextTick() + process.nextTick(() => { + super.broadcast(packet, opts); + }); + } + + addSockets(opts: BroadcastOptions, rooms: Room[]) { + super.addSockets(opts, rooms); + + const onlyLocal = opts.flags?.local; + if (onlyLocal) { + return; + } + + this.publish({ + type: EventType.SOCKETS_JOIN, + data: { + opts: ClusterAdapter.serializeOptions(opts), + rooms, + }, + }); + } + + delSockets(opts: BroadcastOptions, rooms: Room[]) { + super.delSockets(opts, rooms); + + const onlyLocal = opts.flags?.local; + if (onlyLocal) { + return; + } + + this.publish({ + type: EventType.SOCKETS_LEAVE, + data: { + opts: ClusterAdapter.serializeOptions(opts), + rooms, + }, + }); + } + + disconnectSockets(opts: BroadcastOptions, close: boolean) { + super.disconnectSockets(opts, close); + + const onlyLocal = opts.flags?.local; + if (onlyLocal) { + return; + } + + this.publish({ + type: EventType.DISCONNECT_SOCKETS, + data: { + opts: ClusterAdapter.serializeOptions(opts), + close, + }, + }); + } + + private getExpectedResponseCount() { + return this.workerIds.size; + } + + async fetchSockets(opts: BroadcastOptions): Promise { + const localSockets = await super.fetchSockets(opts); + const expectedResponseCount = this.getExpectedResponseCount(); + + if (opts.flags?.local || expectedResponseCount === 0) { + return localSockets; + } + + const requestId = randomId(); + + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + const storedRequest = this.requests.get(requestId); + if (storedRequest) { + reject( + new Error( + `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}` + ) + ); + this.requests.delete(requestId); + } + }, this.requestsTimeout); + + const storedRequest = { + type: EventType.FETCH_SOCKETS, + resolve, + timeout, + current: 0, + expected: expectedResponseCount, + responses: localSockets, + }; + this.requests.set(requestId, storedRequest); + + this.publish({ + type: EventType.FETCH_SOCKETS, + data: { + requestId, + workerId: cluster.worker.id, + opts: ClusterAdapter.serializeOptions(opts), + }, + }); + }); + } + + public serverSideEmit(packet: any[]): void { + const withAck = typeof packet[packet.length - 1] === "function"; + + if (withAck) { + this.serverSideEmitWithAck(packet).catch(() => { + // ignore errors + }); + return; + } + + this.publish({ + type: EventType.SERVER_SIDE_EMIT, + data: { + packet, + }, + }); + } + + private async serverSideEmitWithAck(packet: any[]) { + const ack = packet.pop(); + const expectedResponseCount = this.getExpectedResponseCount(); + + debug( + 'waiting for %d responses to "serverSideEmit" request', + expectedResponseCount + ); + + if (expectedResponseCount <= 0) { + return ack(null, []); + } + + const requestId = randomId(); + + const timeout = setTimeout(() => { + const storedRequest = this.requests.get(requestId); + if (storedRequest) { + ack( + new Error( + `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}` + ), + storedRequest.responses + ); + this.requests.delete(requestId); + } + }, this.requestsTimeout); + + const storedRequest = { + type: EventType.FETCH_SOCKETS, + resolve: ack, + timeout, + current: 0, + expected: expectedResponseCount, + responses: [], + }; + this.requests.set(requestId, storedRequest); + + this.publish({ + type: EventType.SERVER_SIDE_EMIT, + data: { + requestId, // the presence of this attribute defines whether an acknowledgement is needed + workerId: cluster.worker.id, + packet, + }, + }); + } +} + +export function setupPrimary() { + cluster.on("message", (worker, message) => { + const isValidSource = message?.source === MESSAGE_SOURCE; + if (!isValidSource) { + return; + } + + switch (message.type) { + case EventType.FETCH_SOCKETS_RESPONSE: + case EventType.SERVER_SIDE_EMIT_RESPONSE: + const workerId = message.data.workerId; + // emit back to the requester + if (hasOwnProperty.call(cluster.workers, workerId)) { + cluster.workers[workerId].send(message); + } + break; + default: + const emitterIdAsString = "" + worker.id; + // emit to all workers but the requester + for (const workerId in cluster.workers) { + if ( + hasOwnProperty.call(cluster.workers, workerId) && + workerId !== emitterIdAsString + ) { + cluster.workers[workerId].send(message); + } + } + } + }); + + cluster.on("exit", (worker) => { + // notify all active workers + for (const workerId in cluster.workers) { + if (hasOwnProperty.call(cluster.workers, workerId)) { + cluster.workers[workerId].send({ + source: MESSAGE_SOURCE, + type: EventType.WORKER_EXIT, + data: worker.id, + }); + } + } + }); +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..956cad386a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2160 @@ +{ + "name": "@socket.io/cluster-adapter", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "dev": true + }, + "@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "dev": true + }, + "@types/expect.js": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@types/expect.js/-/expect.js-0.3.29.tgz", + "integrity": "sha1-KN01kVW4S47LCUr8P0t0wyItyjs=", + "dev": true + }, + "@types/mocha": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==", + "dev": true + }, + "@types/node": { + "version": "15.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", + "dev": true + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "engine.io": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.0.tgz", + "integrity": "sha512-A2i4kVvOA3qezQLlMz+FayGFdqOo0LP3fYrb0VqXMDXKoXcbgM0KxcEYnsdVzOMJQErIAb1GIStRj7UWFoiqlQ==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + } + }, + "engine.io-client": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.1.tgz", + "integrity": "sha512-jPFpw2HLL0lhZ2KY0BpZhIJdleQcUO9W1xkIpo0h3d6s+5D6+EV/xgQw9qWOmymszv2WXef/6KUUehyxEKomlQ==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "requires": { + "mime-db": "1.47.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "socket.io": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.1.tgz", + "integrity": "sha512-YKPdhaYRGEXjP+VqoKlfOEPgDjm0aMq1YWonjHg4rBU1xJCmgceNh2XL1vO4czWupH+WX1+d9Wqb768h7BC5kw==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~5.1.0", + "socket.io-adapter": "~2.3.0", + "socket.io-parser": "~4.0.3" + } + }, + "socket.io-adapter": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.0.tgz", + "integrity": "sha512-jdIbSFRWOkaZpo5mXy8T7rXEN6qo3bOFuq4nVeX1ZS7AtFlkbk39y153xTXEIW7W94vZfhVOux1wTU88YxcM1w==" + }, + "socket.io-client": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.1.tgz", + "integrity": "sha512-avzRzFZIkmyNxqvhmm5ns0Itq5dgEkesDPB6Tl0Yben47U08MvdFnVXAuFDULQhDXjuYdCb6QUEILYLUKQEuGg==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "backo2": "~1.0.2", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-client": "~5.1.1", + "parseuri": "0.0.6", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..b17a8e0ba0 --- /dev/null +++ b/package.json @@ -0,0 +1,46 @@ +{ + "name": "@socket.io/cluster-adapter", + "version": "0.0.1", + "description": "The Socket.IO cluster adapter, allowing to broadcast events between several Socket.IO servers", + "license": "MIT", + "repository": { + "type": "git", + "url": "git@github.com:socketio/socket.io-cluster-adapter.git" + }, + "files": [ + "dist/" + ], + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "test": "npm run format:check && tsc && nyc mocha --require ts-node/register test/index.ts", + "format:check": "prettier --parser typescript --check 'lib/**/*.ts' 'test/**/*.ts'", + "format:fix": "prettier --parser typescript --write 'lib/**/*.ts' 'test/**/*.ts'", + "prepack": "tsc" + }, + "dependencies": { + "debug": "~4.3.1", + "socket.io-adapter": "~2.3.0" + }, + "devDependencies": { + "@types/expect.js": "^0.3.29", + "@types/mocha": "^8.2.1", + "@types/node": "^15.12.4", + "expect.js": "0.3.1", + "mocha": "^8.4.0", + "nyc": "^15.1.0", + "prettier": "^2.1.2", + "socket.io": "^4.1.1", + "socket.io-client": "^4.1.1", + "ts-node": "^9.1.1", + "typescript": "^4.0.5" + }, + "engines": { + "node": ">=10.0.0" + }, + "keywords": [ + "socket.io", + "cluster", + "adapter" + ] +} diff --git a/test/index.ts b/test/index.ts new file mode 100644 index 0000000000..39fb1fedaf --- /dev/null +++ b/test/index.ts @@ -0,0 +1,292 @@ +import { io as ioc, Socket as ClientSocket } from "socket.io-client"; +import expect = require("expect.js"); +import { setupPrimary } from ".."; +import { times, sleep } from "./util"; +import cluster = require("cluster"); +import { Worker } from "cluster"; + +const NODES_COUNT = 3; + +cluster.setupMaster({ + exec: "./test/worker.js", + // @ts-ignore + serialization: "advanced", // needed for packets containing buffers +}); + +setupPrimary(); + +const getRooms = (worker): Promise> => { + worker.send("get rooms"); + return new Promise((resolve) => { + worker.once("message", (content) => { + resolve(content); + }); + }); +}; + +describe("@socket.io/cluster-adapter", () => { + let clientSockets: ClientSocket[], workers: Worker[]; + + beforeEach((done) => { + clientSockets = []; + workers = []; + + for (let i = 1; i <= NODES_COUNT; i++) { + const PORT = 40000 + i; + const worker = cluster.fork({ + PORT, + }); + + const clientSocket = ioc(`http://localhost:${PORT}`); + clientSocket.on("connect", async () => { + workers.push(worker); + clientSockets.push(clientSocket); + if (clientSockets.length === NODES_COUNT) { + await sleep(100); + + done(); + } + }); + } + }); + + afterEach(() => { + for (const id in cluster.workers) { + cluster.workers[id].kill(); + } + clientSockets.forEach((socket) => { + socket.disconnect(); + }); + }); + + describe("broadcast", function () { + it("broadcasts to all clients", (done) => { + const partialDone = times(3, done); + + clientSockets.forEach((clientSocket) => { + clientSocket.on("test", (arg1, arg2, arg3) => { + expect(arg1).to.eql(1); + expect(arg2).to.eql("2"); + expect(Buffer.isBuffer(arg3)).to.be(true); + partialDone(); + }); + }); + + workers[0].send("broadcasts to all clients"); + }); + + it("broadcasts to all clients in a namespace", (done) => { + const partialDone = times(3, done); + + const onConnect = times(3, async () => { + workers[0].send("broadcasts to all clients in a namespace"); + }); + + clientSockets.forEach((clientSocket) => { + const socket = clientSocket.io.socket("/custom"); + socket.on("connect", onConnect); + socket.on("test", () => { + socket.disconnect(); + partialDone(); + }); + }); + }); + + it("broadcasts to all clients in a room", (done) => { + workers[1].send("join room1"); + + clientSockets[0].on("test", () => { + done(new Error("should not happen")); + }); + + clientSockets[1].on("test", () => { + done(); + }); + + clientSockets[2].on("test", () => { + done(new Error("should not happen")); + }); + + workers[0].send("broadcasts to all clients in a room"); + }); + + it("broadcasts to all clients except in room", (done) => { + const partialDone = times(2, done); + workers[1].send("join room1"); + + clientSockets[0].on("test", () => { + partialDone(); + }); + + clientSockets[1].on("test", () => { + done(new Error("should not happen")); + }); + + clientSockets[2].on("test", () => { + partialDone(); + }); + + workers[0].send("broadcasts to all clients except in room"); + }); + + it("broadcasts to local clients only", (done) => { + clientSockets[0].on("test", () => { + done(); + }); + + clientSockets[1].on("test", () => { + done(new Error("should not happen")); + }); + + clientSockets[2].on("test", () => { + done(new Error("should not happen")); + }); + + workers[0].send("broadcasts to local clients only"); + }); + }); + + describe("socketsJoin", () => { + it("makes all socket instances join the specified room", async () => { + workers[0].send("makes all socket instances join the specified room"); + + await sleep(100); + + expect((await getRooms(workers[0])).has("room1")).to.be(true); + expect((await getRooms(workers[1])).has("room1")).to.be(true); + expect((await getRooms(workers[2])).has("room1")).to.be(true); + }); + + it("makes the matching socket instances join the specified room", async () => { + workers[0].send("join room1"); + workers[2].send("join room1"); + + workers[0].send( + "makes the matching socket instances join the specified room" + ); + + await sleep(100); + + expect((await getRooms(workers[0])).has("room2")).to.be(true); + expect((await getRooms(workers[1])).has("room2")).to.be(false); + expect((await getRooms(workers[2])).has("room2")).to.be(true); + }); + }); + + describe("socketsLeave", () => { + it("makes all socket instances leave the specified room", async () => { + workers[0].send("join room1"); + workers[2].send("join room1"); + + workers[0].send("makes all socket instances leave the specified room"); + + await sleep(100); + + expect((await getRooms(workers[0])).has("room1")).to.be(false); + expect((await getRooms(workers[1])).has("room1")).to.be(false); + expect((await getRooms(workers[2])).has("room1")).to.be(false); + }); + + it("makes the matching socket instances leave the specified room", async () => { + workers[0].send("join room1 & room2"); + workers[2].send("join room2"); + + workers[0].send( + "makes the matching socket instances leave the specified room" + ); + + await sleep(100); + + expect((await getRooms(workers[0])).has("room2")).to.be(false); + expect((await getRooms(workers[1])).has("room2")).to.be(false); + expect((await getRooms(workers[2])).has("room2")).to.be(true); + }); + }); + + describe("disconnectSockets", () => { + it("makes all socket instances disconnect", (done) => { + const partialDone = times(3, done); + + clientSockets.forEach((clientSocket) => { + clientSocket.on("disconnect", (reason) => { + expect(reason).to.eql("io server disconnect"); + partialDone(); + }); + }); + + workers[0].send("makes all socket instances disconnect"); + }); + }); + + describe("fetchSockets", () => { + it("returns all socket instances", (done) => { + workers[0].send("returns all socket instances"); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(); + } + }); + }); + }); + + describe("serverSideEmit", () => { + it("sends an event to other server instances", (done) => { + const partialDone = times(2, done); + + workers[0].send("sends an event to other server instances"); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(new Error("should not happen")); + } + }); + + workers[1].on("message", (result) => { + expect(result).to.eql("ok"); + partialDone(); + }); + + workers[2].on("message", (result) => { + expect(result).to.eql("ok"); + partialDone(); + }); + }); + + it("sends an event and receives a response from the other server instances", (done) => { + workers[0].send( + "sends an event and receives a response from the other server instances (1)" + ); + workers[1].send( + "sends an event and receives a response from the other server instances (2)" + ); + workers[2].send( + "sends an event and receives a response from the other server instances (3)" + ); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(); + } + }); + }); + + it("sends an event but timeout if one server does not respond", (done) => { + workers[0].send( + "sends an event but timeout if one server does not respond (1)" + ); + workers[1].send( + "sends an event but timeout if one server does not respond (2)" + ); + workers[2].send( + "sends an event but timeout if one server does not respond (3)" + ); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(); + } + }); + }); + }); +}); diff --git a/test/util.ts b/test/util.ts new file mode 100644 index 0000000000..c815f22c30 --- /dev/null +++ b/test/util.ts @@ -0,0 +1,13 @@ +export function times(count: number, fn: () => void) { + let i = 0; + return () => { + i++; + if (i === count) { + fn(); + } + }; +} + +export function sleep(duration: number) { + return new Promise((resolve) => setTimeout(resolve, duration)); +} diff --git a/test/worker.js b/test/worker.js new file mode 100644 index 0000000000..a42e114341 --- /dev/null +++ b/test/worker.js @@ -0,0 +1,132 @@ +const { createServer } = require("http"); +const { Server } = require("socket.io"); +const { createAdapter } = require(".."); + +const httpServer = createServer(); +const io = new Server(httpServer); +const expect = require("expect.js"); + +io.adapter(createAdapter()); + +let serverSocket; + +io.on("connection", (socket) => { + serverSocket = socket; +}); + +const customNamespace = io.of("/custom"); + +process.on("message", async (msg) => { + switch (msg) { + case "broadcasts to all clients": + io.emit("test", 1, "2", Buffer.from([3, 4])); + break; + case "broadcasts to all clients in a namespace": + customNamespace.emit("test"); + break; + case "join room1": + serverSocket.join("room1"); + break; + case "join room1 & room2": + serverSocket.join(["room1", "room2"]); + break; + case "join room2": + serverSocket.join("room2"); + break; + case "broadcasts to all clients in a room": + io.to("room1").emit("test"); + break; + case "broadcasts to all clients except in room": + io.of("/").except("room1").emit("test"); + break; + case "broadcasts to local clients only": + io.local.emit("test"); + break; + + case "get rooms": + process.send(serverSocket.rooms); + break; + case "makes all socket instances join the specified room": + io.socketsJoin("room1"); + break; + + case "makes the matching socket instances join the specified room": + io.in("room1").socketsJoin("room2"); + break; + + case "makes all socket instances leave the specified room": + io.socketsLeave("room1"); + break; + case "makes the matching socket instances leave the specified room": + io.in("room1").socketsLeave("room2"); + break; + + case "makes all socket instances disconnect": + io.disconnectSockets(); + break; + + case "returns all socket instances": + const sockets = await io.fetchSockets(); + + expect(sockets).to.be.an(Array); + expect(sockets).to.have.length(3); + expect(io.of("/").adapter.requests.size).to.eql(0); // clean up + + process.send("ok"); + break; + + case "sends an event to other server instances": + io.serverSideEmit("hello", "world", 1, "2"); + break; + case "sends an event and receives a response from the other server instances (1)": + io.serverSideEmit("hello with ack", (err, response) => { + expect(err).to.be(null); + expect(response).to.be.an(Array); + expect(response).to.contain(2); + expect(response).to.contain("3"); + process.send("ok"); + }); + break; + case "sends an event and receives a response from the other server instances (2)": + io.on("hello with ack", (cb) => { + cb(2); + }); + break; + case "sends an event and receives a response from the other server instances (3)": + io.on("hello with ack", (cb) => { + cb("3"); + }); + break; + case "sends an event but timeout if one server does not respond (1)": + io.of("/").adapter.requestsTimeout = 200; + + io.serverSideEmit("hello with ack", (err, response) => { + expect(err.message).to.be( + "timeout reached: only 1 responses received out of 2" + ); + expect(response).to.be.an(Array); + expect(response).to.contain(2); + process.send("ok"); + }); + break; + case "sends an event but timeout if one server does not respond (2)": + io.on("hello with ack", (cb) => { + cb(2); + }); + break; + case "sends an event but timeout if one server does not respond (3)": + io.on("hello with ack", (cb) => { + // do nothing + }); + break; + } +}); + +io.on("hello", (arg1, arg2, arg3) => { + expect(arg1).to.eql("world"); + expect(arg2).to.eql(1); + expect(arg3).to.eql("2"); + process.send("ok"); +}); + +httpServer.listen(parseInt(process.env.PORT, 10)); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..87d51bf0e1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "allowJs": false, + "target": "es2017", + "module": "commonjs", + "declaration": true + }, + "include": [ + "./lib/**/*" + ] +} From 6397c1bdfdf17477fb17be1285094e8d1b3a5670 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 22 Jun 2021 07:06:15 +0200 Subject: [PATCH 05/51] chore(release): 0.1.0 --- CHANGELOG.md | 4 ++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29bb2..c6c7ec503a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +# 0.1.0 (2021-06-22) + +Initial commit + diff --git a/package-lock.json b/package-lock.json index 956cad386a..32c4580695 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.0.1", + "version": "0.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b17a8e0ba0..780be15ccd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.0.1", + "version": "0.1.0", "description": "The Socket.IO cluster adapter, allowing to broadcast events between several Socket.IO servers", "license": "MIT", "repository": { From 055b7840d8cf88173d8299041ef3fafa9791c97a Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 28 Apr 2022 15:53:29 +0200 Subject: [PATCH 06/51] feat: broadcast and expect multiple acks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This feature was added in `socket.io@4.5.0`: ```js io.timeout(1000).emit("some-event", (err, responses) => {   // ... }); ``` Thanks to this change, it will now work with multiple Socket.IO servers. Related: https://github.com/socketio/socket.io/issues/4163 --- lib/index.ts | 101 +- package-lock.json | 2990 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 4 +- test/index.ts | 78 ++ test/worker.js | 52 + 5 files changed, 3175 insertions(+), 50 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index cfc063fbb7..21101b4e54 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -24,6 +24,8 @@ enum EventType { FETCH_SOCKETS_RESPONSE, SERVER_SIDE_EMIT, SERVER_SIDE_EMIT_RESPONSE, + BROADCAST_CLIENT_COUNT, + BROADCAST_ACK, } interface Request { @@ -35,6 +37,12 @@ interface Request { responses: any[]; } +interface AckRequest { + type: EventType.BROADCAST; + clientCountCallback: (clientCount: number) => void; + ack: (...args: any[]) => void; +} + export interface ClusterAdapterOptions { /** * after this timeout the adapter will stop waiting from responses to request @@ -61,6 +69,7 @@ export class ClusterAdapter extends Adapter { private workerIds: Set = new Set(); private requests: Map = new Map(); + private ackRequests: Map = new Map(); /** * Adapter constructor. @@ -114,12 +123,54 @@ export class ClusterAdapter extends Adapter { break; case EventType.BROADCAST: { debug("broadcast with opts %j", message.data.opts); - super.broadcast( - message.data.packet, - ClusterAdapter.deserializeOptions(message.data.opts) - ); + + const withAck = message.data.requestId !== undefined; + if (withAck) { + super.broadcastWithAck( + message.data.packet, + ClusterAdapter.deserializeOptions(message.data.opts), + (clientCount) => { + debug("waiting for %d client acknowledgements", clientCount); + this.publish({ + type: EventType.BROADCAST_CLIENT_COUNT, + data: { + requestId: message.data.requestId, + clientCount, + }, + }); + }, + (arg) => { + debug("received acknowledgement with value %j", arg); + this.publish({ + type: EventType.BROADCAST_ACK, + data: { + requestId: message.data.requestId, + packet: arg, + }, + }); + } + ); + } else { + super.broadcast( + message.data.packet, + ClusterAdapter.deserializeOptions(message.data.opts) + ); + } break; } + + case EventType.BROADCAST_CLIENT_COUNT: { + const request = this.ackRequests.get(message.data.requestId); + request?.clientCountCallback(message.data.clientCount); + break; + } + + case EventType.BROADCAST_ACK: { + const request = this.ackRequests.get(message.data.requestId); + request?.ack(message.data.packet); + break; + } + case EventType.SOCKETS_JOIN: { debug("calling addSockets with opts %j", message.data.opts); super.addSockets( @@ -287,6 +338,48 @@ export class ClusterAdapter extends Adapter { }); } + public broadcastWithAck( + packet: any, + opts: BroadcastOptions, + clientCountCallback: (clientCount: number) => void, + ack: (...args: any[]) => void + ) { + const onlyLocal = opts?.flags?.local; + if (!onlyLocal) { + const requestId = randomId(); + + this.publish({ + type: EventType.BROADCAST, + data: { + packet, + requestId, + opts: ClusterAdapter.serializeOptions(opts), + }, + }); + + this.ackRequests.set(requestId, { + type: EventType.BROADCAST, + clientCountCallback, + ack, + }); + + // we have no way to know at this level whether the server has received an acknowledgement from each client, so we + // will simply clean up the ackRequests map after the given delay + setTimeout(() => { + this.ackRequests.delete(requestId); + }, opts.flags!.timeout); + } + + // packets with binary contents are modified by the broadcast method, hence the nextTick() + process.nextTick(() => { + super.broadcastWithAck(packet, opts, clientCountCallback, ack); + }); + } + + public serverCount(): Promise { + return Promise.resolve(1 + this.workerIds.size); + } + addSockets(opts: BroadcastOptions, rooms: Room[]) { super.addSockets(opts, rooms); diff --git a/package-lock.json b/package-lock.json index 32c4580695..e6b1b2375b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,2874 @@ { "name": "@socket.io/cluster-adapter", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "@socket.io/cluster-adapter", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "debug": "~4.3.1", + "socket.io-adapter": "~2.4.0" + }, + "devDependencies": { + "@types/expect.js": "^0.3.29", + "@types/mocha": "^8.2.1", + "@types/node": "^15.12.4", + "expect.js": "0.3.1", + "mocha": "^8.4.0", + "nyc": "^15.1.0", + "prettier": "^2.1.2", + "socket.io": "^4.5.0", + "socket.io-client": "^4.1.1", + "ts-node": "^9.1.1", + "typescript": "^4.0.5" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "node_modules/@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/expect.js": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@types/expect.js/-/expect.js-0.3.29.tgz", + "integrity": "sha1-KN01kVW4S47LCUr8P0t0wyItyjs=", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "15.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", + "dev": true + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/engine.io": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.1.tgz", + "integrity": "sha512-jPFpw2HLL0lhZ2KY0BpZhIJdleQcUO9W1xkIpo0h3d6s+5D6+EV/xgQw9qWOmymszv2WXef/6KUUehyxEKomlQ==", + "dev": true, + "dependencies": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "dev": true, + "dependencies": { + "base64-arraybuffer": "0.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io/node_modules/engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "dependencies": { + "@socket.io/base64-arraybuffer": "~1.0.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/mocha/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "node_modules/parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/socket.io": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz", + "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + }, + "node_modules/socket.io-client": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.1.tgz", + "integrity": "sha512-avzRzFZIkmyNxqvhmm5ns0Itq5dgEkesDPB6Tl0Yben47U08MvdFnVXAuFDULQhDXjuYdCb6QUEILYLUKQEuGg==", + "dev": true, + "dependencies": { + "@types/component-emitter": "^1.2.10", + "backo2": "~1.0.2", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-client": "~5.1.1", + "parseuri": "0.0.6", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.10.4", @@ -242,6 +3108,12 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, "@types/component-emitter": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", @@ -249,15 +3121,15 @@ "dev": true }, "@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "@types/cors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, "@types/expect.js": { @@ -285,13 +3157,13 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "aggregate-error": { @@ -548,9 +3420,9 @@ } }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "cors": { @@ -616,18 +3488,39 @@ "dev": true }, "engine.io": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.0.tgz", - "integrity": "sha512-A2i4kVvOA3qezQLlMz+FayGFdqOo0LP3fYrb0VqXMDXKoXcbgM0KxcEYnsdVzOMJQErIAb1GIStRj7UWFoiqlQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "dev": true, "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "dependencies": { + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "requires": {} + } } }, "engine.io-client": { @@ -1191,18 +4084,18 @@ "dev": true }, "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.47.0" + "mime-db": "1.52.0" } }, "minimatch": { @@ -1398,9 +4291,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "node-preload": { @@ -1724,26 +4617,34 @@ "dev": true }, "socket.io": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.1.tgz", - "integrity": "sha512-YKPdhaYRGEXjP+VqoKlfOEPgDjm0aMq1YWonjHg4rBU1xJCmgceNh2XL1vO4czWupH+WX1+d9Wqb768h7BC5kw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz", + "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==", "dev": true, "requires": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.8", - "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "~2.0.0", - "debug": "~4.3.1", - "engine.io": "~5.1.0", - "socket.io-adapter": "~2.3.0", - "socket.io-parser": "~4.0.3" + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "socket.io-adapter": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.0.tgz", - "integrity": "sha512-jdIbSFRWOkaZpo5mXy8T7rXEN6qo3bOFuq4nVeX1ZS7AtFlkbk39y153xTXEIW7W94vZfhVOux1wTU88YxcM1w==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" }, "socket.io-client": { "version": "4.1.1", @@ -2075,7 +4976,8 @@ "version": "7.4.5", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", - "dev": true + "dev": true, + "requires": {} }, "y18n": { "version": "4.0.1", diff --git a/package.json b/package.json index 780be15ccd..7f651df5ab 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "debug": "~4.3.1", - "socket.io-adapter": "~2.3.0" + "socket.io-adapter": "~2.4.0" }, "devDependencies": { "@types/expect.js": "^0.3.29", @@ -30,7 +30,7 @@ "mocha": "^8.4.0", "nyc": "^15.1.0", "prettier": "^2.1.2", - "socket.io": "^4.1.1", + "socket.io": "^4.5.0", "socket.io-client": "^4.1.1", "ts-node": "^9.1.1", "typescript": "^4.0.5" diff --git a/test/index.ts b/test/index.ts index 39fb1fedaf..d1a33c8d94 100644 --- a/test/index.ts +++ b/test/index.ts @@ -144,6 +144,84 @@ describe("@socket.io/cluster-adapter", () => { workers[0].send("broadcasts to local clients only"); }); + + it("broadcasts with multiple acknowledgements", (done) => { + clientSockets[0].on("test", (cb) => { + cb(1); + }); + + clientSockets[1].on("test", (cb) => { + cb(2); + }); + + clientSockets[2].on("test", (cb) => { + cb(3); + }); + + workers[0].send("broadcasts with multiple acknowledgements"); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(); + } + }); + }); + + it("broadcasts with multiple acknowledgements (binary content)", (done) => { + clientSockets[0].on("test", (cb) => { + cb(Buffer.from([1])); + }); + + clientSockets[1].on("test", (cb) => { + cb(Buffer.from([2])); + }); + + clientSockets[2].on("test", (cb) => { + cb(Buffer.from([3])); + }); + + workers[0].send( + "broadcasts with multiple acknowledgements (binary content)" + ); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(); + } + }); + }); + + it("broadcasts with multiple acknowledgements (no client)", (done) => { + workers[0].send("broadcasts with multiple acknowledgements (no client)"); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(); + } + }); + }); + + it("broadcasts with multiple acknowledgements (timeout)", (done) => { + clientSockets[0].on("test", (cb) => { + cb(1); + }); + + clientSockets[1].on("test", (cb) => { + cb(2); + }); + + clientSockets[2].on("test", (cb) => { + // do nothing + }); + + workers[0].send("broadcasts with multiple acknowledgements (timeout)"); + + workers[0].on("message", (result) => { + if (result === "ok") { + done(); + } + }); + }); }); describe("socketsJoin", () => { diff --git a/test/worker.js b/test/worker.js index a42e114341..d6a2c50a14 100644 --- a/test/worker.js +++ b/test/worker.js @@ -43,6 +43,58 @@ process.on("message", async (msg) => { io.local.emit("test"); break; + case "broadcasts with multiple acknowledgements": { + io.timeout(500).emit("test", (err, responses) => { + expect(err).to.be(null); + expect(responses).to.contain(1); + expect(responses).to.contain(2); + expect(responses).to.contain(3); + + setTimeout(() => { + expect(io.of("/").adapter.ackRequests.size).to.eql(0); + + process.send("ok"); + }, 500); + }); + break; + } + + case "broadcasts with multiple acknowledgements (binary content)": { + io.timeout(500).emit("test", (err, responses) => { + expect(err).to.be(null); + responses.forEach((response) => { + expect(Buffer.isBuffer(response)).to.be(true); + }); + + process.send("ok"); + }); + break; + } + + case "broadcasts with multiple acknowledgements (no client)": { + io + .to("abc") + .timeout(500) + .emit("test", (err, responses) => { + expect(err).to.be(null); + expect(responses).to.eql([]); + + process.send("ok"); + }); + break; + } + + case "broadcasts with multiple acknowledgements (timeout)": { + io.timeout(500).emit("test", (err, responses) => { + expect(err).to.be.an(Error); + expect(responses).to.contain(1); + expect(responses).to.contain(2); + + process.send("ok"); + }); + break; + } + case "get rooms": process.send(serverSocket.rooms); break; From 43f9ee8d23d2a4bc72ce4399c0b2b8445360f8cc Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 28 Apr 2022 16:16:13 +0200 Subject: [PATCH 07/51] chore(release): 0.2.0 Diff: https://github.com/socketio/socket.io-cluster-adapter/compare/0.1.0...0.2.0 --- CHANGELOG.md | 19 +++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6c7ec503a..df0f2d48e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +# [0.2.0](https://github.com/socketio/socket.io-cluster-adapter/compare/0.1.0...0.2.0) (2022-04-28) + + +### Features + +* broadcast and expect multiple acks ([055b784](https://github.com/socketio/socket.io-cluster-adapter/commit/055b7840d8cf88173d8299041ef3fafa9791c97a)) + +This feature was added in `socket.io@4.5.0`: + +```js +io.timeout(1000).emit("some-event", (err, responses) => { + // ... +}); +``` + +Thanks to this change, it will now work within a Node.js cluster. + + + # 0.1.0 (2021-06-22) Initial commit diff --git a/package-lock.json b/package-lock.json index e6b1b2375b..d956a4ca12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.1.0", + "version": "0.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@socket.io/cluster-adapter", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT", "dependencies": { "debug": "~4.3.1", diff --git a/package.json b/package.json index 7f651df5ab..cd64459fd7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.1.0", + "version": "0.2.0", "description": "The Socket.IO cluster adapter, allowing to broadcast events between several Socket.IO servers", "license": "MIT", "repository": { From be0a0e3217bd7100d569e5624194612bcc8b96ff Mon Sep 17 00:00:00 2001 From: Rolando Andrade Date: Fri, 7 Oct 2022 13:38:39 -0400 Subject: [PATCH 08/51] fix: properly handle ERR_IPC_CHANNEL_CLOSED errors (#6) Related: https://github.com/socketio/socket.io-cluster-adapter/issues/5 --- lib/index.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 21101b4e54..3452ba4abe 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -51,6 +51,8 @@ export interface ClusterAdapterOptions { requestsTimeout: number; } +function ignoreError() {} + /** * Returns a function that will create a ClusterAdapter instance. * @@ -295,7 +297,7 @@ export class ClusterAdapter extends Adapter { message.nsp ); - process.send(message); + process.send(message, null, { swallowErrors: true }, ignoreError); } /** @@ -559,7 +561,7 @@ export function setupPrimary() { const workerId = message.data.workerId; // emit back to the requester if (hasOwnProperty.call(cluster.workers, workerId)) { - cluster.workers[workerId].send(message); + cluster.workers[workerId].send(message, null, ignoreError); } break; default: @@ -570,7 +572,7 @@ export function setupPrimary() { hasOwnProperty.call(cluster.workers, workerId) && workerId !== emitterIdAsString ) { - cluster.workers[workerId].send(message); + cluster.workers[workerId].send(message, null, ignoreError); } } } @@ -580,11 +582,15 @@ export function setupPrimary() { // notify all active workers for (const workerId in cluster.workers) { if (hasOwnProperty.call(cluster.workers, workerId)) { - cluster.workers[workerId].send({ - source: MESSAGE_SOURCE, - type: EventType.WORKER_EXIT, - data: worker.id, - }); + cluster.workers[workerId].send( + { + source: MESSAGE_SOURCE, + type: EventType.WORKER_EXIT, + data: worker.id, + }, + null, + ignoreError + ); } } }); From 66b40799539a52bead1a14684ec428102b6dafb8 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 13 Oct 2022 09:15:34 +0200 Subject: [PATCH 09/51] ci: add Node.js 18 in the test matrix Reference: https://github.com/nodejs/Release --- .github/workflows/ci.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 544577492b..2c6e6c89dd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,18 +12,24 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 16.x] + node-version: + - 14 + - 18 steps: - - uses: actions/checkout@v2 + - name: Checkout repository + uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - - run: npm ci + - name: Install dependencies + run: npm ci - - run: npm test + - name: Run tests + run: npm test env: CI: true timeout-minutes: 10 From a5a1c2908277ed1d747c041dfcac0b0485a96a20 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 13 Oct 2022 09:17:46 +0200 Subject: [PATCH 10/51] chore: update dev dependencies --- package-lock.json | 620 ++++++++++++++++------------------------------ package.json | 4 +- 2 files changed, 221 insertions(+), 403 deletions(-) diff --git a/package-lock.json b/package-lock.json index d956a4ca12..b066150768 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,10 +14,10 @@ }, "devDependencies": { "@types/expect.js": "^0.3.29", - "@types/mocha": "^8.2.1", + "@types/mocha": "^10.0.0", "@types/node": "^15.12.4", "expect.js": "0.3.1", - "mocha": "^8.4.0", + "mocha": "^10.0.0", "nyc": "^15.1.0", "prettier": "^2.1.2", "socket.io": "^4.5.0", @@ -321,9 +321,9 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", "dev": true }, "node_modules/@types/node": { @@ -374,9 +374,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -573,24 +573,30 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/clean-stack": { @@ -698,9 +704,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -1013,9 +1019,9 @@ } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -1059,15 +1065,6 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1187,7 +1184,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1203,9 +1200,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -1247,6 +1244,18 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -1433,12 +1442,6 @@ "node": ">=6" } }, - "node_modules/json5/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -1464,15 +1467,19 @@ "dev": true }, "node_modules/log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "dependencies": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-symbols/node_modules/ansi-styles": { @@ -1491,9 +1498,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -1590,44 +1597,50 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 10.12.0" + "node": ">= 14.0.0" }, "funding": { "type": "opencollective", @@ -1655,6 +1668,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/mocha/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1713,9 +1735,9 @@ } }, "node_modules/mocha/node_modules/js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -1739,6 +1761,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1834,9 +1868,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -1916,26 +1950,6 @@ "node": ">=8.9" } }, - "node_modules/nyc/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2057,15 +2071,15 @@ } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -2120,9 +2134,9 @@ } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" @@ -2195,26 +2209,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2231,9 +2225,9 @@ } }, "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -2326,23 +2320,6 @@ "node": ">=10.0.0" } }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -2470,26 +2447,6 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -2617,62 +2574,10 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { @@ -2741,9 +2646,9 @@ } }, "node_modules/ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, "engines": { "node": ">=8.3.0" @@ -3139,9 +3044,9 @@ "dev": true }, "@types/mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", "dev": true }, "@types/node": { @@ -3183,9 +3088,9 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -3345,19 +3250,19 @@ } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "clean-stack": { @@ -3453,9 +3358,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -3669,9 +3574,9 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3703,12 +3608,6 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3801,7 +3700,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -3811,9 +3710,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -3843,6 +3742,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3983,14 +3888,6 @@ "dev": true, "requires": { "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "locate-path": { @@ -4015,12 +3912,13 @@ "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "ansi-styles": { @@ -4033,9 +3931,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4107,34 +4005,37 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, "mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -4155,6 +4056,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -4198,9 +4108,9 @@ } }, "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { "argparse": "^2.0.1" @@ -4215,6 +4125,15 @@ "p-locate": "^5.0.0" } }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4285,9 +4204,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "negotiator": { @@ -4344,22 +4263,6 @@ "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", "yargs": "^15.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "object-assign": { @@ -4453,15 +4356,15 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pkg-dir": { @@ -4498,9 +4401,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -4550,22 +4453,6 @@ "dev": true, "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "safe-buffer": { @@ -4581,9 +4468,9 @@ "dev": true }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -4628,17 +4515,6 @@ "engine.io": "~6.2.0", "socket.io-adapter": "~2.4.0", "socket.io-parser": "~4.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } } }, "socket.io-adapter": { @@ -4766,22 +4642,6 @@ "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "to-fast-properties": { @@ -4869,52 +4729,10 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "wrap-ansi": { @@ -4973,9 +4791,9 @@ } }, "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index cd64459fd7..e36ffb2e9b 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,10 @@ }, "devDependencies": { "@types/expect.js": "^0.3.29", - "@types/mocha": "^8.2.1", + "@types/mocha": "^10.0.0", "@types/node": "^15.12.4", "expect.js": "0.3.1", - "mocha": "^8.4.0", + "mocha": "^10.0.0", "nyc": "^15.1.0", "prettier": "^2.1.2", "socket.io": "^4.5.0", From fe840e2eb3f4f207c80321bd0d07defc86cbcd8d Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 13 Oct 2022 09:23:36 +0200 Subject: [PATCH 11/51] chore(release): 0.2.1 Diff: https://github.com/socketio/socket.io-cluster-adapter/compare/0.2.0...0.2.1 --- CHANGELOG.md | 17 +++++++++++++++++ package.json | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df0f2d48e0..44505ed752 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +# Releases + +- [0.2.1](#021-2022-10-13) (2022-10-13) +- [0.2.0](#020-2022-04-28) (2022-04-28) +- [0.1.0](#010-2021-06-22) (2021-06-22) + + + +## [0.2.1](https://github.com/socketio/socket.io-cluster-adapter/compare/0.2.0...0.2.1) (2022-10-13) + + +### Bug Fixes + +* properly handle ERR_IPC_CHANNEL_CLOSED errors ([#6](https://github.com/socketio/socket.io-cluster-adapter/issues/6)) ([be0a0e3](https://github.com/socketio/socket.io-cluster-adapter/commit/be0a0e3217bd7100d569e5624194612bcc8b96ff)) + + + # [0.2.0](https://github.com/socketio/socket.io-cluster-adapter/compare/0.1.0...0.2.0) (2022-04-28) diff --git a/package.json b/package.json index e36ffb2e9b..140508cdc8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.2.0", + "version": "0.2.1", "description": "The Socket.IO cluster adapter, allowing to broadcast events between several Socket.IO servers", "license": "MIT", "repository": { From e86ef45f87d81d78bf289d1b5e6fd87ac286e617 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 24 Mar 2023 17:16:25 +0100 Subject: [PATCH 12/51] ci: upgrade to actions/checkout@3 and actions/setup-node@3 Reference: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/ --- .github/workflows/ci.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c6e6c89dd..cc4bc76b89 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,7 @@ on: jobs: test-node: runs-on: ubuntu-latest + timeout-minutes: 10 strategy: matrix: @@ -18,10 +19,10 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -30,6 +31,3 @@ jobs: - name: Run tests run: npm test - env: - CI: true - timeout-minutes: 10 From 15fd56e78d52aa65c5fbf412dec57ab4bdaee7cc Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 24 Mar 2023 17:19:42 +0100 Subject: [PATCH 13/51] chore: add socket.io-parser to peerDependencies This should (at least in theory) fix sync issues for the `socket.io-adapter` package, which is imported by both the `socket.io` and `@socket.io/cluster-adapter` packages: - `socket.io@4.5.0` should resolve `socket.io-adapter@~2.4.0` - `socket.io@4.6.0` should resolve `socket.io-adapter@~2.5.0` --- package-lock.json | 206 +++++++++++++++++++++++++++++----------------- package.json | 8 +- 2 files changed, 137 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index b066150768..ad19a36b25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,15 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@socket.io/cluster-adapter", - "version": "0.2.0", + "version": "0.2.1", "license": "MIT", "dependencies": { - "debug": "~4.3.1", - "socket.io-adapter": "~2.4.0" + "debug": "~4.3.1" }, "devDependencies": { "@types/expect.js": "^0.3.29", @@ -20,13 +19,16 @@ "mocha": "^10.0.0", "nyc": "^15.1.0", "prettier": "^2.1.2", - "socket.io": "^4.5.0", + "socket.io": "^4.6.1", "socket.io-client": "^4.1.1", "ts-node": "^9.1.1", "typescript": "^4.0.5" }, "engines": { "node": ">=10.0.0" + }, + "peerDependencies": { + "socket.io-adapter": "^2.4.0" } }, "node_modules/@babel/code-frame": { @@ -287,14 +289,11 @@ "node": ">=8" } }, - "node_modules/@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true }, "node_modules/@types/component-emitter": { "version": "1.2.10", @@ -309,10 +308,13 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/expect.js": { "version": "0.3.29", @@ -756,9 +758,9 @@ "dev": true }, "node_modules/engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -770,7 +772,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" }, "engines": { "node": ">=10.0.0" @@ -806,21 +808,18 @@ } }, "node_modules/engine.io/node_modules/engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", "dev": true, - "dependencies": { - "@socket.io/base64-arraybuffer": "~1.0.2" - }, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -1953,7 +1952,7 @@ "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2267,26 +2266,49 @@ "dev": true }, "node_modules/socket.io": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz", - "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.0.4" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/socket.io-client": { "version": "4.1.1", @@ -2320,6 +2342,19 @@ "node": ">=10.0.0" } }, + "node_modules/socket.io/node_modules/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -2547,7 +2582,7 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "engines": { "node": ">= 0.8" @@ -3013,10 +3048,10 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, "@types/component-emitter": { @@ -3032,10 +3067,13 @@ "dev": true }, "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/expect.js": { "version": "0.3.29", @@ -3393,9 +3431,9 @@ "dev": true }, "engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -3407,22 +3445,19 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" }, "dependencies": { "engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", - "dev": true, - "requires": { - "@socket.io/base64-arraybuffer": "~1.0.2" - } + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "dev": true }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "requires": {} } @@ -4268,7 +4303,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, "once": { @@ -4504,23 +4539,46 @@ "dev": true }, "socket.io": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz", - "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.0.4" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "dependencies": { + "socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + } } }, "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } }, "socket.io-client": { "version": "4.1.1", @@ -4711,7 +4769,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "which": { diff --git a/package.json b/package.json index 140508cdc8..eaa72f2087 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,10 @@ "prepack": "tsc" }, "dependencies": { - "debug": "~4.3.1", - "socket.io-adapter": "~2.4.0" + "debug": "~4.3.1" + }, + "peerDependencies": { + "socket.io-adapter": "^2.4.0" }, "devDependencies": { "@types/expect.js": "^0.3.29", @@ -30,7 +32,7 @@ "mocha": "^10.0.0", "nyc": "^15.1.0", "prettier": "^2.1.2", - "socket.io": "^4.5.0", + "socket.io": "^4.6.1", "socket.io-client": "^4.1.1", "ts-node": "^9.1.1", "typescript": "^4.0.5" From cddb78e5fab3178c9956c72063aa26f418e710af Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 24 Mar 2023 17:32:35 +0100 Subject: [PATCH 14/51] chore(release): 0.2.2 Diff: https://github.com/socketio/socket.io-cluster-adapter/compare/0.2.1...0.2.2 --- CHANGELOG.md | 23 +++++++++++++++++------ package.json | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44505ed752..d8a0487726 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,19 @@ -# Releases +# History -- [0.2.1](#021-2022-10-13) (2022-10-13) -- [0.2.0](#020-2022-04-28) (2022-04-28) -- [0.1.0](#010-2021-06-22) (2021-06-22) +- [0.2.2](#022-2023-03-24) (Mar 2023) +- [0.2.1](#021-2022-10-13) (Oct 2022) +- [0.2.0](#020-2022-04-28) (Apr 2022) +- [0.1.0](#010-2021-06-22) (Jun 2021) + + + +# Release notes + +## [0.2.2](https://github.com/socketio/socket.io-cluster-adapter/compare/0.2.1...0.2.2) (2023-03-24) + +The `socket.io-adapter` package was added to the list of `peerDependencies`, in order to fix sync issues with the version imported by the socket.io package (see [15fd56e](https://github.com/socketio/socket.io-cluster-adapter/commit/15fd56e78d52aa65c5fbf412dec57ab4bdaee7cc)). + +Support for connection state recovery (see [here](https://github.com/socketio/socket.io/releases/4.6.0)) will be added in the next release. @@ -15,7 +26,7 @@ -# [0.2.0](https://github.com/socketio/socket.io-cluster-adapter/compare/0.1.0...0.2.0) (2022-04-28) +## [0.2.0](https://github.com/socketio/socket.io-cluster-adapter/compare/0.1.0...0.2.0) (2022-04-28) ### Features @@ -34,7 +45,7 @@ Thanks to this change, it will now work within a Node.js cluster. -# 0.1.0 (2021-06-22) +## 0.1.0 (2021-06-22) Initial commit diff --git a/package.json b/package.json index eaa72f2087..c1f02c9452 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.2.1", + "version": "0.2.2", "description": "The Socket.IO cluster adapter, allowing to broadcast events between several Socket.IO servers", "license": "MIT", "repository": { From a529eb08d6ecdf0e70bb5361c01245518ee784eb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 9 Jul 2023 10:03:32 +0200 Subject: [PATCH 15/51] chore: bump dev dependencies --- package-lock.json | 1514 +++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 771 insertions(+), 745 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad19a36b25..5fbba983ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@socket.io/cluster-adapter", - "version": "0.2.1", + "version": "0.2.2", "license": "MIT", "dependencies": { "debug": "~4.3.1" @@ -20,7 +20,7 @@ "nyc": "^15.1.0", "prettier": "^2.1.2", "socket.io": "^4.6.1", - "socket.io-client": "^4.1.1", + "socket.io-client": "^4.7.1", "ts-node": "^9.1.1", "typescript": "^4.0.5" }, @@ -31,37 +31,61 @@ "socket.io-adapter": "^2.4.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" }, "engines": { "node": ">=6.9.0" @@ -71,152 +95,188 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/@babel/generator": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "dependencies": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/types": "^7.10.4" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, - "dependencies": { - "@babel/types": "^7.12.1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.11.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -226,42 +286,52 @@ } }, "node_modules/@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@istanbuljs/load-nyc-config": { @@ -289,18 +359,75 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, - "node_modules/@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", - "dev": true - }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -442,27 +569,12 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -509,6 +621,38 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -539,6 +683,26 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -556,7 +720,7 @@ "node_modules/chalk/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -633,7 +797,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/commondir": { @@ -642,12 +806,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -751,6 +909,12 @@ "node": ">=0.3.1" } }, + "node_modules/electron-to-chromium": { + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "dev": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -758,9 +922,9 @@ "dev": true }, "node_modules/engine.io": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", - "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -779,32 +943,25 @@ } }, "node_modules/engine.io-client": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.1.tgz", - "integrity": "sha512-jPFpw2HLL0lhZ2KY0BpZhIJdleQcUO9W1xkIpo0h3d6s+5D6+EV/xgQw9qWOmymszv2WXef/6KUUehyxEKomlQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.1.tgz", + "integrity": "sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng==", "dev": true, "dependencies": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "yeast": "0.1.2" + "engine.io-parser": "~5.1.0", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" } }, "node_modules/engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", + "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", "dev": true, - "dependencies": { - "base64-arraybuffer": "0.1.4" - }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/engine.io-parser": { @@ -816,27 +973,6 @@ "node": ">=10.0.0" } }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -855,7 +991,7 @@ "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -893,9 +1029,9 @@ } }, "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { "commondir": "^1.0.1", @@ -984,12 +1120,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -1064,24 +1194,6 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1168,18 +1280,6 @@ "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1271,9 +1371,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" @@ -1307,18 +1407,17 @@ } }, "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "dependencies": { "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", - "uuid": "^3.3.3" + "uuid": "^8.3.2" }, "engines": { "node": ">=8" @@ -1338,15 +1437,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1383,9 +1473,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -1427,13 +1517,10 @@ } }, "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -1453,12 +1540,6 @@ "node": ">=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -1542,6 +1623,15 @@ "node": ">=8" } }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -1585,9 +1675,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -1596,15 +1686,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", @@ -1899,6 +1980,12 @@ "node": ">=8" } }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2030,18 +2117,6 @@ "node": ">=8" } }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2069,10 +2144,10 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "node_modules/picomatch": { @@ -2171,19 +2246,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -2290,62 +2352,25 @@ "ws": "~8.11.0" } }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/socket.io-client": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.1.tgz", - "integrity": "sha512-avzRzFZIkmyNxqvhmm5ns0Itq5dgEkesDPB6Tl0Yben47U08MvdFnVXAuFDULQhDXjuYdCb6QUEILYLUKQEuGg==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.1.tgz", + "integrity": "sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w==", "dev": true, "dependencies": { - "@types/component-emitter": "^1.2.10", - "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~5.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.1", + "socket.io-parser": "~4.2.4" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", - "dev": true, - "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io/node_modules/socket.io-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", - "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -2355,15 +2380,6 @@ "node": ">=10.0.0" } }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", @@ -2485,7 +2501,7 @@ "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" @@ -2569,14 +2585,43 @@ "node": ">=4.2.0" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/vary": { @@ -2681,12 +2726,11 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -2701,12 +2745,27 @@ } } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", @@ -2781,12 +2840,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -2810,222 +2863,230 @@ } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.22.5" } }, + "@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "dev": true + }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" } }, "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" } }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" } }, @@ -3048,18 +3109,65 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true + }, "@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, - "@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", - "dev": true - }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -3180,24 +3288,12 @@ "sprintf-js": "~1.0.2" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -3235,6 +3331,18 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -3259,6 +3367,12 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3273,7 +3387,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { @@ -3332,7 +3446,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "commondir": { @@ -3341,12 +3455,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3424,6 +3532,12 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "electron-to-chromium": { + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3431,9 +3545,9 @@ "dev": true }, "engine.io": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", - "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -3453,41 +3567,27 @@ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", "dev": true - }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "requires": {} } } }, "engine.io-client": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.1.tgz", - "integrity": "sha512-jPFpw2HLL0lhZ2KY0BpZhIJdleQcUO9W1xkIpo0h3d6s+5D6+EV/xgQw9qWOmymszv2WXef/6KUUehyxEKomlQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.1.tgz", + "integrity": "sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng==", "dev": true, "requires": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "yeast": "0.1.2" + "engine.io-parser": "~5.1.0", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" } }, "engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", - "dev": true, - "requires": { - "base64-arraybuffer": "0.1.4" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", + "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", + "dev": true }, "es6-error": { "version": "4.1.1", @@ -3504,7 +3604,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "esprima": { @@ -3529,9 +3629,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -3584,12 +3684,6 @@ "dev": true, "optional": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3643,21 +3737,6 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3723,15 +3802,6 @@ "binary-extensions": "^2.0.0" } }, - "is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3796,9 +3866,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-hook": { @@ -3823,18 +3893,17 @@ } }, "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "requires": { "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", - "uuid": "^3.3.3" + "uuid": "^8.3.2" } }, "istanbul-lib-report": { @@ -3848,12 +3917,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3885,9 +3948,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -3917,13 +3980,10 @@ "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "locate-path": { "version": "5.0.0", @@ -3934,12 +3994,6 @@ "p-locate": "^4.1.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -4001,6 +4055,15 @@ } } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -4032,20 +4095,14 @@ } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, "mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", @@ -4259,6 +4316,12 @@ "process-on-spawn": "^1.0.0" } }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4360,18 +4423,6 @@ "release-zalgo": "^1.0.0" } }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4390,10 +4441,10 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { @@ -4465,16 +4516,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -4550,18 +4591,6 @@ "engine.io": "~6.4.1", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.1" - }, - "dependencies": { - "socket.io-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", - "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - } } }, "socket.io-adapter": { @@ -4570,48 +4599,30 @@ "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", "requires": { "ws": "~8.11.0" - }, - "dependencies": { - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} - } } }, "socket.io-client": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.1.tgz", - "integrity": "sha512-avzRzFZIkmyNxqvhmm5ns0Itq5dgEkesDPB6Tl0Yben47U08MvdFnVXAuFDULQhDXjuYdCb6QUEILYLUKQEuGg==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.1.tgz", + "integrity": "sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w==", "dev": true, "requires": { - "@types/component-emitter": "^1.2.10", - "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~5.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.1", + "socket.io-parser": "~4.2.4" } }, "socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, "source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", @@ -4705,7 +4716,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { @@ -4760,10 +4771,20 @@ "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "vary": { @@ -4849,18 +4870,29 @@ } }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "requires": {} }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true + }, "y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", @@ -4916,12 +4948,6 @@ } } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index c1f02c9452..83e4916e74 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "nyc": "^15.1.0", "prettier": "^2.1.2", "socket.io": "^4.6.1", - "socket.io-client": "^4.1.1", + "socket.io-client": "^4.7.1", "ts-node": "^9.1.1", "typescript": "^4.0.5" }, From 683720a67d88618f5de1010c8f06c1c78695169e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 9 Jul 2023 09:59:24 +0200 Subject: [PATCH 16/51] test: fix flaky test --- test/index.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/index.ts b/test/index.ts index d1a33c8d94..ac5fb29a53 100644 --- a/test/index.ts +++ b/test/index.ts @@ -37,15 +37,16 @@ describe("@socket.io/cluster-adapter", () => { PORT, }); - const clientSocket = ioc(`http://localhost:${PORT}`); - clientSocket.on("connect", async () => { - workers.push(worker); - clientSockets.push(clientSocket); - if (clientSockets.length === NODES_COUNT) { - await sleep(100); - - done(); - } + worker.on("listening", () => { + const clientSocket = ioc(`http://localhost:${PORT}`); + + clientSocket.on("connect", async () => { + workers.push(worker); + clientSockets.push(clientSocket); + if (clientSockets.length === NODES_COUNT) { + done(); + } + }); }); } }); From 56a53bceb9a0f3032c68e9a9ae63643423890cb1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sun, 9 Jul 2023 09:59:47 +0200 Subject: [PATCH 17/51] ci: add Node.js 20 in the test matrix --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc4bc76b89..a035af4d6d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,8 +14,8 @@ jobs: strategy: matrix: node-version: - - 14 - - 18 + - 12 + - 20 steps: - name: Checkout repository From 7427109658591e7ce677a183a664d1f5327f37ea Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 21 Nov 2024 08:52:37 +0100 Subject: [PATCH 18/51] refactor(eio): bump cookie to version 1.0.2 Release notes: https://github.com/jshttp/cookie/releases/tag/v1.0.0 The types are now included in the npm package. The `CookieSerializeOptions` type, which is used in our `ServerOptions` type, has been renamed to `SerializeOptions`, but there are no breaking change. Related: https://github.com/socketio/socket.io/issues/5231 --- package-lock.json | 22 ++++++++-------------- packages/engine.io/lib/server.ts | 4 ++-- packages/engine.io/package.json | 3 +-- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index f0b8ca918d..c46fc4801b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2823,11 +2823,6 @@ "@types/responselike": "^1.0.0" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", @@ -5761,11 +5756,11 @@ "dev": true }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "engines": { - "node": ">= 0.6" + "node": ">=18" } }, "node_modules/cookie-signature": { @@ -15514,12 +15509,11 @@ "version": "6.6.2", "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.7.2", + "cookie": "~1.0.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -15530,7 +15524,7 @@ } }, "packages/engine.io-client": { - "version": "6.6.1", + "version": "6.6.2", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -15572,7 +15566,7 @@ } }, "packages/socket.io": { - "version": "4.8.0", + "version": "4.8.1", "license": "MIT", "dependencies": { "accepts": "~1.3.4", @@ -15596,7 +15590,7 @@ } }, "packages/socket.io-client": { - "version": "4.8.0", + "version": "4.8.1", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", diff --git a/packages/engine.io/lib/server.ts b/packages/engine.io/lib/server.ts index 0e3ae063ef..b3c708eed2 100644 --- a/packages/engine.io/lib/server.ts +++ b/packages/engine.io/lib/server.ts @@ -6,13 +6,13 @@ import { EventEmitter } from "events"; import { Socket } from "./socket"; import debugModule from "debug"; import { serialize } from "cookie"; +import type { SerializeOptions } from "cookie"; import { Server as DEFAULT_WS_ENGINE } from "ws"; import type { IncomingMessage, Server as HttpServer, ServerResponse, } from "http"; -import type { CookieSerializeOptions } from "cookie"; import type { CorsOptions, CorsOptionsDelegate } from "cors"; import type { Duplex } from "stream"; import { WebTransport } from "./transports/webtransport"; @@ -123,7 +123,7 @@ export interface ServerOptions { * might be used for sticky-session. Defaults to not sending any cookie. * @default false */ - cookie?: (CookieSerializeOptions & { name: string }) | boolean; + cookie?: (SerializeOptions & { name: string }) | boolean; /** * the options that will be forwarded to the cors module */ diff --git a/packages/engine.io/package.json b/packages/engine.io/package.json index 6c126c6b71..c7b3bb154f 100644 --- a/packages/engine.io/package.json +++ b/packages/engine.io/package.json @@ -31,12 +31,11 @@ ], "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.7.2", + "cookie": "~1.0.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", From 7fcddcb3bbd236b46aa8fee6f4ce6c45afb7b03a Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 7 Jan 2025 01:53:32 -0800 Subject: [PATCH 19/51] fix(engine.io-client): correctly consume the `ws` package (#5220) This should fix the following issue: ``` SyntaxError: Named export 'WebSocket' not found. The requested module 'ws' is a CommonJS module, which may not support all module.exports as named exports. CommonJS modules can always be imported via the default export, for example using: import pkg from 'ws'; const { WebSocket } = pkg; ``` --- packages/engine.io-client/lib/transports/websocket.node.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/engine.io-client/lib/transports/websocket.node.ts b/packages/engine.io-client/lib/transports/websocket.node.ts index 83777991c1..c587cceb73 100644 --- a/packages/engine.io-client/lib/transports/websocket.node.ts +++ b/packages/engine.io-client/lib/transports/websocket.node.ts @@ -1,4 +1,4 @@ -import { WebSocket } from "ws"; +import * as ws from "ws"; import type { Packet, RawData } from "engine.io-parser"; import { BaseWS } from "./websocket.js"; @@ -27,7 +27,7 @@ export class WS extends BaseWS { opts.headers.cookie.push(`${name}=${cookie.value}`); } } - return new WebSocket(uri, protocols, opts); + return new ws.WebSocket(uri, protocols, opts); } doWrite(packet: Packet, data: RawData) { From bfa6eab19574bc50ec64a45d6f99ad3a0c985ff7 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 23 Jan 2025 07:38:37 +0100 Subject: [PATCH 20/51] chore(release): engine.io-client@6.6.3 Diff: https://github.com/socketio/socket.io/compare/engine.io-client@6.6.2...engine.io-client@6.6.3 --- packages/engine.io-client/CHANGELOG.md | 15 +++++++++++++++ .../engine.io-client/dist/engine.io.esm.min.js | 4 ++-- packages/engine.io-client/dist/engine.io.js | 4 ++-- packages/engine.io-client/dist/engine.io.min.js | 4 ++-- packages/engine.io-client/package.json | 2 +- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/engine.io-client/CHANGELOG.md b/packages/engine.io-client/CHANGELOG.md index 2a090dcb18..3553b84b62 100644 --- a/packages/engine.io-client/CHANGELOG.md +++ b/packages/engine.io-client/CHANGELOG.md @@ -2,6 +2,7 @@ | Version | Release date | Bundle size (UMD min+gzip) | |-------------------------------------------------------------------------------------------------------------|----------------|----------------------------| +| [6.6.3](#663-2025-01-23) | January 2025 | `8.7 KB` | | [6.6.2](#662-2024-10-23) | October 2024 | `8.7 KB` | | [6.6.1](#661-2024-09-21) | September 2024 | `8.7 KB` | | [6.6.0](#660-2024-06-21) | June 2024 | `8.6 KB` | @@ -40,6 +41,20 @@ # Release notes +## [6.6.3](https://github.com/socketio/socket.io/compare/engine.io-client@6.6.2...engine.io-client@6.6.3) (2025-01-23) + + +### Bug Fixes + +* correctly consume the `ws` package ([#5220](https://github.com/socketio/socket.io/issues/5220)) ([7fcddcb](https://github.com/socketio/socket.io/commit/7fcddcb3bbd236b46aa8fee6f4ce6c45afb7b03a)) + + +### Dependencies + +- [`ws@~8.17.1`](https://github.com/websockets/ws/releases/tag/8.17.1) (no change) + + + ## [6.6.2](https://github.com/socketio/socket.io/compare/engine.io-client@6.6.1...engine.io-client@6.6.2) (2024-10-23) diff --git a/packages/engine.io-client/dist/engine.io.esm.min.js b/packages/engine.io-client/dist/engine.io.esm.min.js index a37741a87e..4dc071a834 100644 --- a/packages/engine.io-client/dist/engine.io.esm.min.js +++ b/packages/engine.io-client/dist/engine.io.esm.min.js @@ -1,6 +1,6 @@ /*! - * Engine.IO v6.6.2 - * (c) 2014-2024 Guillermo Rauch + * Engine.IO v6.6.3 + * (c) 2014-2025 Guillermo Rauch * Released under the MIT License. */ const t=Object.create(null);t.open="0",t.close="1",t.ping="2",t.pong="3",t.message="4",t.upgrade="5",t.noop="6";const s=Object.create(null);Object.keys(t).forEach((e=>{s[t[e]]=e}));const e={type:"error",data:"parser error"},i="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),n="function"==typeof ArrayBuffer,r=t=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer instanceof ArrayBuffer,o=({type:s,data:e},o,c)=>i&&e instanceof Blob?o?c(e):h(e,c):n&&(e instanceof ArrayBuffer||r(e))?o?c(e):h(new Blob([e]),c):c(t[s]+(e||"")),h=(t,s)=>{const e=new FileReader;return e.onload=function(){const t=e.result.split(",")[1];s("b"+(t||""))},e.readAsDataURL(t)};function c(t){return t instanceof Uint8Array?t:t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}let a;const u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f="undefined"==typeof Uint8Array?[]:new Uint8Array(256);for(let t=0;t<64;t++)f[u.charCodeAt(t)]=t;const l="function"==typeof ArrayBuffer,p=(t,i)=>{if("string"!=typeof t)return{type:"message",data:y(t,i)};const n=t.charAt(0);if("b"===n)return{type:"message",data:d(t.substring(1),i)};return s[n]?t.length>1?{type:s[n],data:t.substring(1)}:{type:s[n]}:e},d=(t,s)=>{if(l){const e=(t=>{let s,e,i,n,r,o=.75*t.length,h=t.length,c=0;"="===t[t.length-1]&&(o--,"="===t[t.length-2]&&o--);const a=new ArrayBuffer(o),u=new Uint8Array(a);for(s=0;s>4,u[c++]=(15&i)<<4|n>>2,u[c++]=(3&n)<<6|63&r;return a})(t);return y(e,s)}return{base64:!0,data:t}},y=(t,s)=>"blob"===s?t instanceof Blob?t:new Blob([t]):t instanceof ArrayBuffer?t:t.buffer,g=String.fromCharCode(30);function w(){return new TransformStream({transform(t,s){!function(t,s){i&&t.data instanceof Blob?t.data.arrayBuffer().then(c).then(s):n&&(t.data instanceof ArrayBuffer||r(t.data))?s(c(t.data)):o(t,!1,(t=>{a||(a=new TextEncoder),s(a.encode(t))}))}(t,(e=>{const i=e.length;let n;if(i<126)n=new Uint8Array(1),new DataView(n.buffer).setUint8(0,i);else if(i<65536){n=new Uint8Array(3);const t=new DataView(n.buffer);t.setUint8(0,126),t.setUint16(1,i)}else{n=new Uint8Array(9);const t=new DataView(n.buffer);t.setUint8(0,127),t.setBigUint64(1,BigInt(i))}t.data&&"string"!=typeof t.data&&(n[0]|=128),s.enqueue(n),s.enqueue(e)}))}})}let b;function m(t){return t.reduce(((t,s)=>t+s.length),0)}function v(t,s){if(t[0].length===s)return t.shift();const e=new Uint8Array(s);let i=0;for(let n=0;nPromise.resolve().then(t):(t,s)=>s(t,0),E="undefined"!=typeof self?self:"undefined"!=typeof window?window:Function("return this")();function A(t,...s){return s.reduce(((s,e)=>(t.hasOwnProperty(e)&&(s[e]=t[e]),s)),{})}const U=E.setTimeout,B=E.clearTimeout;function O(t,s){s.useNativeTimers?(t.setTimeoutFn=U.bind(E),t.clearTimeoutFn=B.bind(E)):(t.setTimeoutFn=E.setTimeout.bind(E),t.clearTimeoutFn=E.clearTimeout.bind(E))}function T(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}class _ extends Error{constructor(t,s,e){super(t),this.description=s,this.context=e,this.type="TransportError"}}class C extends k{constructor(t){super(),this.writable=!1,O(this,t),this.opts=t,this.query=t.query,this.socket=t.socket,this.supportsBinary=!t.forceBase64}onError(t,s,e){return super.emitReserved("error",new _(t,s,e)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return"opening"!==this.readyState&&"open"!==this.readyState||(this.doClose(),this.onClose()),this}send(t){"open"===this.readyState&&this.write(t)}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(t){const s=p(t,this.socket.binaryType);this.onPacket(s)}onPacket(t){super.emitReserved("packet",t)}onClose(t){this.readyState="closed",super.emitReserved("close",t)}pause(t){}createUri(t,s={}){return t+"://"+this.i()+this.o()+this.opts.path+this.h(s)}i(){const t=this.opts.hostname;return-1===t.indexOf(":")?t:"["+t+"]"}o(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}h(t){const s=function(t){let s="";for(let e in t)t.hasOwnProperty(e)&&(s.length&&(s+="&"),s+=encodeURIComponent(e)+"="+encodeURIComponent(t[e]));return s}(t);return s.length?"?"+s:""}}class P extends C{constructor(){super(...arguments),this.u=!1}get name(){return"polling"}doOpen(){this.l()}pause(t){this.readyState="pausing";const s=()=>{this.readyState="paused",t()};if(this.u||!this.writable){let t=0;this.u&&(t++,this.once("pollComplete",(function(){--t||s()}))),this.writable||(t++,this.once("drain",(function(){--t||s()})))}else s()}l(){this.u=!0,this.doPoll(),this.emitReserved("poll")}onData(t){((t,s)=>{const e=t.split(g),i=[];for(let t=0;t{if("opening"===this.readyState&&"open"===t.type&&this.onOpen(),"close"===t.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(t)})),"closed"!==this.readyState&&(this.u=!1,this.emitReserved("pollComplete"),"open"===this.readyState&&this.l())}doClose(){const t=()=>{this.write([{type:"close"}])};"open"===this.readyState?t():this.once("open",t)}write(t){this.writable=!1,((t,s)=>{const e=t.length,i=new Array(e);let n=0;t.forEach(((t,r)=>{o(t,!1,(t=>{i[r]=t,++n===e&&s(i.join(g))}))}))})(t,(t=>{this.doWrite(t,(()=>{this.writable=!0,this.emitReserved("drain")}))}))}uri(){const t=this.opts.secure?"https":"http",s=this.query||{};return!1!==this.opts.timestampRequests&&(s[this.opts.timestampParam]=T()),this.supportsBinary||s.sid||(s.b64=1),this.createUri(t,s)}}let j=!1;try{j="undefined"!=typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(t){}const D=j;function L(){}class M extends P{constructor(t){if(super(t),"undefined"!=typeof location){const s="https:"===location.protocol;let e=location.port;e||(e=s?"443":"80"),this.xd="undefined"!=typeof location&&t.hostname!==location.hostname||e!==t.port}}doWrite(t,s){const e=this.request({method:"POST",data:t});e.on("success",s),e.on("error",((t,s)=>{this.onError("xhr post error",t,s)}))}doPoll(){const t=this.request();t.on("data",this.onData.bind(this)),t.on("error",((t,s)=>{this.onError("xhr poll error",t,s)})),this.pollXhr=t}}class S extends k{constructor(t,s,e){super(),this.createRequest=t,O(this,e),this.p=e,this.m=e.method||"GET",this.v=s,this.k=void 0!==e.data?e.data:null,this.A()}A(){var t;const s=A(this.p,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");s.xdomain=!!this.p.xd;const e=this.U=this.createRequest(s);try{e.open(this.m,this.v,!0);try{if(this.p.extraHeaders){e.setDisableHeaderCheck&&e.setDisableHeaderCheck(!0);for(let t in this.p.extraHeaders)this.p.extraHeaders.hasOwnProperty(t)&&e.setRequestHeader(t,this.p.extraHeaders[t])}}catch(t){}if("POST"===this.m)try{e.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{e.setRequestHeader("Accept","*/*")}catch(t){}null===(t=this.p.cookieJar)||void 0===t||t.addCookies(e),"withCredentials"in e&&(e.withCredentials=this.p.withCredentials),this.p.requestTimeout&&(e.timeout=this.p.requestTimeout),e.onreadystatechange=()=>{var t;3===e.readyState&&(null===(t=this.p.cookieJar)||void 0===t||t.parseCookies(e.getResponseHeader("set-cookie"))),4===e.readyState&&(200===e.status||1223===e.status?this.B():this.setTimeoutFn((()=>{this.O("number"==typeof e.status?e.status:0)}),0))},e.send(this.k)}catch(t){return void this.setTimeoutFn((()=>{this.O(t)}),0)}"undefined"!=typeof document&&(this.T=S.requestsCount++,S.requests[this.T]=this)}O(t){this.emitReserved("error",t,this.U),this._(!0)}_(t){if(void 0!==this.U&&null!==this.U){if(this.U.onreadystatechange=L,t)try{this.U.abort()}catch(t){}"undefined"!=typeof document&&delete S.requests[this.T],this.U=null}}B(){const t=this.U.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this._())}abort(){this._()}}if(S.requestsCount=0,S.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",R);else if("function"==typeof addEventListener){addEventListener("onpagehide"in E?"pagehide":"unload",R,!1)}function R(){for(let t in S.requests)S.requests.hasOwnProperty(t)&&S.requests[t].abort()}const H=function(){const t=q({xdomain:!1});return t&&null!==t.responseType}();class $ extends M{constructor(t){super(t);const s=t&&t.forceBase64;this.supportsBinary=H&&!s}request(t={}){return Object.assign(t,{xd:this.xd},this.opts),new S(q,this.uri(),t)}}function q(t){const s=t.xdomain;try{if("undefined"!=typeof XMLHttpRequest&&(!s||D))return new XMLHttpRequest}catch(t){}if(!s)try{return new(E[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(t){}}const I="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase();class W extends C{get name(){return"websocket"}doOpen(){const t=this.uri(),s=this.opts.protocols,e=I?{}:A(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(e.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(t,s,e)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws.C.unref(),this.onOpen()},this.ws.onclose=t=>this.onClose({description:"websocket connection closed",context:t}),this.ws.onmessage=t=>this.onData(t.data),this.ws.onerror=t=>this.onError("websocket error",t)}write(t){this.writable=!1;for(let s=0;s{try{this.doWrite(e,t)}catch(t){}i&&x((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){void 0!==this.ws&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){const t=this.opts.secure?"wss":"ws",s=this.query||{};return this.opts.timestampRequests&&(s[this.opts.timestampParam]=T()),this.supportsBinary||(s.b64=1),this.createUri(t,s)}}const N=E.WebSocket||E.MozWebSocket;class X extends W{createSocket(t,s,e){return I?new N(t,s,e):s?new N(t,s):new N(t)}doWrite(t,s){this.ws.send(s)}}class V extends C{get name(){return"webtransport"}doOpen(){try{this.P=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name])}catch(t){return this.emitReserved("error",t)}this.P.closed.then((()=>{this.onClose()})).catch((t=>{this.onError("webtransport error",t)})),this.P.ready.then((()=>{this.P.createBidirectionalStream().then((t=>{const s=function(t,s){b||(b=new TextDecoder);const i=[];let n=0,r=-1,o=!1;return new TransformStream({transform(h,c){for(i.push(h);;){if(0===n){if(m(i)<1)break;const t=v(i,1);o=!(128&~t[0]),r=127&t[0],n=r<126?3:126===r?1:2}else if(1===n){if(m(i)<2)break;const t=v(i,2);r=new DataView(t.buffer,t.byteOffset,t.length).getUint16(0),n=3}else if(2===n){if(m(i)<8)break;const t=v(i,8),s=new DataView(t.buffer,t.byteOffset,t.length),o=s.getUint32(0);if(o>Math.pow(2,21)-1){c.enqueue(e);break}r=o*Math.pow(2,32)+s.getUint32(4),n=3}else{if(m(i)t){c.enqueue(e);break}}}})}(Number.MAX_SAFE_INTEGER,this.socket.binaryType),i=t.readable.pipeThrough(s).getReader(),n=w();n.readable.pipeTo(t.writable),this.j=n.writable.getWriter();const r=()=>{i.read().then((({done:t,value:s})=>{t||(this.onPacket(s),r())})).catch((t=>{}))};r();const o={type:"open"};this.query.sid&&(o.data=`{"sid":"${this.query.sid}"}`),this.j.write(o).then((()=>this.onOpen()))}))}))}write(t){this.writable=!1;for(let s=0;s{i&&x((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){var t;null===(t=this.P)||void 0===t||t.close()}}const F={websocket:X,webtransport:V,polling:$},z=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,G=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function J(t){if(t.length>8e3)throw"URI too long";const s=t,e=t.indexOf("["),i=t.indexOf("]");-1!=e&&-1!=i&&(t=t.substring(0,e)+t.substring(e,i).replace(/:/g,";")+t.substring(i,t.length));let n=z.exec(t||""),r={},o=14;for(;o--;)r[G[o]]=n[o]||"";return-1!=e&&-1!=i&&(r.source=s,r.host=r.host.substring(1,r.host.length-1).replace(/;/g,":"),r.authority=r.authority.replace("[","").replace("]","").replace(/;/g,":"),r.ipv6uri=!0),r.pathNames=function(t,s){const e=/\/{2,9}/g,i=s.replace(e,"/").split("/");"/"!=s.slice(0,1)&&0!==s.length||i.splice(0,1);"/"==s.slice(-1)&&i.splice(i.length-1,1);return i}(0,r.path),r.queryKey=function(t,s){const e={};return s.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,(function(t,s,i){s&&(e[s]=i)})),e}(0,r.query),r}const K="function"==typeof addEventListener&&"function"==typeof removeEventListener,Q=[];K&&addEventListener("offline",(()=>{Q.forEach((t=>t()))}),!1);class Y extends k{constructor(t,s){if(super(),this.binaryType="arraybuffer",this.writeBuffer=[],this.D=0,this.L=-1,this.M=-1,this.S=-1,this.R=1/0,t&&"object"==typeof t&&(s=t,t=null),t){const e=J(t);s.hostname=e.host,s.secure="https"===e.protocol||"wss"===e.protocol,s.port=e.port,e.query&&(s.query=e.query)}else s.host&&(s.hostname=J(s.host).host);O(this,s),this.secure=null!=s.secure?s.secure:"undefined"!=typeof location&&"https:"===location.protocol,s.hostname&&!s.port&&(s.port=this.secure?"443":"80"),this.hostname=s.hostname||("undefined"!=typeof location?location.hostname:"localhost"),this.port=s.port||("undefined"!=typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=[],this.H={},s.transports.forEach((t=>{const s=t.prototype.name;this.transports.push(s),this.H[s]=t})),this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},s),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=function(t){let s={},e=t.split("&");for(let t=0,i=e.length;t{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.$,!1)),"localhost"!==this.hostname&&(this.q=()=>{this.I("transport close",{description:"network connection lost"})},Q.push(this.q))),this.opts.withCredentials&&(this.W=void 0),this.N()}createTransport(t){const s=Object.assign({},this.opts.query);s.EIO=4,s.transport=t,this.id&&(s.sid=this.id);const e=Object.assign({},this.opts,{query:s,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[t]);return new this.H[t](e)}N(){if(0===this.transports.length)return void this.setTimeoutFn((()=>{this.emitReserved("error","No transports available")}),0);const t=this.opts.rememberUpgrade&&Y.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket")?"websocket":this.transports[0];this.readyState="opening";const s=this.createTransport(t);s.open(),this.setTransport(s)}setTransport(t){this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",this.X.bind(this)).on("packet",this.V.bind(this)).on("error",this.O.bind(this)).on("close",(t=>this.I("transport close",t)))}onOpen(){this.readyState="open",Y.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush()}V(t){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(this.emitReserved("packet",t),this.emitReserved("heartbeat"),t.type){case"open":this.onHandshake(JSON.parse(t.data));break;case"ping":this.F("pong"),this.emitReserved("ping"),this.emitReserved("pong"),this.G();break;case"error":const s=new Error("server error");s.code=t.data,this.O(s);break;case"message":this.emitReserved("data",t.data),this.emitReserved("message",t.data)}}onHandshake(t){this.emitReserved("handshake",t),this.id=t.sid,this.transport.query.sid=t.sid,this.L=t.pingInterval,this.M=t.pingTimeout,this.S=t.maxPayload,this.onOpen(),"closed"!==this.readyState&&this.G()}G(){this.clearTimeoutFn(this.J);const t=this.L+this.M;this.R=Date.now()+t,this.J=this.setTimeoutFn((()=>{this.I("ping timeout")}),t),this.opts.autoUnref&&this.J.unref()}X(){this.writeBuffer.splice(0,this.D),this.D=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const t=this.K();this.transport.send(t),this.D=t.length,this.emitReserved("flush")}}K(){if(!(this.S&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let t=1;for(let e=0;e=57344?e+=3:(i++,e+=4);return e}(s):Math.ceil(1.33*(s.byteLength||s.size))),e>0&&t>this.S)return this.writeBuffer.slice(0,e);t+=2}var s;return this.writeBuffer}Y(){if(!this.R)return!0;const t=Date.now()>this.R;return t&&(this.R=0,x((()=>{this.I("ping timeout")}),this.setTimeoutFn)),t}write(t,s,e){return this.F("message",t,s,e),this}send(t,s,e){return this.F("message",t,s,e),this}F(t,s,e,i){if("function"==typeof s&&(i=s,s=void 0),"function"==typeof e&&(i=e,e=null),"closing"===this.readyState||"closed"===this.readyState)return;(e=e||{}).compress=!1!==e.compress;const n={type:t,data:s,options:e};this.emitReserved("packetCreate",n),this.writeBuffer.push(n),i&&this.once("flush",i),this.flush()}close(){const t=()=>{this.I("forced close"),this.transport.close()},s=()=>{this.off("upgrade",s),this.off("upgradeError",s),t()},e=()=>{this.once("upgrade",s),this.once("upgradeError",s)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(()=>{this.upgrading?e():t()})):this.upgrading?e():t()),this}O(t){if(Y.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&"opening"===this.readyState)return this.transports.shift(),this.N();this.emitReserved("error",t),this.I("transport error",t)}I(t,s){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState){if(this.clearTimeoutFn(this.J),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),K&&(this.$&&removeEventListener("beforeunload",this.$,!1),this.q)){const t=Q.indexOf(this.q);-1!==t&&Q.splice(t,1)}this.readyState="closed",this.id=null,this.emitReserved("close",t,s),this.writeBuffer=[],this.D=0}}}Y.protocol=4;class Z extends Y{constructor(){super(...arguments),this.Z=[]}onOpen(){if(super.onOpen(),"open"===this.readyState&&this.opts.upgrade)for(let t=0;t{e||(s.send([{type:"ping",data:"probe"}]),s.once("packet",(t=>{if(!e)if("pong"===t.type&&"probe"===t.data){if(this.upgrading=!0,this.emitReserved("upgrading",s),!s)return;Y.priorWebsocketSuccess="websocket"===s.name,this.transport.pause((()=>{e||"closed"!==this.readyState&&(a(),this.setTransport(s),s.send([{type:"upgrade"}]),this.emitReserved("upgrade",s),s=null,this.upgrading=!1,this.flush())}))}else{const t=new Error("probe error");t.transport=s.name,this.emitReserved("upgradeError",t)}})))};function n(){e||(e=!0,a(),s.close(),s=null)}const r=t=>{const e=new Error("probe error: "+t);e.transport=s.name,n(),this.emitReserved("upgradeError",e)};function o(){r("transport closed")}function h(){r("socket closed")}function c(t){s&&t.name!==s.name&&n()}const a=()=>{s.removeListener("open",i),s.removeListener("error",r),s.removeListener("close",o),this.off("close",h),this.off("upgrading",c)};s.once("open",i),s.once("error",r),s.once("close",o),this.once("close",h),this.once("upgrading",c),-1!==this.Z.indexOf("webtransport")&&"webtransport"!==t?this.setTimeoutFn((()=>{e||s.open()}),200):s.open()}onHandshake(t){this.Z=this.st(t.upgrades),super.onHandshake(t)}st(t){const s=[];for(let e=0;eF[t])).filter((t=>!!t))),super(t,e)}}class st extends P{doPoll(){this.et().then((t=>{if(!t.ok)return this.onError("fetch read error",t.status,t);t.text().then((t=>this.onData(t)))})).catch((t=>{this.onError("fetch read error",t)}))}doWrite(t,s){this.et(t).then((t=>{if(!t.ok)return this.onError("fetch write error",t.status,t);s()})).catch((t=>{this.onError("fetch write error",t)}))}et(t){var s;const e=void 0!==t,i=new Headers(this.opts.extraHeaders);return e&&i.set("content-type","text/plain;charset=UTF-8"),null===(s=this.socket.W)||void 0===s||s.appendCookies(i),fetch(this.uri(),{method:e?"POST":"GET",body:e?t:null,headers:i,credentials:this.opts.withCredentials?"include":"omit"}).then((t=>{var s;return null===(s=this.socket.W)||void 0===s||s.parseCookies(t.headers.getSetCookie()),t}))}}const et=tt.protocol;export{st as Fetch,X as NodeWebSocket,$ as NodeXHR,tt as Socket,Z as SocketWithUpgrade,Y as SocketWithoutUpgrade,C as Transport,_ as TransportError,X as WebSocket,V as WebTransport,$ as XHR,O as installTimerFunctions,x as nextTick,J as parse,et as protocol,F as transports}; diff --git a/packages/engine.io-client/dist/engine.io.js b/packages/engine.io-client/dist/engine.io.js index cb2100204f..83d420513f 100644 --- a/packages/engine.io-client/dist/engine.io.js +++ b/packages/engine.io-client/dist/engine.io.js @@ -1,6 +1,6 @@ /*! - * Engine.IO v6.6.2 - * (c) 2014-2024 Guillermo Rauch + * Engine.IO v6.6.3 + * (c) 2014-2025 Guillermo Rauch * Released under the MIT License. */ (function (global, factory) { diff --git a/packages/engine.io-client/dist/engine.io.min.js b/packages/engine.io-client/dist/engine.io.min.js index 76a48e1c67..782d498eee 100644 --- a/packages/engine.io-client/dist/engine.io.min.js +++ b/packages/engine.io-client/dist/engine.io.min.js @@ -1,6 +1,6 @@ /*! - * Engine.IO v6.6.2 - * (c) 2014-2024 Guillermo Rauch + * Engine.IO v6.6.3 + * (c) 2014-2025 Guillermo Rauch * Released under the MIT License. */ !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t="undefined"!=typeof globalThis?globalThis:t||self).eio=n()}(this,(function(){"use strict";function t(t,n){for(var i=0;i1?{type:a[i],data:t.substring(1)}:{type:a[i]}:l},O=function(t,n){if(B){var i=function(t){var n,i,r,e,o,s=.75*t.length,u=t.length,f=0;"="===t[t.length-1]&&(s--,"="===t[t.length-2]&&s--);var h=new ArrayBuffer(s),c=new Uint8Array(h);for(n=0;n>4,c[f++]=(15&r)<<4|e>>2,c[f++]=(3&e)<<6|63&o;return h}(t);return U(i,n)}return{base64:!0,data:t}},U=function(t,n){return"blob"===n?t instanceof Blob?t:new Blob([t]):t instanceof ArrayBuffer?t:t.buffer},T=String.fromCharCode(30);function S(){return new TransformStream({transform:function(t,n){!function(t,n){v&&t.data instanceof Blob?t.data.arrayBuffer().then(w).then(n):d&&(t.data instanceof ArrayBuffer||y(t.data))?n(w(t.data)):b(t,!1,(function(t){p||(p=new TextEncoder),n(p.encode(t))}))}(t,(function(i){var r,e=i.length;if(e<126)r=new Uint8Array(1),new DataView(r.buffer).setUint8(0,e);else if(e<65536){r=new Uint8Array(3);var o=new DataView(r.buffer);o.setUint8(0,126),o.setUint16(1,e)}else{r=new Uint8Array(9);var s=new DataView(r.buffer);s.setUint8(0,127),s.setBigUint64(1,BigInt(e))}t.data&&"string"!=typeof t.data&&(r[0]|=128),n.enqueue(r),n.enqueue(i)}))}})}function M(t){return t.reduce((function(t,n){return t+n.length}),0)}function x(t,n){if(t[0].length===n)return t.shift();for(var i=new Uint8Array(n),r=0,e=0;e1?n-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{};return t+"://"+this.i()+this.o()+this.opts.path+this.u(n)},i.i=function(){var t=this.opts.hostname;return-1===t.indexOf(":")?t:"["+t+"]"},i.o=function(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""},i.u=function(t){var n=function(t){var n="";for(var i in t)t.hasOwnProperty(i)&&(n.length&&(n+="&"),n+=encodeURIComponent(i)+"="+encodeURIComponent(t[i]));return n}(t);return n.length?"?"+n:""},n}(C),X=function(t){function i(){var n;return(n=t.apply(this,arguments)||this).h=!1,n}e(i,t);var r=i.prototype;return r.doOpen=function(){this.p()},r.pause=function(t){var n=this;this.readyState="pausing";var i=function(){n.readyState="paused",t()};if(this.h||!this.writable){var r=0;this.h&&(r++,this.once("pollComplete",(function(){--r||i()}))),this.writable||(r++,this.once("drain",(function(){--r||i()})))}else i()},r.p=function(){this.h=!0,this.doPoll(),this.emitReserved("poll")},r.onData=function(t){var n=this;(function(t,n){for(var i=t.split(T),r=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:{};return i(t,{xd:this.xd},this.opts),new J(Z,this.uri(),t)},n}(G);function Z(t){var n=t.xdomain;try{if("undefined"!=typeof XMLHttpRequest&&(!n||F))return new XMLHttpRequest}catch(t){}if(!n)try{return new(R[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(t){}}var _="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase(),tt=function(t){function i(){return t.apply(this,arguments)||this}e(i,t);var r=i.prototype;return r.doOpen=function(){var t=this.uri(),n=this.opts.protocols,i=_?{}:D(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(i.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(t,n,i)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()},r.addEventListeners=function(){var t=this;this.ws.onopen=function(){t.opts.autoUnref&&t.ws.S.unref(),t.onOpen()},this.ws.onclose=function(n){return t.onClose({description:"websocket connection closed",context:n})},this.ws.onmessage=function(n){return t.onData(n.data)},this.ws.onerror=function(n){return t.onError("websocket error",n)}},r.write=function(t){var n=this;this.writable=!1;for(var i=function(){var i=t[r],e=r===t.length-1;b(i,n.supportsBinary,(function(t){try{n.doWrite(i,t)}catch(t){}e&&L((function(){n.writable=!0,n.emitReserved("drain")}),n.setTimeoutFn)}))},r=0;rMath.pow(2,21)-1){u.enqueue(l);break}e=p*Math.pow(2,32)+a.getUint32(4),r=3}else{if(M(i)t){u.enqueue(l);break}}}})}(Number.MAX_SAFE_INTEGER,t.socket.binaryType),r=n.readable.pipeThrough(i).getReader(),e=S();e.readable.pipeTo(n.writable),t.C=e.writable.getWriter();!function n(){r.read().then((function(i){var r=i.done,e=i.value;r||(t.onPacket(e),n())})).catch((function(t){}))}();var o={type:"open"};t.query.sid&&(o.data='{"sid":"'.concat(t.query.sid,'"}')),t.C.write(o).then((function(){return t.onOpen()}))}))}))},r.write=function(t){var n=this;this.writable=!1;for(var i=function(){var i=t[r],e=r===t.length-1;n.C.write(i).then((function(){e&&L((function(){n.writable=!0,n.emitReserved("drain")}),n.setTimeoutFn)}))},r=0;r8e3)throw"URI too long";var n=t,i=t.indexOf("["),r=t.indexOf("]");-1!=i&&-1!=r&&(t=t.substring(0,i)+t.substring(i,r).replace(/:/g,";")+t.substring(r,t.length));for(var e,o,s=ot.exec(t||""),u={},f=14;f--;)u[st[f]]=s[f]||"";return-1!=i&&-1!=r&&(u.source=n,u.host=u.host.substring(1,u.host.length-1).replace(/;/g,":"),u.authority=u.authority.replace("[","").replace("]","").replace(/;/g,":"),u.ipv6uri=!0),u.pathNames=function(t,n){var i=/\/{2,9}/g,r=n.replace(i,"/").split("/");"/"!=n.slice(0,1)&&0!==n.length||r.splice(0,1);"/"==n.slice(-1)&&r.splice(r.length-1,1);return r}(0,u.path),u.queryKey=(e=u.query,o={},e.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,(function(t,n,i){n&&(o[n]=i)})),o),u}var ft="function"==typeof addEventListener&&"function"==typeof removeEventListener,ht=[];ft&&addEventListener("offline",(function(){ht.forEach((function(t){return t()}))}),!1);var ct=function(t){function n(n,r){var e;if((e=t.call(this)||this).binaryType="arraybuffer",e.writeBuffer=[],e.L=0,e.R=-1,e.D=-1,e.P=-1,e.I=1/0,n&&"object"===f(n)&&(r=n,n=null),n){var o=ut(n);r.hostname=o.host,r.secure="https"===o.protocol||"wss"===o.protocol,r.port=o.port,o.query&&(r.query=o.query)}else r.host&&(r.hostname=ut(r.host).host);return $(e,r),e.secure=null!=r.secure?r.secure:"undefined"!=typeof location&&"https:"===location.protocol,r.hostname&&!r.port&&(r.port=e.secure?"443":"80"),e.hostname=r.hostname||("undefined"!=typeof location?location.hostname:"localhost"),e.port=r.port||("undefined"!=typeof location&&location.port?location.port:e.secure?"443":"80"),e.transports=[],e.$={},r.transports.forEach((function(t){var n=t.prototype.name;e.transports.push(n),e.$[n]=t})),e.opts=i({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},r),e.opts.path=e.opts.path.replace(/\/$/,"")+(e.opts.addTrailingSlash?"/":""),"string"==typeof e.opts.query&&(e.opts.query=function(t){for(var n={},i=t.split("&"),r=0,e=i.length;r1))return this.writeBuffer;for(var t,n=1,i=0;i=57344?i+=3:(r++,i+=4);return i}(t):Math.ceil(1.33*(t.byteLength||t.size))),i>0&&n>this.P)return this.writeBuffer.slice(0,i);n+=2}return this.writeBuffer},r.Z=function(){var t=this;if(!this.I)return!0;var n=Date.now()>this.I;return n&&(this.I=0,L((function(){t.V("ping timeout")}),this.setTimeoutFn)),n},r.write=function(t,n,i){return this.J("message",t,n,i),this},r.send=function(t,n,i){return this.J("message",t,n,i),this},r.J=function(t,n,i,r){if("function"==typeof n&&(r=n,n=void 0),"function"==typeof i&&(r=i,i=null),"closing"!==this.readyState&&"closed"!==this.readyState){(i=i||{}).compress=!1!==i.compress;var e={type:t,data:n,options:i};this.emitReserved("packetCreate",e),this.writeBuffer.push(e),r&&this.once("flush",r),this.flush()}},r.close=function(){var t=this,n=function(){t.V("forced close"),t.transport.close()},i=function i(){t.off("upgrade",i),t.off("upgradeError",i),n()},r=function(){t.once("upgrade",i),t.once("upgradeError",i)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(function(){t.upgrading?r():n()})):this.upgrading?r():n()),this},r.O=function(t){if(n.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&"opening"===this.readyState)return this.transports.shift(),this.H();this.emitReserved("error",t),this.V("transport error",t)},r.V=function(t,n){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState){if(this.clearTimeoutFn(this.K),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),ft&&(this.q&&removeEventListener("beforeunload",this.q,!1),this.N)){var i=ht.indexOf(this.N);-1!==i&&ht.splice(i,1)}this.readyState="closed",this.id=null,this.emitReserved("close",t,n),this.writeBuffer=[],this.L=0}},n}(C);ct.protocol=4;var at=function(t){function n(){var n;return(n=t.apply(this,arguments)||this)._=[],n}e(n,t);var i=n.prototype;return i.onOpen=function(){if(t.prototype.onOpen.call(this),"open"===this.readyState&&this.opts.upgrade)for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},r="object"===f(n)?n:i;return(!r.transports||r.transports&&"string"==typeof r.transports[0])&&(r.transports=(r.transports||["polling","websocket","webtransport"]).map((function(t){return et[t]})).filter((function(t){return!!t}))),t.call(this,n,r)||this}return e(n,t),n}(at);return function(t,n){return new pt(t,n)}})); diff --git a/packages/engine.io-client/package.json b/packages/engine.io-client/package.json index 95c5f2bba4..6cad940749 100644 --- a/packages/engine.io-client/package.json +++ b/packages/engine.io-client/package.json @@ -2,7 +2,7 @@ "name": "engine.io-client", "description": "Client for the realtime Engine", "license": "MIT", - "version": "6.6.2", + "version": "6.6.3", "main": "./build/cjs/index.js", "module": "./build/esm/index.js", "exports": { From 62e4da125e99d233b5d58a43002f0485a4a7234f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 23 Jan 2025 07:55:43 +0100 Subject: [PATCH 21/51] chore(release): engine.io@6.6.3 Diff: https://github.com/socketio/socket.io/compare/engine.io@6.6.2...engine.io@6.6.3 --- packages/engine.io/CHANGELOG.md | 14 ++++++++++++++ packages/engine.io/package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/engine.io/CHANGELOG.md b/packages/engine.io/CHANGELOG.md index 7105615476..6ad935dcc0 100644 --- a/packages/engine.io/CHANGELOG.md +++ b/packages/engine.io/CHANGELOG.md @@ -2,6 +2,7 @@ | Version | Release date | |------------------------------------------------------------------------------------------------------|----------------| +| [6.6.3](#663-2025-01-23) | January 2025 | | [6.6.2](#662-2024-10-09) | October 2024 | | [6.6.1](#661-2024-09-21) | September 2024 | | [6.6.0](#660-2024-06-21) | June 2024 | @@ -47,6 +48,19 @@ # Release notes +## [6.6.3](https://github.com/socketio/socket.io/compare/engine.io@6.6.2...engine.io@6.6.3) (2025-01-23) + +This release contains a bump of the `cookie` dependency. + +Release notes: https://github.com/jshttp/cookie/releases/tag/v1.0.0 + + +### Dependencies + +- [`ws@~8.17.1`](https://github.com/websockets/ws/releases/tag/8.17.1) (no change) + + + ## [6.6.2](https://github.com/socketio/socket.io/compare/engine.io@6.6.1...engine.io@6.6.2) (2024-10-09) This release contains a bump of the `cookie` dependency. diff --git a/packages/engine.io/package.json b/packages/engine.io/package.json index c7b3bb154f..79fd6d30e7 100644 --- a/packages/engine.io/package.json +++ b/packages/engine.io/package.json @@ -1,6 +1,6 @@ { "name": "engine.io", - "version": "6.6.2", + "version": "6.6.3", "description": "The realtime engine behind Socket.IO. Provides the foundation of a bidirectional connection between client and server", "type": "commonjs", "main": "./build/engine.io.js", From 5a31aaf91789e4572bca5b059bae577e4cebee2c Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 28 Jan 2025 09:13:39 +0100 Subject: [PATCH 22/51] chore(eio): revert cookie to version ~0.7.2 This reverts commit 7427109658591e7ce677a183a664d1f5327f37ea. The new version of the `cookie` package contains code with optional chaining (`?.`), which is not supported by older Node.js versions (< 14). The types for cookie are now bundled, so that there is no conflict with the types coming from `cookie@1`: > error TS2724: '"cookie"' has no exported member named 'CookieSerializeOptions'. Did you mean 'SerializeOptions'? > > import type { CookieSerializeOptions } from "cookie"; > ~~~~~~~~~~~~~~~~~~~~~~ Related: https://github.com/socketio/socket.io/issues/5283 --- package-lock.json | 15 +-- package.json | 1 + .../engine.io/lib/contrib/types.cookie.ts | 117 ++++++++++++++++++ packages/engine.io/lib/server.ts | 4 +- packages/engine.io/package.json | 2 +- 5 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 packages/engine.io/lib/contrib/types.cookie.ts diff --git a/package-lock.json b/package-lock.json index c46fc4801b..33b83d3ba7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "base64-arraybuffer": "^1.0.2", "benchmark": "^2.1.4", "blob": "^0.1.0", + "cookie": "~0.7.2", "eiows": "^7.1.0", "engine.io-client-v3": "npm:engine.io-client@^3.5.2", "expect.js": "^0.3.1", @@ -5756,11 +5757,11 @@ "dev": true }, "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { - "node": ">=18" + "node": ">= 0.6" } }, "node_modules/cookie-signature": { @@ -15506,14 +15507,14 @@ } }, "packages/engine.io": { - "version": "6.6.2", + "version": "6.6.3", "license": "MIT", "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~1.0.2", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -15524,7 +15525,7 @@ } }, "packages/engine.io-client": { - "version": "6.6.2", + "version": "6.6.3", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", diff --git a/package.json b/package.json index 1c249dbcf2..f6b3a04419 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "base64-arraybuffer": "^1.0.2", "benchmark": "^2.1.4", "blob": "^0.1.0", + "cookie": "~0.7.2", "eiows": "^7.1.0", "engine.io-client-v3": "npm:engine.io-client@^3.5.2", "expect.js": "^0.3.1", diff --git a/packages/engine.io/lib/contrib/types.cookie.ts b/packages/engine.io/lib/contrib/types.cookie.ts new file mode 100644 index 0000000000..7e546707e9 --- /dev/null +++ b/packages/engine.io/lib/contrib/types.cookie.ts @@ -0,0 +1,117 @@ +// imported from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/b83cf9ef8b044e69f05b2a00aa7c6cb767a9acd2/types/cookie/index.d.ts (now deleted) +/** + * Basic HTTP cookie parser and serializer for HTTP servers. + */ + +/** + * Additional serialization options + */ +export interface CookieSerializeOptions { + /** + * Specifies the value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.3|Domain Set-Cookie attribute}. By default, no + * domain is set, and most clients will consider the cookie to apply to only + * the current domain. + */ + domain?: string | undefined; + + /** + * Specifies a function that will be used to encode a cookie's value. Since + * value of a cookie has a limited character set (and must be a simple + * string), this function can be used to encode a value into a string suited + * for a cookie's value. + * + * The default function is the global `encodeURIComponent`, which will + * encode a JavaScript string into UTF-8 byte sequences and then URL-encode + * any that fall outside of the cookie range. + */ + encode?(value: string): string; + + /** + * Specifies the `Date` object to be the value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.1|`Expires` `Set-Cookie` attribute}. By default, + * no expiration is set, and most clients will consider this a "non-persistent cookie" and will delete + * it on a condition like exiting a web browser application. + * + * *Note* the {@link https://tools.ietf.org/html/rfc6265#section-5.3|cookie storage model specification} + * states that if both `expires` and `maxAge` are set, then `maxAge` takes precedence, but it is + * possible not all clients by obey this, so if both are set, they should + * point to the same date and time. + */ + expires?: Date | undefined; + /** + * Specifies the boolean value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.6|`HttpOnly` `Set-Cookie` attribute}. + * When truthy, the `HttpOnly` attribute is set, otherwise it is not. By + * default, the `HttpOnly` attribute is not set. + * + * *Note* be careful when setting this to true, as compliant clients will + * not allow client-side JavaScript to see the cookie in `document.cookie`. + */ + httpOnly?: boolean | undefined; + /** + * Specifies the number (in seconds) to be the value for the `Max-Age` + * `Set-Cookie` attribute. The given number will be converted to an integer + * by rounding down. By default, no maximum age is set. + * + * *Note* the {@link https://tools.ietf.org/html/rfc6265#section-5.3|cookie storage model specification} + * states that if both `expires` and `maxAge` are set, then `maxAge` takes precedence, but it is + * possible not all clients by obey this, so if both are set, they should + * point to the same date and time. + */ + maxAge?: number | undefined; + /** + * Specifies the `boolean` value for the [`Partitioned` `Set-Cookie`](rfc-cutler-httpbis-partitioned-cookies) + * attribute. When truthy, the `Partitioned` attribute is set, otherwise it is not. By default, the + * `Partitioned` attribute is not set. + * + * **note** This is an attribute that has not yet been fully standardized, and may change in the future. + * This also means many clients may ignore this attribute until they understand it. + * + * More information about can be found in [the proposal](https://github.com/privacycg/CHIPS) + */ + partitioned?: boolean | undefined; + /** + * Specifies the value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.4|`Path` `Set-Cookie` attribute}. + * By default, the path is considered the "default path". + */ + path?: string | undefined; + /** + * Specifies the `string` to be the value for the [`Priority` `Set-Cookie` attribute][rfc-west-cookie-priority-00-4.1]. + * + * - `'low'` will set the `Priority` attribute to `Low`. + * - `'medium'` will set the `Priority` attribute to `Medium`, the default priority when not set. + * - `'high'` will set the `Priority` attribute to `High`. + * + * More information about the different priority levels can be found in + * [the specification][rfc-west-cookie-priority-00-4.1]. + * + * **note** This is an attribute that has not yet been fully standardized, and may change in the future. + * This also means many clients may ignore this attribute until they understand it. + */ + priority?: "low" | "medium" | "high" | undefined; + /** + * Specifies the boolean or string to be the value for the {@link https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7|`SameSite` `Set-Cookie` attribute}. + * + * - `true` will set the `SameSite` attribute to `Strict` for strict same + * site enforcement. + * - `false` will not set the `SameSite` attribute. + * - `'lax'` will set the `SameSite` attribute to Lax for lax same site + * enforcement. + * - `'strict'` will set the `SameSite` attribute to Strict for strict same + * site enforcement. + * - `'none'` will set the SameSite attribute to None for an explicit + * cross-site cookie. + * + * More information about the different enforcement levels can be found in {@link https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7|the specification}. + * + * *note* This is an attribute that has not yet been fully standardized, and may change in the future. This also means many clients may ignore this attribute until they understand it. + */ + sameSite?: true | false | "lax" | "strict" | "none" | undefined; + /** + * Specifies the boolean value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.5|`Secure` `Set-Cookie` attribute}. When truthy, the + * `Secure` attribute is set, otherwise it is not. By default, the `Secure` attribute is not set. + * + * *Note* be careful when setting this to `true`, as compliant clients will + * not send the cookie back to the server in the future if the browser does + * not have an HTTPS connection. + */ + secure?: boolean | undefined; +} diff --git a/packages/engine.io/lib/server.ts b/packages/engine.io/lib/server.ts index b3c708eed2..bf53f994ac 100644 --- a/packages/engine.io/lib/server.ts +++ b/packages/engine.io/lib/server.ts @@ -6,7 +6,6 @@ import { EventEmitter } from "events"; import { Socket } from "./socket"; import debugModule from "debug"; import { serialize } from "cookie"; -import type { SerializeOptions } from "cookie"; import { Server as DEFAULT_WS_ENGINE } from "ws"; import type { IncomingMessage, @@ -18,6 +17,7 @@ import type { Duplex } from "stream"; import { WebTransport } from "./transports/webtransport"; import { createPacketDecoderStream } from "engine.io-parser"; import type { EngineRequest } from "./transport"; +import type { CookieSerializeOptions } from "./contrib/types.cookie"; const debug = debugModule("engine"); @@ -123,7 +123,7 @@ export interface ServerOptions { * might be used for sticky-session. Defaults to not sending any cookie. * @default false */ - cookie?: (SerializeOptions & { name: string }) | boolean; + cookie?: (CookieSerializeOptions & { name: string }) | boolean; /** * the options that will be forwarded to the cors module */ diff --git a/packages/engine.io/package.json b/packages/engine.io/package.json index 79fd6d30e7..582a89c6c0 100644 --- a/packages/engine.io/package.json +++ b/packages/engine.io/package.json @@ -35,7 +35,7 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~1.0.2", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", From 72d61dab822a2f932b828bbfdc500a566c7cc87f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 28 Jan 2025 09:23:04 +0100 Subject: [PATCH 23/51] chore(release): engine.io@6.6.4 Diff: https://github.com/socketio/socket.io/compare/engine.io@6.6.3...engine.io@6.6.4 --- packages/engine.io/CHANGELOG.md | 12 ++++++++++++ packages/engine.io/package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/engine.io/CHANGELOG.md b/packages/engine.io/CHANGELOG.md index 6ad935dcc0..0ae2948832 100644 --- a/packages/engine.io/CHANGELOG.md +++ b/packages/engine.io/CHANGELOG.md @@ -2,6 +2,7 @@ | Version | Release date | |------------------------------------------------------------------------------------------------------|----------------| +| [6.6.4](#664-2025-01-28) | January 2025 | | [6.6.3](#663-2025-01-23) | January 2025 | | [6.6.2](#662-2024-10-09) | October 2024 | | [6.6.1](#661-2024-09-21) | September 2024 | @@ -48,6 +49,17 @@ # Release notes +## [6.6.4](https://github.com/socketio/socket.io/compare/engine.io@6.6.3...engine.io@6.6.4) (2025-01-28) + +The bump of the `cookie` dependency was reverted, as it drops support for older Node.js versions (< 14). + + +### Dependencies + +- [`ws@~8.17.1`](https://github.com/websockets/ws/releases/tag/8.17.1) (no change) + + + ## [6.6.3](https://github.com/socketio/socket.io/compare/engine.io@6.6.2...engine.io@6.6.3) (2025-01-23) This release contains a bump of the `cookie` dependency. diff --git a/packages/engine.io/package.json b/packages/engine.io/package.json index 582a89c6c0..ed8386ea3b 100644 --- a/packages/engine.io/package.json +++ b/packages/engine.io/package.json @@ -1,6 +1,6 @@ { "name": "engine.io", - "version": "6.6.3", + "version": "6.6.4", "description": "The realtime engine behind Socket.IO. Provides the foundation of a bidirectional connection between client and server", "type": "commonjs", "main": "./build/engine.io.js", From e95f6abf93766662cd3b341599ed312f4330213f Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 28 Mar 2025 21:29:20 +0100 Subject: [PATCH 24/51] docs: fix message handler latency in test suites Related: https://github.com/socketio/socket.io-protocol/issues/32 --- .../v4-test-suite/test-suite.js | 77 ++++++++++------ .../v5-test-suite/test-suite.js | 90 +++++++++++-------- 2 files changed, 104 insertions(+), 63 deletions(-) diff --git a/docs/engine.io-protocol/v4-test-suite/test-suite.js b/docs/engine.io-protocol/v4-test-suite/test-suite.js index 70b28f5fe8..b010f50967 100644 --- a/docs/engine.io-protocol/v4-test-suite/test-suite.js +++ b/docs/engine.io-protocol/v4-test-suite/test-suite.js @@ -17,16 +17,35 @@ function sleep(delay) { return new Promise((resolve) => setTimeout(resolve, delay)); } +function createWebSocket(url) { + const socket = new WebSocket(url); + socket._eventBuffer = {}; + socket._pendingPromises = {}; + + for (const eventType of ["open", "close", "message"]) { + socket._eventBuffer[eventType] = []; + socket._pendingPromises[eventType] = []; + + socket.addEventListener(eventType, (event) => { + if (socket._pendingPromises[eventType].length) { + socket._pendingPromises[eventType].shift()(event); + } else { + socket._eventBuffer[eventType].push(event); + } + }); + } + + return socket; +} + function waitFor(socket, eventType) { - return new Promise((resolve) => { - socket.addEventListener( - eventType, - (event) => { - resolve(event); - }, - { once: true } - ); - }); + if (socket._eventBuffer[eventType].length) { + return Promise.resolve(socket._eventBuffer[eventType].shift()); + } else { + return new Promise((resolve) => { + socket._pendingPromises[eventType].push(resolve); + }); + } } async function initLongPollingSession() { @@ -110,7 +129,7 @@ describe("Engine.IO protocol", () => { describe("WebSocket", () => { it("successfully opens a session", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket` ); @@ -137,7 +156,7 @@ describe("Engine.IO protocol", () => { }); it("fails with an invalid 'EIO' query parameter", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?transport=websocket` ); @@ -145,9 +164,9 @@ describe("Engine.IO protocol", () => { socket.on("error", () => {}); } - waitFor(socket, "close"); + await waitFor(socket, "close"); - const socket2 = new WebSocket( + const socket2 = createWebSocket( `${WS_URL}/engine.io/?EIO=abc&transport=websocket` ); @@ -155,19 +174,19 @@ describe("Engine.IO protocol", () => { socket2.on("error", () => {}); } - waitFor(socket2, "close"); + await waitFor(socket2, "close"); }); it("fails with an invalid 'transport' query parameter", async () => { - const socket = new WebSocket(`${WS_URL}/engine.io/?EIO=4`); + const socket = createWebSocket(`${WS_URL}/engine.io/?EIO=4`); if (isNodejs) { socket.on("error", () => {}); } - waitFor(socket, "close"); + await waitFor(socket, "close"); - const socket2 = new WebSocket( + const socket2 = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=abc` ); @@ -175,7 +194,7 @@ describe("Engine.IO protocol", () => { socket2.on("error", () => {}); } - waitFor(socket2, "close"); + await waitFor(socket2, "close"); }); }); }); @@ -317,7 +336,7 @@ describe("Engine.IO protocol", () => { describe("WebSocket", () => { it("sends and receives a plain text packet", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket` ); @@ -335,7 +354,7 @@ describe("Engine.IO protocol", () => { }); it("sends and receives a binary packet", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket` ); socket.binaryType = "arraybuffer"; @@ -352,7 +371,7 @@ describe("Engine.IO protocol", () => { }); it("closes the session upon invalid packet format", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket` ); @@ -412,7 +431,7 @@ describe("Engine.IO protocol", () => { describe("WebSocket", () => { it("sends ping/pong packets", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket` ); @@ -430,7 +449,7 @@ describe("Engine.IO protocol", () => { }); it("closes the session upon ping timeout", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket` ); @@ -468,7 +487,7 @@ describe("Engine.IO protocol", () => { describe("WebSocket", () => { it("forcefully closes the session", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket` ); @@ -485,7 +504,7 @@ describe("Engine.IO protocol", () => { it("successfully upgrades from HTTP long-polling to WebSocket", async () => { const sid = await initLongPollingSession(); - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket&sid=${sid}` ); @@ -521,12 +540,13 @@ describe("Engine.IO protocol", () => { it("ignores HTTP requests with same sid after upgrade", async () => { const sid = await initLongPollingSession(); - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket&sid=${sid}` ); await waitFor(socket, "open"); socket.send("2probe"); + await waitFor(socket, "message"); // "3probe" socket.send("5"); const pollResponse = await fetch( @@ -545,15 +565,16 @@ describe("Engine.IO protocol", () => { it("ignores WebSocket connection with same sid after upgrade", async () => { const sid = await initLongPollingSession(); - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket&sid=${sid}` ); await waitFor(socket, "open"); socket.send("2probe"); + await waitFor(socket, "message"); // "3probe" socket.send("5"); - const socket2 = new WebSocket( + const socket2 = createWebSocket( `${WS_URL}/engine.io/?EIO=4&transport=websocket&sid=${sid}` ); diff --git a/docs/socket.io-protocol/v5-test-suite/test-suite.js b/docs/socket.io-protocol/v5-test-suite/test-suite.js index aaee882e0d..a00e433ddb 100644 --- a/docs/socket.io-protocol/v5-test-suite/test-suite.js +++ b/docs/socket.io-protocol/v5-test-suite/test-suite.js @@ -17,16 +17,35 @@ function sleep(delay) { return new Promise((resolve) => setTimeout(resolve, delay)); } +function createWebSocket(url) { + const socket = new WebSocket(url); + socket._eventBuffer = {}; + socket._pendingPromises = {}; + + for (const eventType of ["open", "close", "message"]) { + socket._eventBuffer[eventType] = []; + socket._pendingPromises[eventType] = []; + + socket.addEventListener(eventType, (event) => { + if (socket._pendingPromises[eventType].length) { + socket._pendingPromises[eventType].shift()(event); + } else { + socket._eventBuffer[eventType].push(event); + } + }); + } + + return socket; +} + function waitFor(socket, eventType) { - return new Promise((resolve) => { - socket.addEventListener( - eventType, - (event) => { - resolve(event); - }, - { once: true } - ); - }); + if (socket._eventBuffer[eventType].length) { + return Promise.resolve(socket._eventBuffer[eventType].shift()); + } else { + return new Promise((resolve) => { + socket._pendingPromises[eventType].push(resolve); + }); + } } function waitForPackets(socket, count) { @@ -55,7 +74,7 @@ async function initLongPollingSession() { } async function initSocketIOConnection() { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); socket.binaryType = "arraybuffer"; @@ -145,7 +164,7 @@ describe("Engine.IO protocol", () => { describe("WebSocket", () => { it("should successfully open a session", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -172,7 +191,7 @@ describe("Engine.IO protocol", () => { }); it("should fail with an invalid 'EIO' query parameter", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?transport=websocket` ); @@ -180,9 +199,9 @@ describe("Engine.IO protocol", () => { socket.on("error", () => {}); } - waitFor(socket, "close"); + await waitFor(socket, "close"); - const socket2 = new WebSocket( + const socket2 = createWebSocket( `${WS_URL}/socket.io/?EIO=abc&transport=websocket` ); @@ -190,19 +209,19 @@ describe("Engine.IO protocol", () => { socket2.on("error", () => {}); } - waitFor(socket2, "close"); + await waitFor(socket2, "close"); }); it("should fail with an invalid 'transport' query parameter", async () => { - const socket = new WebSocket(`${WS_URL}/socket.io/?EIO=4`); + const socket = createWebSocket(`${WS_URL}/socket.io/?EIO=4`); if (isNodejs) { socket.on("error", () => {}); } - waitFor(socket, "close"); + await waitFor(socket, "close"); - const socket2 = new WebSocket( + const socket2 = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=abc` ); @@ -210,7 +229,7 @@ describe("Engine.IO protocol", () => { socket2.on("error", () => {}); } - waitFor(socket2, "close"); + await waitFor(socket2, "close"); }); }); }); @@ -260,7 +279,7 @@ describe("Engine.IO protocol", () => { describe("WebSocket", () => { it("should send ping/pong packets", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -278,7 +297,7 @@ describe("Engine.IO protocol", () => { }); it("should close the session upon ping timeout", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -316,7 +335,7 @@ describe("Engine.IO protocol", () => { describe("WebSocket", () => { it("should forcefully close the session", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -333,7 +352,7 @@ describe("Engine.IO protocol", () => { it("should successfully upgrade from HTTP long-polling to WebSocket", async () => { const sid = await initLongPollingSession(); - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket&sid=${sid}` ); @@ -353,12 +372,13 @@ describe("Engine.IO protocol", () => { it("should ignore HTTP requests with same sid after upgrade", async () => { const sid = await initLongPollingSession(); - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket&sid=${sid}` ); await waitFor(socket, "open"); socket.send("2probe"); + await waitFor(socket, "message"); // "3probe" socket.send("5"); const pollResponse = await fetch( @@ -371,15 +391,16 @@ describe("Engine.IO protocol", () => { it("should ignore WebSocket connection with same sid after upgrade", async () => { const sid = await initLongPollingSession(); - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket&sid=${sid}` ); await waitFor(socket, "open"); socket.send("2probe"); + await waitFor(socket, "message"); // "3probe" socket.send("5"); - const socket2 = new WebSocket( + const socket2 = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket&sid=${sid}` ); @@ -391,7 +412,7 @@ describe("Engine.IO protocol", () => { describe("Socket.IO protocol", () => { describe("connect", () => { it("should allow connection to the main namespace", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -414,7 +435,7 @@ describe("Socket.IO protocol", () => { }); it("should allow connection to the main namespace with a payload", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -437,7 +458,7 @@ describe("Socket.IO protocol", () => { }); it("should allow connection to a custom namespace", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -460,7 +481,7 @@ describe("Socket.IO protocol", () => { }); it("should allow connection to a custom namespace with a payload", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -483,7 +504,7 @@ describe("Socket.IO protocol", () => { }); it("should disallow connection to an unknown namespace", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -497,7 +518,7 @@ describe("Socket.IO protocol", () => { }); it("should disallow connection with an invalid handshake", async () => { - const socket = new WebSocket( + const socket = createWebSocket( `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); @@ -508,10 +529,9 @@ describe("Socket.IO protocol", () => { await waitFor(socket, "close"); }); - it("should close the connection if no handshake is received", async () => { - const socket = new WebSocket( - `${WS_URL}/socket.io/?EIO=4&transport=websocket` + const socket = createWebSocket( + `${WS_URL}/socket.io/?EIO=4&transport=websocket` ); await waitFor(socket, "close"); From be13cca94caee9dc17da4d9caadf80e95e9204b3 Mon Sep 17 00:00:00 2001 From: Wang Guan Date: Fri, 27 Jun 2025 22:14:37 +0900 Subject: [PATCH 25/51] refactor: improve type annotations and comments (#5364) --- packages/engine.io-parser/lib/commons.ts | 6 +- packages/engine.io/lib/engine.io.ts | 40 ++++--- packages/engine.io/lib/parser-v3/index.ts | 14 +-- packages/engine.io/lib/server.ts | 105 ++++++++++++------ packages/engine.io/lib/socket.ts | 7 +- packages/engine.io/lib/transport.ts | 18 ++- .../engine.io/lib/transports-uws/polling.ts | 16 ++- packages/engine.io/lib/transports/index.ts | 6 +- packages/engine.io/lib/transports/polling.ts | 16 ++- .../engine.io/lib/transports/websocket.ts | 9 +- packages/engine.io/lib/userver.ts | 35 ++++-- .../lib/in-memory-adapter.ts | 6 +- .../socket.io-cluster-engine/lib/engine.ts | 14 ++- packages/socket.io/lib/client.ts | 13 ++- packages/socket.io/lib/index.ts | 20 +++- packages/socket.io/lib/socket.ts | 2 +- 16 files changed, 218 insertions(+), 109 deletions(-) diff --git a/packages/engine.io-parser/lib/commons.ts b/packages/engine.io-parser/lib/commons.ts index 2562382f72..bbbd43c262 100644 --- a/packages/engine.io-parser/lib/commons.ts +++ b/packages/engine.io-parser/lib/commons.ts @@ -32,7 +32,11 @@ export type RawData = any; export interface Packet { type: PacketType; - options?: { compress: boolean }; + options?: { + compress: boolean; + wsPreEncoded?: string; // deprecated in favor of `wsPreEncodedFrame` + wsPreEncodedFrame?: any; // computed in the socket.io-adapter package (should be typed as Buffer) + }; data?: RawData; } diff --git a/packages/engine.io/lib/engine.io.ts b/packages/engine.io/lib/engine.io.ts index 3ba9e67f8f..54ed1a4c9b 100644 --- a/packages/engine.io/lib/engine.io.ts +++ b/packages/engine.io/lib/engine.io.ts @@ -1,27 +1,36 @@ -import { createServer } from "http"; +import { createServer, Server as HttpServer } from "http"; import { Server, AttachOptions, ServerOptions } from "./server"; import transports from "./transports/index"; import * as parser from "engine.io-parser"; export { Server, transports, listen, attach, parser }; -export type { AttachOptions, ServerOptions, BaseServer } from "./server"; +export type { + AttachOptions, + ServerOptions, + BaseServer, + ErrorCallback, +} from "./server"; export { uServer } from "./userver"; export { Socket } from "./socket"; export { Transport } from "./transport"; export const protocol = parser.protocol; /** - * Creates an http.Server exclusively used for WS upgrades. + * Creates an http.Server exclusively used for WS upgrades, and starts listening. * - * @param {Number} port - * @param {Function} callback - * @param {Object} options - * @return {Server} websocket.io server + * @param port + * @param options + * @param listenCallback - callback for http.Server.listen() + * @return engine.io server */ -function listen(port, options: AttachOptions & ServerOptions, fn) { +function listen( + port: number, + options?: AttachOptions & ServerOptions, + listenCallback?: () => void, +): Server { if ("function" === typeof options) { - fn = options; + listenCallback = options; options = {}; } @@ -34,7 +43,7 @@ function listen(port, options: AttachOptions & ServerOptions, fn) { const engine = attach(server, options); engine.httpServer = server; - server.listen(port, fn); + server.listen(port, listenCallback); return engine; } @@ -42,12 +51,15 @@ function listen(port, options: AttachOptions & ServerOptions, fn) { /** * Captures upgrade requests for a http.Server. * - * @param {http.Server} server - * @param {Object} options - * @return {Server} engine server + * @param server + * @param options + * @return engine.io server */ -function attach(server, options: AttachOptions & ServerOptions) { +function attach( + server: HttpServer, + options: AttachOptions & ServerOptions, +): Server { const engine = new Server(options); engine.attach(server, options); return engine; diff --git a/packages/engine.io/lib/parser-v3/index.ts b/packages/engine.io/lib/parser-v3/index.ts index 367ae13767..8cf34dc2f2 100644 --- a/packages/engine.io/lib/parser-v3/index.ts +++ b/packages/engine.io/lib/parser-v3/index.ts @@ -59,8 +59,7 @@ const EMPTY_BUFFER = Buffer.concat([]); * * @api private */ - -export function encodePacket (packet, supportsBinary, utf8encode, callback) { +export function encodePacket (packet: any, supportsBinary?: any, utf8encode?: any, callback?: any) { if (typeof supportsBinary === 'function') { callback = supportsBinary; supportsBinary = null; @@ -86,7 +85,7 @@ export function encodePacket (packet, supportsBinary, utf8encode, callback) { } return callback('' + encoded); -}; +} /** * Encode Buffer data @@ -120,16 +119,16 @@ export function encodeBase64Packet (packet, callback){ /** * Decodes a packet. Data also available as an ArrayBuffer if requested. * - * @return {Object} with `type` and `data` (if any) + * @return {import('engine.io-parser').Packet} with `type` and `data` (if any) * @api private */ -export function decodePacket (data, binaryType, utf8decode) { +export function decodePacket (data: any, binaryType?: any, utf8decode?: any): any { if (data === undefined) { return err; } - var type; + let type: string | number; // String data if (typeof data === 'string') { @@ -147,6 +146,7 @@ export function decodePacket (data, binaryType, utf8decode) { } } + // @ts-expect-error if (Number(type) != type || !packetslist[type]) { return err; } @@ -274,7 +274,7 @@ function map(ary, each, done) { * @api public */ -export function decodePayload (data, binaryType, callback) { +export function decodePayload (data: any, binaryType?: any, callback?: any) { if (typeof data !== 'string') { return decodePayloadAsBinary(data, binaryType, callback); } diff --git a/packages/engine.io/lib/server.ts b/packages/engine.io/lib/server.ts index bf53f994ac..1491070017 100644 --- a/packages/engine.io/lib/server.ts +++ b/packages/engine.io/lib/server.ts @@ -6,7 +6,12 @@ import { EventEmitter } from "events"; import { Socket } from "./socket"; import debugModule from "debug"; import { serialize } from "cookie"; -import { Server as DEFAULT_WS_ENGINE } from "ws"; +import { + Server as DEFAULT_WS_ENGINE, + type Server as WsServer, + type PerMessageDeflateOptions, + type WebSocket as WsWebSocket, +} from "ws"; import type { IncomingMessage, Server as HttpServer, @@ -16,14 +21,19 @@ import type { CorsOptions, CorsOptionsDelegate } from "cors"; import type { Duplex } from "stream"; import { WebTransport } from "./transports/webtransport"; import { createPacketDecoderStream } from "engine.io-parser"; -import type { EngineRequest } from "./transport"; +import type { EngineRequest, Transport } from "./transport"; import type { CookieSerializeOptions } from "./contrib/types.cookie"; const debug = debugModule("engine"); const kResponseHeaders = Symbol("responseHeaders"); -type Transport = "polling" | "websocket" | "webtransport"; +type TransportName = "polling" | "websocket" | "webtransport"; + +export type ErrorCallback = ( + errorCode?: (typeof Server.errors)[keyof typeof Server.errors], + errorContext?: Record & { name?: string; message?: string }, +) => void; export interface AttachOptions { /** @@ -90,7 +100,7 @@ export interface ServerOptions { * * @default ["polling", "websocket"] */ - transports?: Transport[]; + transports?: TransportName[]; /** * whether to allow transport upgrades * @default true @@ -100,7 +110,7 @@ export interface ServerOptions { * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable. * @default false */ - perMessageDeflate?: boolean | object; + perMessageDeflate?: boolean | PerMessageDeflateOptions; /** * parameters of the http compression for the polling transports (see zlib api docs). Set to false to disable. * @default true @@ -149,7 +159,7 @@ type Middleware = ( next: (err?: any) => void, ) => void; -function parseSessionId(data: string) { +function parseSessionId(data: string): string | undefined { try { const parsed = JSON.parse(data); if (typeof parsed.sid === "string") { @@ -224,7 +234,7 @@ export abstract class BaseServer extends EventEmitter { this.init(); } - protected abstract init(); + protected abstract init(): void; /** * Compute the pathname of the requests that are handled by the server @@ -244,10 +254,8 @@ export abstract class BaseServer extends EventEmitter { /** * Returns a list of available transports for upgrade given a certain transport. - * - * @return {Array} */ - public upgrades(transport: string) { + public upgrades(transport: TransportName): string[] { if (!this.opts.allowUpgrades) return []; return transports[transport].upgradesTo || []; } @@ -259,17 +267,18 @@ export abstract class BaseServer extends EventEmitter { * @param upgrade - whether it's an upgrade request * @param fn * @protected + * @return whether the request is valid */ protected verify( - req: any, + req: EngineRequest, upgrade: boolean, - fn: (errorCode?: number, errorContext?: any) => void, - ) { + fn: ErrorCallback, + ): void | boolean { // transport check const transport = req._query.transport; // WebTransport does not go through the verify() method, see the onWebTransportSession() method if ( - !~this.opts.transports.indexOf(transport) || + !~this.opts.transports.indexOf(transport as TransportName) || transport === "webtransport" ) { debug('unknown transport "%s"', transport); @@ -408,7 +417,7 @@ export abstract class BaseServer extends EventEmitter { * * @param {IncomingMessage} req - the request object */ - public generateId(req: IncomingMessage) { + public generateId(req: IncomingMessage): string | PromiseLike { return base64id.generateId(); } @@ -422,9 +431,9 @@ export abstract class BaseServer extends EventEmitter { * @protected */ protected async handshake( - transportName: string, - req: any, - closeConnection: (errorCode?: number, errorContext?: any) => void, + transportName: TransportName, + req: EngineRequest, + closeConnection: ErrorCallback, ) { const protocol = req._query.EIO === "4" ? 4 : 3; // 3rd revision by default if (protocol === 3 && !this.opts.allowEIO3) { @@ -600,7 +609,10 @@ export abstract class BaseServer extends EventEmitter { } } - protected abstract createTransport(transportName, req); + protected abstract createTransport( + transportName: TransportName, + req: EngineRequest, + ); /** * Protocol errors mappings. @@ -613,7 +625,7 @@ export abstract class BaseServer extends EventEmitter { BAD_REQUEST: 3, FORBIDDEN: 4, UNSUPPORTED_PROTOCOL_VERSION: 5, - }; + } as const; static errorMessages = { 0: "Transport unknown", @@ -622,7 +634,7 @@ export abstract class BaseServer extends EventEmitter { 3: "Bad request", 4: "Forbidden", 5: "Unsupported protocol version", - }; + } as const; } /** @@ -667,7 +679,7 @@ class WebSocketResponse { */ export class Server extends BaseServer { public httpServer?: HttpServer; - private ws: any; + private ws: WsServer; /** * Initialize websocket server @@ -687,7 +699,7 @@ export class Server extends BaseServer { }); if (typeof this.ws.on === "function") { - this.ws.on("headers", (headersArray, req) => { + this.ws.on("headers", (headersArray, req: EngineRequest) => { // note: 'ws' uses an array of headers, while Engine.IO uses an object (response.writeHead() accepts both formats) // we could also try to parse the array and then sync the values, but that will be error-prone const additionalHeaders = req[kResponseHeaders] || {}; @@ -730,7 +742,11 @@ export class Server extends BaseServer { } } - protected createTransport(transportName: string, req: IncomingMessage) { + protected createTransport( + transportName: TransportName, + req: IncomingMessage, + ): Transport { + // @ts-expect-error 'polling' is a plain function used as constructor return new transports[transportName](req); } @@ -745,7 +761,7 @@ export class Server extends BaseServer { this.prepare(req); req.res = res; - const callback = (errorCode, errorContext) => { + const callback: ErrorCallback = (errorCode, errorContext) => { if (errorCode !== undefined) { this.emit("connection_error", { req, @@ -763,7 +779,11 @@ export class Server extends BaseServer { } else { const closeConnection = (errorCode, errorContext) => abortRequest(res, errorCode, errorContext); - this.handshake(req._query.transport, req, closeConnection); + this.handshake( + req._query.transport as TransportName, + req, + closeConnection, + ); } }; @@ -787,7 +807,7 @@ export class Server extends BaseServer { this.prepare(req); const res = new WebSocketResponse(req, socket); - const callback = (errorCode, errorContext) => { + const callback: ErrorCallback = (errorCode, errorContext) => { if (errorCode !== undefined) { this.emit("connection_error", { req, @@ -823,11 +843,16 @@ export class Server extends BaseServer { /** * Called upon a ws.io connection. - * - * @param {ws.Socket} websocket + * @param req + * @param socket + * @param websocket * @private */ - private onWebSocket(req, socket, websocket) { + private onWebSocket( + req: EngineRequest, + socket: Duplex, + websocket: WsWebSocket, + ) { websocket.on("error", onUpgradeError); if ( @@ -862,14 +887,22 @@ export class Server extends BaseServer { // transport error handling takes over websocket.removeListener("error", onUpgradeError); - const transport = this.createTransport(req._query.transport, req); + const transport = this.createTransport( + req._query.transport as TransportName, + req, + ); + // @ts-expect-error this option is only for WebSocket impl transport.perMessageDeflate = this.opts.perMessageDeflate; client._maybeUpgrade(transport); } } else { const closeConnection = (errorCode, errorContext) => abortUpgrade(socket, errorCode, errorContext); - this.handshake(req._query.transport, req, closeConnection); + this.handshake( + req._query.transport as TransportName, + req, + closeConnection, + ); } function onUpgradeError() { @@ -947,7 +980,11 @@ export class Server extends BaseServer { * @private */ -function abortRequest(res, errorCode, errorContext) { +function abortRequest( + res: ServerResponse, + errorCode: number, + errorContext?: { message?: string }, +) { const statusCode = errorCode === Server.errors.FORBIDDEN ? 403 : 400; const message = errorContext && errorContext.message @@ -1030,7 +1067,7 @@ const validHdrChars = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // ... 255 ] -function checkInvalidHeaderChar(val) { +function checkInvalidHeaderChar(val?: string) { val += ""; if (val.length < 1) return false; if (!validHdrChars[val.charCodeAt(0)]) { diff --git a/packages/engine.io/lib/socket.ts b/packages/engine.io/lib/socket.ts index bfe6d3ba1d..c2efe8ebbe 100644 --- a/packages/engine.io/lib/socket.ts +++ b/packages/engine.io/lib/socket.ts @@ -5,6 +5,7 @@ import type { EngineRequest, Transport } from "./transport"; import type { BaseServer } from "./server"; import { setTimeout, clearTimeout } from "timers"; import type { Packet, PacketType, RawData } from "engine.io-parser"; +import type transports from "./transports"; const debug = debugModule("engine:socket"); @@ -537,9 +538,11 @@ export class Socket extends EventEmitter { */ private getAvailableUpgrades() { const availableUpgrades = []; - const allUpgrades = this.server.upgrades(this.transport.name); + const allUpgrades = this.server.upgrades( + this.transport.name as keyof typeof transports, + ); for (let i = 0; i < allUpgrades.length; ++i) { - const upg = allUpgrades[i]; + const upg = allUpgrades[i] as keyof typeof transports; if (this.server.opts.transports.indexOf(upg) !== -1) { availableUpgrades.push(upg); } diff --git a/packages/engine.io/lib/transport.ts b/packages/engine.io/lib/transport.ts index 1121e4e348..6d3b9cbf62 100644 --- a/packages/engine.io/lib/transport.ts +++ b/packages/engine.io/lib/transport.ts @@ -4,6 +4,7 @@ import * as parser_v3 from "./parser-v3/index"; import debugModule from "debug"; import type { IncomingMessage, ServerResponse } from "http"; import { Packet, RawData } from "engine.io-parser"; +import type { WebSocket } from "ws"; const debug = debugModule("engine:transport"); @@ -15,7 +16,11 @@ export type EngineRequest = IncomingMessage & { _query: Record; res?: ServerResponse; cleanup?: Function; - websocket?: any; + websocket?: WebSocket & { + _socket?: { + remoteAddress: string; + }; + }; }; export abstract class Transport extends EventEmitter { @@ -37,7 +42,7 @@ export abstract class Transport extends EventEmitter { * * @see https://github.com/socketio/engine.io-protocol */ - public protocol: number; + public protocol: 3 | 4; /** * The current state of the transport. @@ -53,7 +58,7 @@ export abstract class Transport extends EventEmitter { * The parser to use (depends on the revision of the {@link Transport#protocol}. * @protected */ - protected parser: any; + protected parser: typeof parser_v4 | typeof parser_v3; /** * Whether the transport supports binary payloads (else it will be base64-encoded) * @protected @@ -74,6 +79,11 @@ export abstract class Transport extends EventEmitter { this._readyState = state; } + /** + * The list of transports this transport can be upgraded to. + */ + static upgradesTo: string[] = []; + /** * Transport constructor. * @@ -148,7 +158,7 @@ export abstract class Transport extends EventEmitter { /** * Called with the encoded packet data. * - * @param {String} data + * @param data * @protected */ protected onData(data: RawData) { diff --git a/packages/engine.io/lib/transports-uws/polling.ts b/packages/engine.io/lib/transports-uws/polling.ts index 090270ec2f..7463b3b3d3 100644 --- a/packages/engine.io/lib/transports-uws/polling.ts +++ b/packages/engine.io/lib/transports-uws/polling.ts @@ -3,6 +3,8 @@ import { createGzip, createDeflate } from "zlib"; import * as accepts from "accepts"; import debugModule from "debug"; import { HttpRequest, HttpResponse } from "uWebSockets.js"; +import type * as parser_v4 from "engine.io-parser"; +import type * as parser_v3 from "../parser-v3/index"; const debug = debugModule("engine:polling"); @@ -228,9 +230,9 @@ export class Polling extends Transport { }; if (this.protocol === 3) { - this.parser.decodePayload(data, callback); + (this.parser as typeof parser_v3).decodePayload(data, callback); } else { - this.parser.decodePayload(data).forEach(callback); + (this.parser as typeof parser_v4).decodePayload(data).forEach(callback); } } @@ -263,7 +265,7 @@ export class Polling extends Transport { this.shouldClose = null; } - const doWrite = (data) => { + const doWrite = (data: string) => { const compress = packets.some((packet) => { return packet.options && packet.options.compress; }); @@ -271,9 +273,13 @@ export class Polling extends Transport { }; if (this.protocol === 3) { - this.parser.encodePayload(packets, this.supportsBinary, doWrite); + (this.parser as typeof parser_v3).encodePayload( + packets, + this.supportsBinary, + doWrite, + ); } else { - this.parser.encodePayload(packets, doWrite); + (this.parser as typeof parser_v4).encodePayload(packets, doWrite); } } diff --git a/packages/engine.io/lib/transports/index.ts b/packages/engine.io/lib/transports/index.ts index e585112bb1..47b3f17be1 100644 --- a/packages/engine.io/lib/transports/index.ts +++ b/packages/engine.io/lib/transports/index.ts @@ -2,9 +2,10 @@ import { Polling as XHR } from "./polling"; import { JSONP } from "./polling-jsonp"; import { WebSocket } from "./websocket"; import { WebTransport } from "./webtransport"; +import type { EngineRequest } from "../transport"; export default { - polling: polling, + polling, websocket: WebSocket, webtransport: WebTransport, }; @@ -12,8 +13,7 @@ export default { /** * Polling polymorphic constructor. */ - -function polling(req) { +function polling(req: EngineRequest) { if ("string" === typeof req._query.j) { return new JSONP(req); } else { diff --git a/packages/engine.io/lib/transports/polling.ts b/packages/engine.io/lib/transports/polling.ts index 1f46335934..15e492a19c 100644 --- a/packages/engine.io/lib/transports/polling.ts +++ b/packages/engine.io/lib/transports/polling.ts @@ -4,6 +4,8 @@ import * as accepts from "accepts"; import debugModule from "debug"; import type { IncomingMessage, ServerResponse } from "http"; import type { Packet, RawData } from "engine.io-parser"; +import type * as parser_v4 from "engine.io-parser"; +import type * as parser_v3 from "../parser-v3/index"; const debug = debugModule("engine:polling"); @@ -196,9 +198,9 @@ export class Polling extends Transport { }; if (this.protocol === 3) { - this.parser.decodePayload(data, callback); + (this.parser as typeof parser_v3).decodePayload(data, callback); } else { - this.parser.decodePayload(data).forEach(callback); + (this.parser as typeof parser_v4).decodePayload(data).forEach(callback); } } @@ -225,7 +227,7 @@ export class Polling extends Transport { this.shouldClose = null; } - const doWrite = (data) => { + const doWrite = (data: string) => { const compress = packets.some((packet) => { return packet.options && packet.options.compress; }); @@ -233,9 +235,13 @@ export class Polling extends Transport { }; if (this.protocol === 3) { - this.parser.encodePayload(packets, this.supportsBinary, doWrite); + (this.parser as typeof parser_v3).encodePayload( + packets, + this.supportsBinary, + doWrite, + ); } else { - this.parser.encodePayload(packets, doWrite); + (this.parser as typeof parser_v4).encodePayload(packets, doWrite); } } diff --git a/packages/engine.io/lib/transports/websocket.ts b/packages/engine.io/lib/transports/websocket.ts index a95f4b0f19..ebc0553fbf 100644 --- a/packages/engine.io/lib/transports/websocket.ts +++ b/packages/engine.io/lib/transports/websocket.ts @@ -1,12 +1,13 @@ import { EngineRequest, Transport } from "../transport"; import debugModule from "debug"; import type { Packet, RawData } from "engine.io-parser"; +import type { PerMessageDeflateOptions, WebSocket as WsWebSocket } from "ws"; const debug = debugModule("engine:ws"); export class WebSocket extends Transport { - protected perMessageDeflate: any; - private socket: any; + perMessageDeflate?: boolean | PerMessageDeflateOptions; + private socket: WsWebSocket; /** * WebSocket transport @@ -51,8 +52,8 @@ export class WebSocket extends Transport { if (this._canSendPreEncodedFrame(packet)) { // the WebSocket frame was computed with WebSocket.Sender.frame() // see https://github.com/websockets/ws/issues/617#issuecomment-283002469 + // @ts-expect-error use of untyped member this.socket._sender.sendFrame( - // @ts-ignore packet.options.wsPreEncodedFrame, isLast ? this._onSentLast : this._onSent, ); @@ -74,8 +75,8 @@ export class WebSocket extends Transport { private _canSendPreEncodedFrame(packet: Packet) { return ( !this.perMessageDeflate && + // @ts-expect-error use of untyped member typeof this.socket?._sender?.sendFrame === "function" && - // @ts-ignore packet.options?.wsPreEncodedFrame !== undefined ); } diff --git a/packages/engine.io/lib/userver.ts b/packages/engine.io/lib/userver.ts index e8fb47f580..71ed616fbb 100644 --- a/packages/engine.io/lib/userver.ts +++ b/packages/engine.io/lib/userver.ts @@ -2,6 +2,7 @@ import debugModule from "debug"; import { AttachOptions, BaseServer, Server } from "./server"; import { HttpRequest, HttpResponse, TemplatedApp } from "uWebSockets.js"; import transports from "./transports-uws"; +import { EngineRequest } from "./transport"; const debug = debugModule("engine:uws"); @@ -36,7 +37,7 @@ export class uServer extends BaseServer { * * @private */ - private prepare(req, res: HttpResponse) { + private prepare(req: HttpRequest & EngineRequest, res: HttpResponse) { req.method = req.getMethod().toUpperCase(); req.url = req.getUrl(); @@ -48,6 +49,7 @@ export class uServer extends BaseServer { req.headers[key] = value; }); + // @ts-expect-error req.connection = { remoteAddress: Buffer.from(res.getRemoteAddressAsText()).toString(), }; @@ -57,7 +59,7 @@ export class uServer extends BaseServer { }); } - protected createTransport(transportName, req) { + protected createTransport(transportName: string, req: EngineRequest) { return new transports[transportName](req); } @@ -123,7 +125,7 @@ export class uServer extends BaseServer { req: HttpRequest & { res: any; _query: any }, ) { debug('handling "%s" http request "%s"', req.getMethod(), req.getUrl()); - this.prepare(req, res); + this.prepare(req as unknown as HttpRequest & EngineRequest, res); req.res = res; @@ -146,7 +148,11 @@ export class uServer extends BaseServer { } else { const closeConnection = (errorCode, errorContext) => this.abortRequest(res, errorCode, errorContext); - this.handshake(req._query.transport, req, closeConnection); + this.handshake( + req._query.transport, + req as unknown as EngineRequest, + closeConnection, + ); } }; @@ -154,7 +160,11 @@ export class uServer extends BaseServer { if (err) { callback(Server.errors.BAD_REQUEST, { name: "MIDDLEWARE_FAILURE" }); } else { - this.verify(req, false, callback); + this.verify( + req as unknown as HttpRequest & EngineRequest, + false, + callback, + ); } }); } @@ -166,7 +176,7 @@ export class uServer extends BaseServer { ) { debug("on upgrade"); - this.prepare(req, res); + this.prepare(req as unknown as HttpRequest & EngineRequest, res); req.res = res; @@ -198,13 +208,16 @@ export class uServer extends BaseServer { return res.close(); } else { debug("upgrading existing transport"); - transport = this.createTransport(req._query.transport, req); + transport = this.createTransport( + req._query.transport, + req as unknown as EngineRequest, + ); client._maybeUpgrade(transport); } } else { transport = await this.handshake( req._query.transport, - req, + req as unknown as EngineRequest, (errorCode, errorContext) => this.abortRequest(res, errorCode, errorContext), ); @@ -231,15 +244,15 @@ export class uServer extends BaseServer { if (err) { callback(Server.errors.BAD_REQUEST, { name: "MIDDLEWARE_FAILURE" }); } else { - this.verify(req, true, callback); + this.verify(req as unknown as EngineRequest, true, callback); } }); } private abortRequest( res: HttpResponse | ResponseWrapper, - errorCode, - errorContext, + errorCode: number, + errorContext?: { message?: string }, ) { const statusCode = errorCode === Server.errors.FORBIDDEN diff --git a/packages/socket.io-adapter/lib/in-memory-adapter.ts b/packages/socket.io-adapter/lib/in-memory-adapter.ts index 2b78e8285e..cf178170e0 100644 --- a/packages/socket.io-adapter/lib/in-memory-adapter.ts +++ b/packages/socket.io-adapter/lib/in-memory-adapter.ts @@ -1,6 +1,6 @@ import { EventEmitter } from "events"; import { yeast } from "./contrib/yeast"; -import WebSocket = require("ws"); +import * as WebSocket from "ws"; // @ts-expect-error const canPreComputeFrame = typeof WebSocket?.Sender?.frame === "function"; @@ -51,11 +51,11 @@ export class Adapter extends EventEmitter { /** * In-memory adapter constructor. * - * @param {Namespace} nsp + * @param nsp */ constructor(readonly nsp: any) { super(); - this.encoder = nsp.server.encoder; + this.encoder = nsp.server.encoder; // nsp is a Namespace object } /** diff --git a/packages/socket.io-cluster-engine/lib/engine.ts b/packages/socket.io-cluster-engine/lib/engine.ts index 4972f31881..e12f643cb7 100644 --- a/packages/socket.io-cluster-engine/lib/engine.ts +++ b/packages/socket.io-cluster-engine/lib/engine.ts @@ -1,4 +1,10 @@ -import { Server, type ServerOptions, Socket, type Transport } from "engine.io"; +import { + Server, + type ServerOptions, + type ErrorCallback, + Socket, + type Transport, +} from "engine.io"; import { randomBytes } from "node:crypto"; import { setTimeout, clearTimeout } from "node:timers"; import { type IncomingMessage } from "node:http"; @@ -392,9 +398,9 @@ export abstract class ClusterEngine extends Server { override verify( req: IncomingMessage & { _query: Record }, upgrade: boolean, - fn: (errorCode?: number, context?: any) => void, + fn: ErrorCallback, ): void { - super.verify(req, upgrade, (errorCode: number, errorContext: any) => { + super.verify(req, upgrade, (errorCode, errorContext) => { if (errorCode !== Server.errors.UNKNOWN_SID) { return fn(errorCode, errorContext); } @@ -412,7 +418,7 @@ export abstract class ClusterEngine extends Server { req[kSenderId] = senderId; fn(); } else { - const transport = this.createTransport(transportName, req); + const transport = this.createTransport(transportName as any, req); this._hookTransport(sid, transport, lockType, senderId); transport.onRequest(req); } diff --git a/packages/socket.io/lib/client.ts b/packages/socket.io/lib/client.ts index 6ca7b77818..99ff42cd12 100644 --- a/packages/socket.io/lib/client.ts +++ b/packages/socket.io/lib/client.ts @@ -1,6 +1,6 @@ import { Decoder, Encoder, Packet, PacketType } from "socket.io-parser"; -import debugModule = require("debug"); -import url = require("url"); +import debugModule from "debug"; +import url from "url"; import type { IncomingMessage } from "http"; import type { Server } from "./index"; import type { Namespace } from "./namespace"; @@ -61,12 +61,13 @@ export class Client< */ constructor( server: Server, - conn: any, + conn: RawSocket, ) { this.server = server; this.conn = conn; this.encoder = server.encoder; this.decoder = new server._parser.Decoder(); + // @ts-expect-error use of private this.id = conn.id; this.setup(); } @@ -216,13 +217,13 @@ export class Client< * @param {Object} opts * @private */ - _packet(packet: Packet | any[], opts: WriteOptions = {}): void { + _packet(packet: Packet | Packet[], opts: WriteOptions = {}): void { if (this.conn.readyState !== "open") { debug("ignoring packet write %j", packet); return; } const encodedPackets = opts.preEncoded - ? (packet as any[]) // previous versions of the adapter incorrectly used socket.packet() instead of writeToEngine() + ? (packet as Packet[]) // previous versions of the adapter incorrectly used socket.packet() instead of writeToEngine() : this.encoder.encode(packet as Packet); this.writeToEngine(encodedPackets, opts); } @@ -250,7 +251,7 @@ export class Client< * * @private */ - private ondata(data): void { + private ondata(data: unknown): void { // try/catch is needed for protocol violations (GH-1880) try { this.decoder.add(data); diff --git a/packages/socket.io/lib/index.ts b/packages/socket.io/lib/index.ts index b77b8fd3fd..5653911b33 100644 --- a/packages/socket.io/lib/index.ts +++ b/packages/socket.io/lib/index.ts @@ -1,4 +1,4 @@ -import http = require("http"); +import http from "http"; import type { Server as HTTPSServer } from "https"; import type { Http2SecureServer, Http2Server } from "http2"; import { createReadStream } from "fs"; @@ -7,7 +7,11 @@ import accepts = require("accepts"); import { pipeline } from "stream"; import path = require("path"); import { attach, Server as Engine, uServer } from "engine.io"; -import type { ServerOptions as EngineOptions, AttachOptions } from "engine.io"; +import type { + ServerOptions as EngineOptions, + AttachOptions, + Socket as RawSocket, +} from "engine.io"; import { Client } from "./client"; import { EventEmitter } from "events"; import { ExtendedError, Namespace, ServerReservedEventsMap } from "./namespace"; @@ -506,6 +510,11 @@ export class Server< return this; } + /** + * Attaches socket.io to a uWebSockets.js app. + * @param app + * @param opts + */ public attachApp(app /*: TemplatedApp */, opts: Partial = {}) { // merge the options passed to the Socket.IO server Object.assign(opts, this.opts); @@ -582,7 +591,7 @@ export class Server< ): void { // initialize engine debug("creating engine.io instance with opts %j", opts); - this.eio = attach(srv, opts); + this.eio = attach(srv as http.Server, opts); // attach static file serving if (this._serveClient) this.attachServe(srv); @@ -723,11 +732,12 @@ export class Server< * @return self * @private */ - private onconnection(conn): this { + private onconnection(conn: RawSocket): this { + // @ts-expect-error use of private debug("incoming connection with id %s", conn.id); const client = new Client(this, conn); if (conn.protocol === 3) { - // @ts-ignore + // @ts-expect-error use of private client.connect("/"); } return this; diff --git a/packages/socket.io/lib/socket.ts b/packages/socket.io/lib/socket.ts index 719b597e59..55131fcee7 100644 --- a/packages/socket.io/lib/socket.ts +++ b/packages/socket.io/lib/socket.ts @@ -163,7 +163,7 @@ export class Socket< ) { super(); this.server = nsp.server; - this.adapter = this.nsp.adapter; + this.adapter = nsp.adapter; if (previousSession) { this.id = previousSession.sid; this.pid = previousSession.pid; From 3be6481d9db90a8d6933e2a7dd39fcbb373e30a1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Sat, 9 Aug 2025 09:20:38 +0200 Subject: [PATCH 26/51] ci: pin Node.js 22 version Related: https://github.com/nodejs/node/issues/59364 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6acb3241c4..553beee6b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: node-version: - 18 - 20 - - 22 + - 22.17.1 # experimental TS type striping in 22.18.0 breaks the build services: redis: From a66ed68506384e82ccc22b1b0cf992963afac8cb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 3 Sep 2025 08:58:27 +0200 Subject: [PATCH 27/51] docs(protocol): add test with cancelled request Related: https://github.com/socketio/bun-engine/commit/8f1ea3d58fe0400cdd429e727c8373c48340c888 --- .../v4-test-suite/test-suite.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/engine.io-protocol/v4-test-suite/test-suite.js b/docs/engine.io-protocol/v4-test-suite/test-suite.js index b010f50967..be67939d09 100644 --- a/docs/engine.io-protocol/v4-test-suite/test-suite.js +++ b/docs/engine.io-protocol/v4-test-suite/test-suite.js @@ -332,6 +332,25 @@ describe("Engine.IO protocol", () => { expect(pollResponse.status).to.eql(400); }); + + it("closes the session upon cancelled polling request", async () => { + const sid = await initLongPollingSession(); + const controller = new AbortController(); + + fetch(`${URL}/engine.io/?EIO=4&transport=polling&sid=${sid}`, { + signal: controller.signal, + }).catch(() => {}); + + await sleep(5); + + controller.abort(); + + const pollResponse = await fetch( + `${URL}/engine.io/?EIO=4&transport=polling&sid=${sid}`, + ); + + expect(pollResponse.status).to.eql(400); + }); }); describe("WebSocket", () => { From 0a8f91047c76b307ff2e41e91b205a190e44124c Mon Sep 17 00:00:00 2001 From: Lou Klepner Date: Thu, 4 Sep 2025 03:22:40 -0400 Subject: [PATCH 28/51] docs: fix adapter link (#2) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c723b86fe5..555fca6e2d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ The `@socket.io/postgres-emitter` package allows you to easily communicate with ![Emitter diagram](./assets/emitter.png) -It must be used in conjunction with [`@socket.io/posgres-adapter`](https://github.com/socketio/socket.io-posgres-adapter/). +It must be used in conjunction with [`@socket.io/postgres-adapter`](https://github.com/socketio/socket.io-postgres-adapter/). Supported features: From 42480e9a7fdad9ff8ca97fb1b1515c2adbc7f094 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 4 Sep 2025 08:30:20 +0200 Subject: [PATCH 29/51] chore: prepare migration to monorepo --- .../socket.io-postgres-emitter/CHANGELOG.md | 0 .../socket.io-postgres-emitter/LICENSE | 0 .../socket.io-postgres-emitter/README.md | 0 .../assets}/emitter.excalidraw | 0 .../socket.io-postgres-emitter/assets}/emitter.png | Bin .../socket.io-postgres-emitter/docker-compose.yml | 0 .../socket.io-postgres-emitter/lib}/index.ts | 0 .../socket.io-postgres-emitter/lib}/typed-events.ts | 0 .../socket.io-postgres-emitter/package-lock.json | 0 .../socket.io-postgres-emitter/package.json | 0 .../socket.io-postgres-emitter/test}/index.ts | 0 .../socket.io-postgres-emitter/test}/util.ts | 0 .../socket.io-postgres-emitter/tsconfig.json | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename CHANGELOG.md => packages/socket.io-postgres-emitter/CHANGELOG.md (100%) rename LICENSE => packages/socket.io-postgres-emitter/LICENSE (100%) rename README.md => packages/socket.io-postgres-emitter/README.md (100%) rename {assets => packages/socket.io-postgres-emitter/assets}/emitter.excalidraw (100%) rename {assets => packages/socket.io-postgres-emitter/assets}/emitter.png (100%) rename docker-compose.yml => packages/socket.io-postgres-emitter/docker-compose.yml (100%) rename {lib => packages/socket.io-postgres-emitter/lib}/index.ts (100%) rename {lib => packages/socket.io-postgres-emitter/lib}/typed-events.ts (100%) rename package-lock.json => packages/socket.io-postgres-emitter/package-lock.json (100%) rename package.json => packages/socket.io-postgres-emitter/package.json (100%) rename {test => packages/socket.io-postgres-emitter/test}/index.ts (100%) rename {test => packages/socket.io-postgres-emitter/test}/util.ts (100%) rename tsconfig.json => packages/socket.io-postgres-emitter/tsconfig.json (100%) diff --git a/CHANGELOG.md b/packages/socket.io-postgres-emitter/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/socket.io-postgres-emitter/CHANGELOG.md diff --git a/LICENSE b/packages/socket.io-postgres-emitter/LICENSE similarity index 100% rename from LICENSE rename to packages/socket.io-postgres-emitter/LICENSE diff --git a/README.md b/packages/socket.io-postgres-emitter/README.md similarity index 100% rename from README.md rename to packages/socket.io-postgres-emitter/README.md diff --git a/assets/emitter.excalidraw b/packages/socket.io-postgres-emitter/assets/emitter.excalidraw similarity index 100% rename from assets/emitter.excalidraw rename to packages/socket.io-postgres-emitter/assets/emitter.excalidraw diff --git a/assets/emitter.png b/packages/socket.io-postgres-emitter/assets/emitter.png similarity index 100% rename from assets/emitter.png rename to packages/socket.io-postgres-emitter/assets/emitter.png diff --git a/docker-compose.yml b/packages/socket.io-postgres-emitter/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to packages/socket.io-postgres-emitter/docker-compose.yml diff --git a/lib/index.ts b/packages/socket.io-postgres-emitter/lib/index.ts similarity index 100% rename from lib/index.ts rename to packages/socket.io-postgres-emitter/lib/index.ts diff --git a/lib/typed-events.ts b/packages/socket.io-postgres-emitter/lib/typed-events.ts similarity index 100% rename from lib/typed-events.ts rename to packages/socket.io-postgres-emitter/lib/typed-events.ts diff --git a/package-lock.json b/packages/socket.io-postgres-emitter/package-lock.json similarity index 100% rename from package-lock.json rename to packages/socket.io-postgres-emitter/package-lock.json diff --git a/package.json b/packages/socket.io-postgres-emitter/package.json similarity index 100% rename from package.json rename to packages/socket.io-postgres-emitter/package.json diff --git a/test/index.ts b/packages/socket.io-postgres-emitter/test/index.ts similarity index 100% rename from test/index.ts rename to packages/socket.io-postgres-emitter/test/index.ts diff --git a/test/util.ts b/packages/socket.io-postgres-emitter/test/util.ts similarity index 100% rename from test/util.ts rename to packages/socket.io-postgres-emitter/test/util.ts diff --git a/tsconfig.json b/packages/socket.io-postgres-emitter/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/socket.io-postgres-emitter/tsconfig.json From 32257b6cb89f9dac15e69e1d6ee76365ff262170 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 5 Sep 2025 07:07:57 +0200 Subject: [PATCH 30/51] fix(postgres-emitter): use parameterized query to send the NOTIFY command Related: - https://github.com/socketio/socket.io-postgres-emitter/issues/1 - https://github.com/socketio/socket.io-postgres-adapter/pull/1 --- packages/socket.io-postgres-emitter/lib/index.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/socket.io-postgres-emitter/lib/index.ts b/packages/socket.io-postgres-emitter/lib/index.ts index d52361bfca..76ab377237 100644 --- a/packages/socket.io-postgres-emitter/lib/index.ts +++ b/packages/socket.io-postgres-emitter/lib/index.ts @@ -380,9 +380,10 @@ export class BroadcastOperator< document.type, this.emitter.channel, ); - await this.emitter.pool.query( - `NOTIFY "${this.emitter.channel}", '${payload}'`, - ); + await this.emitter.pool.query("SELECT pg_notify($1, $2)", [ + this.emitter.channel, + payload, + ]); } catch (err) { // @ts-ignore this.emit("error", err); @@ -407,9 +408,10 @@ export class BroadcastOperator< type: document.type, attachmentId, }); - this.emitter.pool.query( - `NOTIFY "${this.emitter.channel}", '${headerPayload}'`, - ); + await this.emitter.pool.query("SELECT pg_notify($1, $2)", [ + this.emitter.channel, + headerPayload, + ]); } /** From 96d907b9b5c26cbccfdc4068887752b3fd9f28bf Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 5 Sep 2025 07:18:00 +0200 Subject: [PATCH 31/51] docs(postgres-emitter): add dark version of the explanation diagram --- packages/socket.io-postgres-emitter/README.md | 5 ++++- .../assets/emitter.png | Bin 102189 -> 91281 bytes .../assets/emitter_dark.png | Bin 0 -> 119262 bytes 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 packages/socket.io-postgres-emitter/assets/emitter_dark.png diff --git a/packages/socket.io-postgres-emitter/README.md b/packages/socket.io-postgres-emitter/README.md index 555fca6e2d..5b1edc7486 100644 --- a/packages/socket.io-postgres-emitter/README.md +++ b/packages/socket.io-postgres-emitter/README.md @@ -2,7 +2,10 @@ The `@socket.io/postgres-emitter` package allows you to easily communicate with a group of Socket.IO servers from another Node.js process (server-side). -![Emitter diagram](./assets/emitter.png) + + + Diagram of Socket.IO packets forwarded through PostgreSQL + It must be used in conjunction with [`@socket.io/postgres-adapter`](https://github.com/socketio/socket.io-postgres-adapter/). diff --git a/packages/socket.io-postgres-emitter/assets/emitter.png b/packages/socket.io-postgres-emitter/assets/emitter.png index 1fd451293d0e696cba7551c3dc6e2c900528685c..b6b02c7d69094792196b5f4e8d6174076be0bde3 100644 GIT binary patch literal 91281 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%0Dq~U=2|mFOcCF|7P|5f;W`YFNr4g62~ZE-_N>0 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 literal 102189 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 Mwxey*t)_(hAAwDxoB#j- diff --git a/packages/socket.io-postgres-emitter/assets/emitter_dark.png b/packages/socket.io-postgres-emitter/assets/emitter_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..75ba1999705388b48f189bacc12b80418ad0f823 GIT binary patch literal 119262 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
N_KAW?1)m6!V-nauXRXGMTb-g;h^N; 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
G?yebCn*j-jnlrc%{_G&KMmi(KfWUt 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 s_a-7juHrl~1UAmUT|zC&ujw}>cBj0WUE-J6(7- Date: Fri, 5 Sep 2025 07:20:29 +0200 Subject: [PATCH 32/51] refactor(postgres-emitter): update compose file --- .../{docker-compose.yml => compose.yaml} | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename packages/socket.io-postgres-emitter/{docker-compose.yml => compose.yaml} (74%) diff --git a/packages/socket.io-postgres-emitter/docker-compose.yml b/packages/socket.io-postgres-emitter/compose.yaml similarity index 74% rename from packages/socket.io-postgres-emitter/docker-compose.yml rename to packages/socket.io-postgres-emitter/compose.yaml index 2e8322150b..84ebf53d4c 100644 --- a/packages/socket.io-postgres-emitter/docker-compose.yml +++ b/packages/socket.io-postgres-emitter/compose.yaml @@ -1,8 +1,6 @@ -version: "3" - services: postgres: - image: postgres:12 + image: postgres:14 ports: - "5432:5432" environment: From ac3df9a747a73d92bd49d62b666ca175a9f9b2f1 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 5 Sep 2025 07:27:48 +0200 Subject: [PATCH 33/51] chore(release): @socket.io/postgres-emitter@0.1.1 --- .../socket.io-postgres-emitter/CHANGELOG.md | 19 +++++++++++++++++-- .../socket.io-postgres-emitter/package.json | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/socket.io-postgres-emitter/CHANGELOG.md b/packages/socket.io-postgres-emitter/CHANGELOG.md index d8ed55115a..84aa76165a 100644 --- a/packages/socket.io-postgres-emitter/CHANGELOG.md +++ b/packages/socket.io-postgres-emitter/CHANGELOG.md @@ -1,4 +1,19 @@ -# 0.1.0 (2021-06-14) +# History -Initial commit +| Version | Release date | +|--------------------------|----------------| +| [0.1.1](#011-2025-09-05) | September 2025 | +| [0.1.0](#010-2021-06-14) | June 2021 | +# Release notes + +## 0.1.1 (2025-09-05) + +### Bug Fixes + +* use parameterized query to send the NOTIFY command ([32257b6](https://github.com/socketio/socket.io/commit/32257b6cb89f9dac15e69e1d6ee76365ff262170)) + + +## 0.1.0 (2021-06-14) + +Initial release! diff --git a/packages/socket.io-postgres-emitter/package.json b/packages/socket.io-postgres-emitter/package.json index 6eadedfe8d..5e258caf85 100644 --- a/packages/socket.io-postgres-emitter/package.json +++ b/packages/socket.io-postgres-emitter/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/postgres-emitter", - "version": "0.1.0", + "version": "0.1.1", "description": "The Socket.IO Postgres emitter, allowing to communicate with a group of Socket.IO servers from another Node.js process", "license": "MIT", "homepage": "https://github.com/socketio/socket.io/tree/main/packages/socket.io-postgres-emitter#readme", From 6f9b198bc8b3abd3c6a5e5c0b81b7a89d181dff0 Mon Sep 17 00:00:00 2001 From: Avi Vahl Date: Thu, 11 Sep 2025 08:51:07 +0300 Subject: [PATCH 34/51] chore(deps): ws@8.18.3, debug@4.4.1 (#5335) Release notes: - https://github.com/websockets/ws/releases/tag/8.18.3 - https://github.com/debug-js/debug/releases/tag/4.4.1 --- examples/basic-websocket-client/package.json | 2 +- package-lock.json | 124 +++++++++++++----- package.json | 2 +- packages/engine.io-client/package.json | 4 +- packages/engine.io/package.json | 4 +- packages/socket.io-adapter/package.json | 4 +- packages/socket.io-client/package.json | 2 +- .../socket.io-cluster-engine/package.json | 2 +- packages/socket.io-parser/package.json | 2 +- .../socket.io-postgres-emitter/package.json | 2 +- packages/socket.io/package.json | 2 +- 11 files changed, 103 insertions(+), 47 deletions(-) diff --git a/examples/basic-websocket-client/package.json b/examples/basic-websocket-client/package.json index a6f807c266..4094b8fd5d 100644 --- a/examples/basic-websocket-client/package.json +++ b/examples/basic-websocket-client/package.json @@ -7,7 +7,7 @@ "prettier": "^2.8.4", "rollup": "^3.20.2", "socket.io": "^4.6.1", - "ws": "^8.13.0" + "ws": "^8.18.3" }, "scripts": { "bundle": "rollup -c", diff --git a/package-lock.json b/package-lock.json index ddc7617c19..8ada9727ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2369,6 +2369,13 @@ } } }, + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/@puppeteer/browsers/node_modules/tar-fs": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", @@ -2770,6 +2777,24 @@ "node": ">= 10" } }, + "node_modules/@socket.io/postgres-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@socket.io/postgres-adapter/node_modules/socket.io-adapter": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", @@ -5986,11 +6011,12 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6464,6 +6490,15 @@ "node": ">=16" } }, + "node_modules/devtools/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/devtools/node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -10462,12 +10497,6 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/mocha/node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10505,9 +10534,10 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/mute-stream": { "version": "1.0.0", @@ -12006,6 +12036,13 @@ "node": ">=12" } }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/puppeteer-core/node_modules/proxy-agent": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", @@ -13033,12 +13070,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -15457,9 +15488,10 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -15700,9 +15732,9 @@ "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", - "debug": "~4.3.1", + "debug": "~4.4.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" + "ws": "~8.18.3" }, "engines": { "node": ">=10.2.0" @@ -15713,9 +15745,9 @@ "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", + "debug": "~4.4.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", + "ws": "~8.18.3", "xmlhttprequest-ssl": "~2.1.1" } }, @@ -15750,6 +15782,12 @@ } } }, + "packages/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, "packages/socket.io": { "version": "4.8.1", "license": "MIT", @@ -15757,7 +15795,7 @@ "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", - "debug": "~4.3.2", + "debug": "~4.4.1", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" @@ -15770,8 +15808,8 @@ "version": "2.5.5", "license": "MIT", "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" + "debug": "~4.4.1", + "ws": "~8.18.3" } }, "packages/socket.io-client": { @@ -15779,7 +15817,7 @@ "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", + "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" }, @@ -15803,13 +15841,19 @@ } } }, + "packages/socket.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, "packages/socket.io-cluster-engine": { "name": "@socket.io/cluster-engine", "version": "0.1.0", "license": "MIT", "dependencies": { "@msgpack/msgpack": "~2.8.0", - "debug": "~4.3.3", + "debug": "~4.4.1", "engine.io": "~6.6.0", "engine.io-parser": "~5.2.3" }, @@ -15839,7 +15883,7 @@ "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "~4.4.1" }, "engines": { "node": ">=10.0.0" @@ -15861,13 +15905,19 @@ } } }, + "packages/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, "packages/socket.io-postgres-emitter": { "name": "@socket.io/postgres-emitter", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "@msgpack/msgpack": "^2.7.0", - "debug": "~4.3.1" + "debug": "~4.4.1" } }, "packages/socket.io-postgres-emitter/node_modules/debug": { @@ -15886,6 +15936,12 @@ "optional": true } } + }, + "packages/socket.io-postgres-emitter/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" } } } diff --git a/package.json b/package.json index 3ee746718b..8289f2d52e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "overrides": { "@types/estree": "0.0.52", "@types/lodash": "4.14.189", - "ws": "8.17.1" + "ws": "8.18.3" }, "devDependencies": { "@babel/core": "^7.24.7", diff --git a/packages/engine.io-client/package.json b/packages/engine.io-client/package.json index 6cad940749..228c49255d 100644 --- a/packages/engine.io-client/package.json +++ b/packages/engine.io-client/package.json @@ -53,9 +53,9 @@ ], "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", + "debug": "~4.4.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", + "ws": "~8.18.3", "xmlhttprequest-ssl": "~2.1.1" }, "scripts": { diff --git a/packages/engine.io/package.json b/packages/engine.io/package.json index ed8386ea3b..32c34d3d63 100644 --- a/packages/engine.io/package.json +++ b/packages/engine.io/package.json @@ -37,9 +37,9 @@ "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", - "debug": "~4.3.1", + "debug": "~4.4.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" + "ws": "~8.18.3" }, "scripts": { "compile": "rimraf ./build && tsc", diff --git a/packages/socket.io-adapter/package.json b/packages/socket.io-adapter/package.json index 5019cbdf3e..178f2251e2 100644 --- a/packages/socket.io-adapter/package.json +++ b/packages/socket.io-adapter/package.json @@ -17,8 +17,8 @@ "types": "./dist/index.d.ts", "description": "default socket.io in-memory adapter", "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" + "debug": "~4.4.1", + "ws": "~8.18.3" }, "scripts": { "compile": "rimraf ./dist && tsc", diff --git a/packages/socket.io-client/package.json b/packages/socket.io-client/package.json index 8339978eee..b776065863 100644 --- a/packages/socket.io-client/package.json +++ b/packages/socket.io-client/package.json @@ -46,7 +46,7 @@ "types": "./build/esm/index.d.ts", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", + "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" }, diff --git a/packages/socket.io-cluster-engine/package.json b/packages/socket.io-cluster-engine/package.json index 42261b7d08..eda2350ad0 100644 --- a/packages/socket.io-cluster-engine/package.json +++ b/packages/socket.io-cluster-engine/package.json @@ -19,7 +19,7 @@ ], "dependencies": { "@msgpack/msgpack": "~2.8.0", - "debug": "~4.3.3", + "debug": "~4.4.1", "engine.io": "~6.6.0", "engine.io-parser": "~5.2.3" }, diff --git a/packages/socket.io-parser/package.json b/packages/socket.io-parser/package.json index e773ee95dc..df4fc6e915 100644 --- a/packages/socket.io-parser/package.json +++ b/packages/socket.io-parser/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "~4.4.1" }, "scripts": { "compile": "rimraf ./build && tsc && tsc -p tsconfig.esm.json && ./postcompile.sh", diff --git a/packages/socket.io-postgres-emitter/package.json b/packages/socket.io-postgres-emitter/package.json index 5e258caf85..08618647b9 100644 --- a/packages/socket.io-postgres-emitter/package.json +++ b/packages/socket.io-postgres-emitter/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@msgpack/msgpack": "^2.7.0", - "debug": "~4.3.1" + "debug": "~4.4.1" }, "keywords": [ "socket.io", diff --git a/packages/socket.io/package.json b/packages/socket.io/package.json index e7fdb3b40e..f15ff2d93c 100644 --- a/packages/socket.io/package.json +++ b/packages/socket.io/package.json @@ -53,7 +53,7 @@ "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", - "debug": "~4.3.2", + "debug": "~4.4.1", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" From 1da9cddeab0bf5ce41890d156d73af8194cef656 Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Wed, 27 Nov 2024 11:45:16 +0800 Subject: [PATCH 35/51] fix(eio-client): properly handle port option (#5241) Passing { port: "443" } would include the port in the URL (":443"). --- packages/engine.io-client/lib/transport.ts | 2 +- packages/engine.io-client/test/transport.js | 26 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/engine.io-client/lib/transport.ts b/packages/engine.io-client/lib/transport.ts index ba9407157c..ab72c70961 100644 --- a/packages/engine.io-client/lib/transport.ts +++ b/packages/engine.io-client/lib/transport.ts @@ -192,7 +192,7 @@ export abstract class Transport extends Emitter< private _port() { if ( this.opts.port && - ((this.opts.secure && Number(this.opts.port !== 443)) || + ((this.opts.secure && Number(this.opts.port) !== 443) || (!this.opts.secure && Number(this.opts.port) !== 80)) ) { return ":" + this.opts.port; diff --git a/packages/engine.io-client/test/transport.js b/packages/engine.io-client/test/transport.js index 47016fc3ab..d89057c000 100644 --- a/packages/engine.io-client/test/transport.js +++ b/packages/engine.io-client/test/transport.js @@ -116,6 +116,32 @@ describe("Transport", () => { expect(polling.uri()).to.contain("https://localhost/engine.io?sid=test"); }); + it("should generate an https uri w/o a port (string)", () => { + const polling = new eio.transports.polling({ + path: "/engine.io", + hostname: "localhost", + secure: true, + query: { sid: "test" }, + port: "443", + timestampRequests: false, + }); + expect(polling.uri()).to.contain("https://localhost/engine.io?sid=test"); + }); + + it("should generate an https uri with a port", () => { + const polling = new eio.transports.polling({ + path: "/engine.io", + hostname: "localhost", + secure: true, + query: { sid: "test" }, + port: 8443, + timestampRequests: false, + }); + expect(polling.uri()).to.contain( + "https://localhost:8443/engine.io?sid=test", + ); + }); + it("should generate a timestamped uri", () => { const polling = new eio.transports.polling({ path: "/engine.io", From e97549259e7e96dbdb5fdd291e913f0729d35f49 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 30 Sep 2025 11:34:38 +0200 Subject: [PATCH 36/51] ci(browser): use Windows 8 for IE tests --- packages/socket.io-client/wdio.conf.js | 2 +- packages/socket.io-parser/wdio.conf.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/socket.io-client/wdio.conf.js b/packages/socket.io-client/wdio.conf.js index fc9d8f583b..6a1cc6fc59 100644 --- a/packages/socket.io-client/wdio.conf.js +++ b/packages/socket.io-client/wdio.conf.js @@ -60,7 +60,7 @@ if (process.env.CI === "true") { { browserName: "internet explorer", browserVersion: "10", - platformName: "Windows 7", + platformName: "Windows 8", "sauce:options": BASE_SAUCE_OPTIONS, }, { diff --git a/packages/socket.io-parser/wdio.conf.js b/packages/socket.io-parser/wdio.conf.js index b5dc800a96..bb16284892 100644 --- a/packages/socket.io-parser/wdio.conf.js +++ b/packages/socket.io-parser/wdio.conf.js @@ -53,7 +53,7 @@ if (process.env.CI === "true") { { browserName: "internet explorer", browserVersion: "10", - platformName: "Windows 7", + platformName: "Windows 8", "sauce:options": BASE_SAUCE_OPTIONS, }, { From f3e1f5ebdf59158d0c8d1e20f8230275617fb355 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 9 Oct 2025 09:06:44 +0200 Subject: [PATCH 37/51] fix(sio): call adapter.init() when creating each namespace The init() method of the adapter will now be called when creating a namespace with `io.of()`. Note: any promise rejection is silently caught, as I don't see how we could properly expose the promise. ```js const io = new Server({ adapter: myAdapter }); // under the hood, this: // - implicitly creates the main namespace (/) // - creates an instance of `myAdapter` for the main namespace // - calls `myAdapter.init()` (with this change) ``` Related: - https://github.com/socketio/socket.io/issues/3662 - https://github.com/socketio/socket.io-postgres-adapter/issues/16 --- packages/socket.io/lib/namespace.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/socket.io/lib/namespace.ts b/packages/socket.io/lib/namespace.ts index 8fd306b9f5..72df7301e3 100644 --- a/packages/socket.io/lib/namespace.ts +++ b/packages/socket.io/lib/namespace.ts @@ -197,6 +197,10 @@ export class Namespace< _initAdapter(): void { // @ts-ignore this.adapter = new (this.server.adapter()!)(this); + + Promise.resolve(this.adapter.init()).catch((err) => { + debug("error while initializing adapter: %s", err); + }); } /** From 625fd66d734f2c8d0b637c0ea37a43d4cc796e13 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 10 Oct 2025 09:11:54 +0200 Subject: [PATCH 38/51] chore: dedupe debug dependency --- package-lock.json | 90 ----------------------------------------------- 1 file changed, 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ada9727ed..934f3f77bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6014,7 +6014,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -15766,28 +15765,6 @@ "node": ">=10.0.0" } }, - "packages/engine.io/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "packages/engine.io/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, "packages/socket.io": { "version": "4.8.1", "license": "MIT", @@ -15825,28 +15802,6 @@ "node": ">=10.0.0" } }, - "packages/socket.io-client/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "packages/socket.io-client/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, "packages/socket.io-cluster-engine": { "name": "@socket.io/cluster-engine", "version": "0.1.0", @@ -15889,28 +15844,6 @@ "node": ">=10.0.0" } }, - "packages/socket.io-parser/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "packages/socket.io-parser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, "packages/socket.io-postgres-emitter": { "name": "@socket.io/postgres-emitter", "version": "0.1.1", @@ -15919,29 +15852,6 @@ "@msgpack/msgpack": "^2.7.0", "debug": "~4.4.1" } - }, - "packages/socket.io-postgres-emitter/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "packages/socket.io-postgres-emitter/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" } } } From cf6816afcff25c227b14ae6981e421bcad5af331 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 10 Oct 2025 09:29:29 +0200 Subject: [PATCH 39/51] chore: npm audit fix --- package-lock.json | 3908 +++++++++++++++++++++------------------------ 1 file changed, 1843 insertions(+), 2065 deletions(-) diff --git a/package-lock.json b/package-lock.json index 934f3f77bb..423e60d9ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,13 +91,15 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -430,19 +432,21 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -472,38 +476,28 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.28.4" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1743,32 +1737,25 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1796,14 +1783,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1836,6 +1823,7 @@ "resolved": "https://registry.npmjs.org/@eggjs/yauzl/-/yauzl-2.11.0.tgz", "integrity": "sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer2": "^1.2.0" @@ -2092,6 +2080,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -2116,6 +2105,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -2128,67 +2118,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -2232,10 +2161,11 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -2267,6 +2197,19 @@ "node": ">= 10" } }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2302,6 +2245,16 @@ "node": ">= 8" } }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2547,10 +2500,11 @@ } }, "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2719,6 +2673,7 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2811,6 +2766,7 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -2818,17 +2774,6 @@ "node": ">=10" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -2873,6 +2818,7 @@ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -2934,19 +2880,22 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -2956,6 +2905,7 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -2971,6 +2921,7 @@ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3027,6 +2978,7 @@ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3041,7 +2993,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/which": { "version": "2.0.2", @@ -3050,19 +3003,21 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3071,7 +3026,8 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/yauzl": { "version": "2.10.3", @@ -3083,37 +3039,52 @@ "@types/node": "*" } }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", "dev": true, + "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@wdio/cli": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.39.1.tgz", - "integrity": "sha512-CUze/nbOMzgSEp+Qo27dnM5IhlOPAiBJCPX3xO85/kjweqqxmAB1QBKww1Mz9YlNIXineaHrkgqlUQIvEqOJdQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.46.0.tgz", + "integrity": "sha512-ZT7z4buheFtoXmL8/EPyrspXSwrVRKUI27GLY34hGOjHAhry4dTJ1ODC5ARs0PbuM//yJcJb8q18wa+2xGqf3w==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^20.1.1", - "@vitest/snapshot": "^1.2.1", - "@wdio/config": "8.39.0", - "@wdio/globals": "8.39.1", + "@types/node": "^22.2.0", + "@vitest/snapshot": "^2.0.4", + "@wdio/config": "8.46.0", + "@wdio/globals": "8.46.0", "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/protocols": "8.44.0", + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", "async-exit-hook": "^2.0.1", "chalk": "^5.2.0", - "chokidar": "^3.5.3", + "chokidar": "^4.0.0", "cli-spinners": "^2.9.0", "dotenv": "^16.3.1", "ejs": "^3.1.9", @@ -3125,7 +3096,7 @@ "lodash.union": "^4.6.0", "read-pkg-up": "10.0.0", "recursive-readdir": "^2.2.3", - "webdriverio": "8.39.1", + "webdriverio": "8.46.0", "yargs": "^17.7.2" }, "bin": { @@ -3136,12 +3107,26 @@ } }, "node_modules/@wdio/cli/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@wdio/cli/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, "node_modules/@wdio/cli/node_modules/chalk": { @@ -3156,6 +3141,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@wdio/cli/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@wdio/cli/node_modules/find-up": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", @@ -3345,6 +3346,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@wdio/cli/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@wdio/cli/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -3369,6 +3384,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@wdio/cli/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@wdio/cli/node_modules/yocto-queue": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", @@ -3382,14 +3404,15 @@ } }, "node_modules/@wdio/config": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.39.0.tgz", - "integrity": "sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.46.0.tgz", + "integrity": "sha512-WrNPCqm22vuNimGJc8UCc6duEcvOy2foY5I8mv2AUaoTtvCZOfVGRrFnPreypOKVdZChubFCaWrKVNqjgMK5RA==", "dev": true, + "license": "MIT", "dependencies": { "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", "decamelize": "^6.0.0", "deepmerge-ts": "^5.0.0", "glob": "^10.2.2", @@ -3399,20 +3422,45 @@ "node": "^16.13 || >=18" } }, + "node_modules/@wdio/config/node_modules/@types/node": { + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@wdio/config/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, "node_modules/@wdio/config/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@wdio/config/node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.1.tgz", + "integrity": "sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3421,12 +3469,13 @@ } }, "node_modules/@wdio/config/node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -3441,6 +3490,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -3457,16 +3507,14 @@ } }, "node_modules/@wdio/config/node_modules/jackspeak": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.2.tgz", - "integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": "14 >=14.21 || 16 >=16.20 || >=18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -3475,19 +3523,18 @@ } }, "node_modules/@wdio/config/node_modules/lru-cache": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.2.tgz", - "integrity": "sha512-voV4dDrdVZVNz84n39LFKDaRzfwhdzJ7akpyXfTMxCgRUp07U3lcJUXRlhTKP17rgt09sUzLi5iCitpEAr+6ug==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "engines": { - "node": "14 || 16 || 18 || 20 || >=22" - } + "license": "ISC" }, "node_modules/@wdio/config/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3503,6 +3550,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -3519,6 +3567,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -3526,30 +3575,39 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@wdio/config/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@wdio/globals": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.39.1.tgz", - "integrity": "sha512-kNb1TlxI8Le/tsOiw7CMQcG0+ZGyxk9ZDO/PQLxkJvjo/q2QmiBcgaNMPuf+j1ABETcQK4bI7QtiT5uZ+f2AGA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.46.0.tgz", + "integrity": "sha512-0VtP2BG3ImU/BQH0rMGhewuxogp5KPNUHYqDqGQ7GEYA0m2Z9V07sC71E2SBIXCpaNWBFYCfFejrDQAuKLhOIA==", "dev": true, + "license": "MIT", "engines": { "node": "^16.13 || >=18" }, "optionalDependencies": { "expect-webdriverio": "^4.11.2", - "webdriverio": "8.39.1" + "webdriverio": "8.46.0" } }, "node_modules/@wdio/local-runner": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.39.1.tgz", - "integrity": "sha512-VYRD7pSkl5JTsYXroM65yb+vJVn9pFJf0XZMB7Xj+WVUqGXuVkZ+XybsQetUlhruXvHIsPdiFj12V1tMyaUHrQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.46.0.tgz", + "integrity": "sha512-wbM00qCHGqiTvHykEYZQpQHVuaPANyql6VAuRSO+C32tVvU/rLRAYOo0Z6c3QkzfoNBw+jG4n8CySNhCBRrlfA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^20.1.0", + "@types/node": "^22.2.0", "@wdio/logger": "8.38.0", - "@wdio/repl": "8.24.12", - "@wdio/runner": "8.39.1", - "@wdio/types": "8.39.0", + "@wdio/repl": "8.40.3", + "@wdio/runner": "8.46.0", + "@wdio/types": "8.41.0", "async-exit-hook": "^2.0.1", "split2": "^4.1.0", "stream-buffers": "^3.0.2" @@ -3559,23 +3617,44 @@ } }, "node_modules/@wdio/local-runner/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, - "node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "node_modules/@wdio/local-runner/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/local-runner/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wdio/logger": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "dev": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", "strip-ansi": "^7.1.0" }, "engines": { @@ -3622,16 +3701,17 @@ } }, "node_modules/@wdio/mocha-framework": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.39.0.tgz", - "integrity": "sha512-OFau1dd5mUAqC70gkx0WeZ8rJG191Snb4qhOTS18FpszUoZgoHtgjFICC0cxqZBFtmT9j7+22hNrj6d4sQVPJw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.46.0.tgz", + "integrity": "sha512-vosPCWouz7eKd3mdVrmYQuBgd7Y7V1cvwWxhslBslH5BX9kiWeUABLmsGoGKsjHDyEl9goc1Hhv/GKgyvXmFFg==", "dev": true, + "license": "MIT", "dependencies": { "@types/mocha": "^10.0.0", - "@types/node": "^20.1.0", + "@types/node": "^22.2.0", "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", "mocha": "^10.0.0" }, "engines": { @@ -3639,41 +3719,72 @@ } }, "node_modules/@wdio/mocha-framework/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" + } + }, + "node_modules/@wdio/mocha-framework/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, + "node_modules/@wdio/mocha-framework/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@wdio/protocols": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.38.0.tgz", - "integrity": "sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==", - "dev": true + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.44.0.tgz", + "integrity": "sha512-Do+AW3xuDUHWkrX++LeMBSrX2yRILlDqunRHPMv4adGFEA45m7r4WP8wGCDb+chrHGhXq5TwB9Ne4J7x1dHGng==", + "dev": true, + "license": "MIT" }, "node_modules/@wdio/repl": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", - "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.40.3.tgz", + "integrity": "sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^20.1.0" + "@types/node": "^22.2.0" }, "engines": { "node": "^16.13 || >=18" } }, "node_modules/@wdio/repl/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, + "node_modules/@wdio/repl/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@wdio/reporter": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.39.0.tgz", @@ -3700,53 +3811,106 @@ } }, "node_modules/@wdio/runner": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.39.1.tgz", - "integrity": "sha512-hCGI+TSAyb14UtdDjswI5AAdW1CZMi6di+rDZ6ml43hQyHc6sw+74CXI8dwoJ29dcTzbg7QCJZZXV1qMn0kh2w==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.46.0.tgz", + "integrity": "sha512-QnjaFGeDbvdl7WzIVQN6gf4974FUlZ2dS8mDoiPvt/8ZaTSNfwHvvRL93HpYduteWmVVrOK0WcNb54Q8yTqvkQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^20.11.28", - "@wdio/config": "8.39.0", - "@wdio/globals": "8.39.1", + "@types/node": "^22.2.0", + "@wdio/config": "8.46.0", + "@wdio/globals": "8.46.0", "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", "deepmerge-ts": "^5.1.0", "expect-webdriverio": "^4.12.0", "gaze": "^1.1.3", - "webdriver": "8.39.0", - "webdriverio": "8.39.1" + "webdriver": "8.46.0", + "webdriverio": "8.46.0" }, "engines": { "node": "^16.13 || >=18" } }, "node_modules/@wdio/runner/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" + } + }, + "node_modules/@wdio/runner/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, + "node_modules/@wdio/runner/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@wdio/sauce-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@wdio/sauce-service/-/sauce-service-8.39.1.tgz", - "integrity": "sha512-tt0oNqh2FxnR4JaMTwc7LRRLO03ERZxbZjeNf5IzK8PsjQ/JFUefeRBWmqoa93FVi3YGO8gUPCVElaS7OEqkRg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/sauce-service/-/sauce-service-8.46.0.tgz", + "integrity": "sha512-mjCvcRbMI/+Q+epZbyfJXXVZs/72yPmbQ5UqMfuzkpnlTnqqF9DJBowtp4LjQ5HScnYQ1OA+NAp72c0ExhQ0ww==", "dev": true, + "license": "MIT", "dependencies": { "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", - "ip": "^2.0.1", - "saucelabs": "7.5.0", - "webdriverio": "8.39.1" + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", + "address": "^2.0.3", + "saucelabs": "8.0.0", + "webdriverio": "8.46.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/sauce-service/node_modules/@types/node": { + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@wdio/sauce-service/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.2.0" }, "engines": { "node": "^16.13 || >=18" } }, + "node_modules/@wdio/sauce-service/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@wdio/spec-reporter": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.39.0.tgz", @@ -3797,18 +3961,19 @@ } }, "node_modules/@wdio/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-C94kJjZhEfPUNbOA69BQr1SgziQYgjNXK8S1GJXQKuwxN/24PQkYCzeBqXstfxyTXyOwoQCcEZAQ/qJccboufQ==", "dev": true, + "license": "MIT", "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", + "@wdio/types": "8.41.0", "decamelize": "^6.0.0", "deepmerge-ts": "^5.1.0", "edgedriver": "^5.5.0", - "geckodriver": "^4.3.1", + "geckodriver": "~4.2.0", "get-port": "^7.0.0", "import-meta-resolve": "^4.0.0", "locate-app": "^2.1.0", @@ -3820,11 +3985,35 @@ "node": "^16.13 || >=18" } }, + "node_modules/@wdio/utils/node_modules/@types/node": { + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@wdio/utils/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, "node_modules/@wdio/utils/node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.1.tgz", + "integrity": "sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3832,164 +4021,263 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@wdio/utils/node_modules/geckodriver": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.2.1.tgz", + "integrity": "sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==", + "dev": true, + "hasInstallScript": true, + "license": "MPL-2.0", + "dependencies": { + "@wdio/logger": "^8.11.0", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.1", + "tar-fs": "^3.0.4", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" + } + }, + "node_modules/@wdio/utils/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@wdio/utils/node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/@wdio/utils/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/@wdio/utils/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wdio/utils/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -3998,6 +4286,7 @@ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@xtuc/long": { @@ -4005,6 +4294,7 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, + "license": "Apache-2.0", "peer": true }, "node_modules/@zip.js/zip.js": { @@ -4043,10 +4333,11 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4054,14 +4345,28 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, + "license": "MIT", "peer": true, + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" + } + }, + "node_modules/address": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", + "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" } }, "node_modules/after": { @@ -4095,23 +4400,6 @@ "node": ">=8" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -4151,16 +4439,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -4195,15 +4473,19 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -4274,10 +4556,11 @@ } }, "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -4612,14 +4895,31 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -4811,49 +5111,92 @@ "dev": true }, "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "optional": true + "license": "Apache-2.0" }, "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.7.tgz", + "integrity": "sha512-huJQxUWc2d1T+6dxnC/FoYpBgEHzJp33mYZqFtQqTTPPyP9xPvmjC16VpR4wTte4ZKd5VxkFAcfDYi51iwWMcg==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", - "dev": true, - "optional": true + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } }, "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-os": "^2.1.0" + "bare-os": "^3.0.1" } }, "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { - "streamx": "^2.18.0" + "bare-path": "^3.0.0" } }, "node_modules/base64-arraybuffer": { @@ -4893,6 +5236,16 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.15.tgz", + "integrity": "sha512-qsJ8/X+UypqxHXN75M7dF88jNK37dLBRW7LeUzCPz+TNs37G8cfWy9nWzS+LS//g600zrt2le9KuXt0rWfDz5Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -4912,6 +5265,30 @@ "platform": "^1.3.3" } }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -4991,11 +5368,19 @@ "esm": "^3.2.25" } }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true, + "license": "MIT" + }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5005,7 +5390,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -5020,6 +5405,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5028,13 +5414,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5059,9 +5447,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, "funding": [ { @@ -5077,11 +5465,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -5105,6 +5495,7 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, + "license": "MIT", "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -5114,7 +5505,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-crc32": { "version": "0.2.13", @@ -5129,7 +5521,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-from": { "version": "1.1.2", @@ -5137,6 +5530,25 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -5154,6 +5566,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5163,6 +5576,7 @@ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.6.0" } @@ -5172,6 +5586,7 @@ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -5216,16 +5631,47 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -5239,6 +5685,7 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -5280,9 +5727,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001640", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", - "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "dev": true, "funding": [ { @@ -5297,52 +5744,62 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "dev": true, + "license": "MIT/X11", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "traverse": ">=0.3.0 <0.4" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/change-case": { @@ -5350,6 +5807,7 @@ "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", "dev": true, + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", @@ -5446,12 +5904,14 @@ } }, "node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", + "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "mitt": "3.0.0" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0" }, "peerDependencies": { "devtools-protocol": "*" @@ -5468,6 +5928,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -5556,6 +6017,7 @@ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -5612,19 +6074,24 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", @@ -5743,10 +6210,11 @@ } }, "node_modules/compressing": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/compressing/-/compressing-1.10.1.tgz", - "integrity": "sha512-XXwUffcVjqv8NGSQu1ttp6eMmuZ3zZEAec28Rt30o/vkXE20jXhowRQ9LXLY4uOgFkxXrNzApLobpam53Dc1AA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/compressing/-/compressing-1.10.3.tgz", + "integrity": "sha512-F3RxWLU4UNfNYFVNwCK58HwQnv/5drvUW176FC//3i0pwpdahoZxMM7dkxWuA2MEafqfwDc+iudk70Sx/VMUIw==", "dev": true, + "license": "MIT", "dependencies": { "@eggjs/yauzl": "^2.11.0", "flushwritable": "^1.0.0", @@ -5767,6 +6235,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5791,6 +6260,7 @@ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -5814,6 +6284,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5951,6 +6422,7 @@ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dev": true, + "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" } @@ -5960,6 +6432,7 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5976,10 +6449,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6065,6 +6539,7 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } @@ -6155,6 +6630,7 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -6290,6 +6766,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6305,26 +6782,27 @@ } }, "node_modules/devtools": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.39.1.tgz", - "integrity": "sha512-9C/p9kGn0zcwGpvC+3U3vavsvaaCK6UJD4PZgGMZz8ejXN2GCpQDmnNjN0SDndmzEcl81wPlkJabawbwcqoIKw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.46.0.tgz", + "integrity": "sha512-kvAlgPV7YEKPNa2kPJkGILatVE0k+n5jbh7EQwKPhd1GCEjN2/mdchaBDaOjdE9gxgVWRYGuThImdo0ov9WmmA==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.39.0", + "@types/node": "^22.2.0", + "@wdio/config": "8.46.0", "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/protocols": "8.44.0", + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", "chrome-launcher": "^1.0.0", "edge-paths": "^3.0.5", "import-meta-resolve": "^4.0.0", - "puppeteer-core": "20.3.0", + "puppeteer-core": "^21.11.0", "query-selector-shadow-dom": "^1.0.0", "ua-parser-js": "^1.0.37", - "uuid": "^9.0.0", + "uuid": "^10.0.0", "which": "^4.0.0" }, "engines": { @@ -6332,299 +6810,96 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1302984", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1302984.tgz", - "integrity": "sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==", - "dev": true - }, - "node_modules/devtools/node_modules/@puppeteer/browsers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.3.0.tgz", - "integrity": "sha512-an3QdbNPkuU6qpxpbssxAbjRLJcF+eP4L8UqIY3+6n0sbaVxw5pz7PiCLy9g32XEZuoamUlV5ZQPnA6FxvkIHA==", + "version": "0.0.1400418", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1400418.tgz", + "integrity": "sha512-U8j75zDOXF8IP3o0Cgb7K4tFA9uUHEOru2Wx64+EUqL4LNOh9dRe1i8WKR1k3mSpjcCe3aIkTDvEwq0YkI4hfw==", "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "http-proxy-agent": "5.0.0", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "license": "BSD-3-Clause" }, "node_modules/devtools/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, - "node_modules/devtools/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/devtools/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { - "debug": "4" + "@types/node": "^22.2.0" }, "engines": { - "node": ">= 6.0.0" + "node": "^16.13 || >=18" } }, - "node_modules/devtools/node_modules/chromium-bidi": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.9.tgz", - "integrity": "sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==", + "node_modules/devtools/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "optional": true, "peer": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" + "engines": { + "node": ">=16" } }, - "node_modules/devtools/node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "node_modules/devtools/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/devtools/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "optional": true, "peer": true, - "dependencies": { - "node-fetch": "^2.6.11" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/devtools/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/devtools/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "optional": true, "peer": true, "dependencies": { - "ms": "2.1.2" + "isexe": "^3.1.1" }, - "engines": { - "node": ">=6.0" + "bin": { + "node-which": "bin/which.js" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/devtools/node_modules/devtools-protocol": { - "version": "0.0.1120988", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1120988.tgz", - "integrity": "sha512-39fCpE3Z78IaIPChJsP6Lhmkbf4dWXOmzLk/KFTdRkNk/0JymRIfUynDVRndV9HoDz8PyalK1UH21ST/ivwW5Q==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/devtools/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/devtools/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/devtools/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/devtools/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/devtools/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/devtools/node_modules/puppeteer-core": { - "version": "20.3.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.3.0.tgz", - "integrity": "sha512-264pBrIui5bO6NJeOcbJrLa0OCwmA4+WK00JMrLIKTfRiqe2gx8KWTzLsjyw/bizErp3TKS7vt/I0i5fTC+mAw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@puppeteer/browsers": "1.3.0", - "chromium-bidi": "0.4.9", - "cross-fetch": "3.1.6", - "debug": "4.3.4", - "devtools-protocol": "0.0.1120988", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/devtools/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/devtools/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/devtools/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/devtools/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/devtools/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "dependencies": { "asap": "^2.0.0", @@ -6666,6 +6941,7 @@ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -6683,6 +6959,31 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6775,7 +7076,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eiows": { "version": "7.1.0", @@ -6809,10 +7111,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.818", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", - "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==", - "dev": true + "version": "1.5.234", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz", + "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6821,10 +7124,11 @@ "dev": true }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6848,10 +7152,11 @@ }, "node_modules/engine.io-client-v3": { "name": "engine.io-client", - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", - "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.4.tgz", + "integrity": "sha512-ydc8uuMMDxC5KCKNJN3zZKYJk2sgyTuTZQ7Aj1DJSsLKAcizA/PzWivw8fZMIjJVBo2CJOYzntv4FSjY/Lr//g==", "dev": true, + "license": "MIT", "dependencies": { "component-emitter": "~1.3.0", "component-inherit": "0.0.3", @@ -6861,7 +7166,7 @@ "indexof": "0.0.1", "parseqs": "0.0.6", "parseuri": "0.0.6", - "ws": "~7.4.2", + "ws": "~7.5.10", "xmlhttprequest-ssl": "~1.6.2", "yeast": "0.1.2" } @@ -6922,6 +7227,20 @@ "resolved": "packages/engine.io-parser", "link": true }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6932,13 +7251,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6959,6 +7276,35 @@ "dev": true, "peer": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -6966,10 +7312,11 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6978,15 +7325,17 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, "node_modules/eslint-formatter-pretty": { @@ -7011,67 +7360,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-formatter-pretty/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint-formatter-pretty/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint-formatter-pretty/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint-formatter-pretty/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint-formatter-pretty/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint-rule-docs": { "version": "1.1.235", "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", @@ -7154,6 +7442,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7176,6 +7465,16 @@ "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -7249,6 +7548,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -7261,12 +7561,13 @@ } }, "node_modules/expect-webdriverio": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.15.1.tgz", - "integrity": "sha512-xtBSidt7Whs1fsUC+utxVzfmkmaStXWW17b+BcMCiCltx0Yku6l7BTv1Y14DEKX8L6rttaDQobYyRtBKbi4ssg==", + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.15.4.tgz", + "integrity": "sha512-Op1xZoevlv1pohCq7g2Og5Gr3xP2NhY7MQueOApmopVxgweoJ/BqJxyvMNP0A//QsMg8v0WsN/1j81Sx2er9Wg==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/snapshot": "^1.2.2", + "@vitest/snapshot": "^2.0.3", "expect": "^29.7.0", "jest-matcher-utils": "^29.7.0", "lodash.isequal": "^4.5.0" @@ -7287,37 +7588,38 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.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.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -7326,19 +7628,24 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-session": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.0.tgz", - "integrity": "sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==", "dev": true, + "license": "MIT", "dependencies": { - "cookie": "0.6.0", + "cookie": "0.7.2", "cookie-signature": "1.0.7", "debug": "2.6.9", "depd": "~2.0.0", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "parseurl": "~1.3.3", "safe-buffer": "5.2.1", "uid-safe": "~2.1.5" @@ -7347,15 +7654,6 @@ "node": ">= 0.8.0" } }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express-session/node_modules/cookie-signature": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", @@ -7378,10 +7676,11 @@ "dev": true }, "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7463,13 +7762,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true - }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -7499,6 +7791,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer2/-/fd-slicer2-1.2.0.tgz", "integrity": "sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==", "dev": true, + "license": "MIT", "dependencies": { "pend": "^1.2.0" } @@ -7582,10 +7875,11 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -7619,18 +7913,20 @@ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -7646,6 +7942,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -7654,7 +7951,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "2.1.0", @@ -7699,7 +7997,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", "integrity": "sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -7721,6 +8020,22 @@ } } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -7735,13 +8050,16 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -7753,6 +8071,7 @@ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.17" } @@ -7770,15 +8089,19 @@ } }, "node_modules/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, + "license": "MIT", "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", "once": "^1.4.0" }, + "engines": { + "node": ">=14.0.0" + }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } @@ -7797,6 +8120,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7891,6 +8215,37 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -7925,6 +8280,7 @@ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, + "license": "MIT", "dependencies": { "globule": "^1.0.0" }, @@ -7977,17 +8333,18 @@ } }, "node_modules/geckodriver/node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/geckodriver/node_modules/tar-stream": { @@ -8044,16 +8401,22 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8083,11 +8446,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-ready": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/get-stream": { "version": "5.2.0", @@ -8172,6 +8550,7 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, + "license": "BSD-2-Clause", "peer": true }, "node_modules/globals": { @@ -8208,6 +8587,7 @@ "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", "dev": true, + "license": "MIT", "dependencies": { "glob": "~7.1.1", "lodash": "^4.17.21", @@ -8223,6 +8603,7 @@ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8243,6 +8624,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8251,12 +8633,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8267,6 +8650,7 @@ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -8350,11 +8734,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8362,11 +8747,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -8385,6 +8774,7 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -8441,6 +8831,7 @@ "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "dev": true, + "license": "MIT", "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" @@ -8455,15 +8846,6 @@ "node": ">=16.0.0" } }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -8501,16 +8883,18 @@ "dev": true }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -8540,6 +8924,7 @@ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -8700,21 +9085,6 @@ "node": ">=14.18.0" } }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/inquirer/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -8727,24 +9097,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/inquirer/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -8783,12 +9135,6 @@ "url": "https://opencollective.com/ioredis" } }, - "node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -8865,6 +9211,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", @@ -8993,6 +9352,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -9234,141 +9609,19 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { @@ -9385,6 +9638,7 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -9395,72 +9649,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -9476,72 +9670,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -9554,67 +9688,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -9645,7 +9718,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -9675,7 +9749,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -9683,13 +9758,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9731,6 +9799,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -9749,6 +9818,7 @@ "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -9814,6 +9884,13 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true, + "license": "ISC" + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -9912,7 +9989,9 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "dev": true, + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -9954,67 +10033,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/loglevel": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", @@ -10039,6 +10057,7 @@ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -10048,6 +10067,7 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10062,12 +10082,13 @@ } }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -10118,11 +10139,22 @@ "optional": true, "peer": true }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10189,10 +10221,14 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -10219,10 +10255,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10236,6 +10273,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -10279,6 +10317,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10296,7 +10335,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimatch": { "version": "3.1.2", @@ -10374,16 +10414,18 @@ "dev": true }, "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -10433,10 +10475,11 @@ } }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -10582,6 +10625,7 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -10682,10 +10726,11 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "3.0.3", @@ -10728,6 +10773,7 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10825,21 +10871,6 @@ "node": ">=18" } }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -10851,24 +10882,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/nyc/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -11089,6 +11102,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -11097,10 +11111,11 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11152,67 +11167,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -11227,6 +11181,7 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -11346,6 +11301,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -11404,6 +11360,7 @@ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -11414,6 +11371,7 @@ "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -11478,10 +11436,11 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -11496,7 +11455,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pend": { "version": "1.2.0", @@ -11602,10 +11562,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -11731,6 +11692,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -11935,197 +11906,78 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dev": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/puppeteer-core/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/puppeteer-core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/puppeteer-core/node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/puppeteer-core/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true }, - "node_modules/puppeteer-core/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/puppeteer-core/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/puppeteer-core": { + "version": "21.11.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz", + "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "1.9.1", + "chromium-bidi": "0.5.8", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1232444", + "ws": "8.16.0" + }, "engines": { - "node": ">=10" + "node": ">=16.13.2" } }, - "node_modules/puppeteer-core/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "ms": "2.1.2" }, "engines": { - "node": ">=12" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/puppeteer-core/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1232444", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", + "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==", "dev": true, - "engines": { - "node": ">=12" - } + "license": "BSD-3-Clause" + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -12145,6 +11997,7 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", "dev": true, + "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", @@ -12178,17 +12031,12 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -12219,6 +12067,7 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12228,6 +12077,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -12437,10 +12287,11 @@ } }, "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -12651,7 +12502,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-from": { "version": "5.0.0", @@ -12668,6 +12520,7 @@ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -12762,10 +12615,11 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -12837,10 +12691,11 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -12950,10 +12805,11 @@ "dev": true }, "node_modules/saucelabs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-7.5.0.tgz", - "integrity": "sha512-wq89BtE7xb4ns7ApbgAshaUgXHlPoseytPTNwaVQNPwAaD+0klYpBrsCy/Lj77EJ+kf/vKvX1tjhRT67eDyCXg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-8.0.0.tgz", + "integrity": "sha512-Rj9m4OCniYk+c4MFuZGqvz64RPX6oRzMqt0bTr9T27IXGnA7Ic7Ms/VHgPtRcJFP6H3sQ169WOzazPZcW4BIAg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "change-case": "^4.1.2", "compressing": "^1.10.0", @@ -12969,10 +12825,11 @@ } }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -12980,7 +12837,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -13031,10 +12888,11 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -13059,6 +12917,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -13067,13 +12926,25 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -13117,15 +12988,16 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -13164,7 +13036,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -13346,6 +13219,7 @@ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -13452,10 +13326,11 @@ "dev": true }, "node_modules/socket.io-client-v2/node_modules/socket.io-parser": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz", - "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.4.tgz", + "integrity": "sha512-z/pFQB3x+EZldRRzORYW1vwVO8m/3ILkswtnpoeU6Ve3cbMWkmHEWDAVJn4QJtchiiFTo5j7UG2QvwxvaA9vow==", "dev": true, + "license": "MIT", "dependencies": { "component-emitter": "~1.3.0", "debug": "~3.1.0", @@ -13633,6 +13508,7 @@ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -13657,6 +13533,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -13664,15 +13541,6 @@ "node": ">=10" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", @@ -13684,6 +13552,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13702,22 +13571,21 @@ "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", "integrity": "sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, + "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/strict-uri-encode": { @@ -13725,6 +13593,7 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -13934,6 +13803,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -13952,10 +13835,11 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -13998,6 +13882,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -14016,6 +13901,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -14076,17 +13962,18 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -14115,6 +14002,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -14125,25 +14013,6 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -14179,6 +14048,16 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -14198,20 +14077,27 @@ "dev": true }, "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14229,6 +14115,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -14237,7 +14124,18 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "license": "MIT/X11", + "engines": { + "node": "*" + } }, "node_modules/trim-newlines": { "version": "3.0.1", @@ -14268,68 +14166,6 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-loader/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-loader/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ts-loader/node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/ts-loader/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -14343,33 +14179,12 @@ } }, "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ts-loader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-loader/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 8" } }, "node_modules/ts-node": { @@ -14468,6 +14283,7 @@ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } @@ -14510,6 +14326,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -14518,6 +14335,21 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -14647,14 +14479,34 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -14670,9 +14522,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -14686,6 +14539,7 @@ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -14695,6 +14549,7 @@ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -14723,6 +14578,13 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true, + "license": "MIT" + }, "node_modules/userhome": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.0.tgz", @@ -14803,55 +14665,6 @@ "node": ">=10" } }, - "node_modules/wait-port/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wait-port/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/wait-port/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wait-port/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wait-port/node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", @@ -14861,23 +14674,12 @@ "node": "^12.20.0 || >=14" } }, - "node_modules/wait-port/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -14934,18 +14736,19 @@ } }, "node_modules/webdriver": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.39.0.tgz", - "integrity": "sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.46.0.tgz", + "integrity": "sha512-ucb+ow6QHTBBDAdpV1AAKPY+un2cv23QU/rsSJBmuDZi8lZc5NluWz16qVVbdD1+Hn45PXfpxQcBaAkavStORA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^20.1.0", + "@types/node": "^22.2.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.39.0", + "@wdio/config": "8.46.0", "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/protocols": "8.44.0", + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", "deepmerge-ts": "^5.1.0", "got": "^12.6.1", "ky": "^0.33.0", @@ -14960,6 +14763,7 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -14972,6 +14776,7 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -14980,12 +14785,26 @@ } }, "node_modules/webdriver/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" + } + }, + "node_modules/webdriver/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, "node_modules/webdriver/node_modules/cacheable-lookup": { @@ -14993,6 +14812,7 @@ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" } @@ -15002,6 +14822,7 @@ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -15020,6 +14841,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15032,6 +14854,7 @@ "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -15057,6 +14880,7 @@ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -15070,6 +14894,7 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -15082,6 +14907,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -15090,10 +14916,11 @@ } }, "node_modules/webdriver/node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -15106,6 +14933,7 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" } @@ -15115,6 +14943,7 @@ "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -15125,24 +14954,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/webdriver/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/webdriverio": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.39.1.tgz", - "integrity": "sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.46.0.tgz", + "integrity": "sha512-SyrSVpygEdPzvgpapVZRQCy8XIOecadp56bPQewpfSfo9ypB6wdOUkx13NBu2ANDlUAtJX7KaLJpTtywVHNlVw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.39.0", + "@types/node": "^22.2.0", + "@wdio/config": "8.46.0", "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", + "@wdio/protocols": "8.44.0", + "@wdio/repl": "8.40.3", + "@wdio/types": "8.41.0", + "@wdio/utils": "8.46.0", "archiver": "^7.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1302984", + "devtools-protocol": "^0.0.1400418", "grapheme-splitter": "^1.0.2", "import-meta-resolve": "^4.0.0", "is-plain-obj": "^4.1.0", @@ -15150,12 +14987,12 @@ "lodash.clonedeep": "^4.5.0", "lodash.zip": "^4.2.0", "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", + "puppeteer-core": "^21.11.0", "query-selector-shadow-dom": "^1.0.0", "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^11.0.1", - "webdriver": "8.39.0" + "webdriver": "8.46.0" }, "engines": { "node": "^16.13 || >=18" @@ -15170,19 +15007,34 @@ } }, "node_modules/webdriverio/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", + "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" + } + }, + "node_modules/webdriverio/node_modules/@wdio/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", + "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.2.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, "node_modules/webdriverio/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -15214,29 +15066,39 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/webdriverio/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -15246,11 +15108,11 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -15269,63 +15131,22 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -15352,6 +15173,28 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -15402,72 +15245,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -15636,6 +15413,7 @@ "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3" } From 6877512f57db9bb911e36b9e0565a686911cc0ea Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 16 Oct 2025 11:49:12 +0200 Subject: [PATCH 40/51] refactor: upgrade to TypeScript 5 --- .github/workflows/ci.yml | 1 - lib/index.ts | 6 ++--- package-lock.json | 55 +++++++++++++++++++++++++++------------- package.json | 4 +-- test/index.ts | 3 +-- tsconfig.json | 3 ++- 6 files changed, 46 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a035af4d6d..1153f93867 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,6 @@ jobs: strategy: matrix: node-version: - - 12 - 20 steps: diff --git a/lib/index.ts b/lib/index.ts index 3452ba4abe..babe0bc590 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,6 +1,6 @@ -import cluster = require("cluster"); +import cluster from "node:cluster"; import { Adapter, BroadcastOptions, Room } from "socket.io-adapter"; -import { randomBytes } from "crypto"; +import { randomBytes } from "node:crypto"; const randomId = () => randomBytes(8).toString("hex"); const debug = require("debug")("socket.io-cluster-adapter"); @@ -297,7 +297,7 @@ export class ClusterAdapter extends Adapter { message.nsp ); - process.send(message, null, { swallowErrors: true }, ignoreError); + process.send(message, null, {}, ignoreError); } /** diff --git a/package-lock.json b/package-lock.json index 5fbba983ab..a32b1d276f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "devDependencies": { "@types/expect.js": "^0.3.29", "@types/mocha": "^10.0.0", - "@types/node": "^15.12.4", + "@types/node": "~20.19.21", "expect.js": "0.3.1", "mocha": "^10.0.0", "nyc": "^15.1.0", @@ -22,7 +22,7 @@ "socket.io": "^4.6.1", "socket.io-client": "^4.7.1", "ts-node": "^9.1.1", - "typescript": "^4.0.5" + "typescript": "~5.9.3" }, "engines": { "node": ">=10.0.0" @@ -456,10 +456,14 @@ "dev": true }, "node_modules/@types/node": { - "version": "15.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", - "dev": true + "version": "20.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.21.tgz", + "integrity": "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", @@ -2573,18 +2577,26 @@ } }, "node_modules/typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -3196,10 +3208,13 @@ "dev": true }, "@types/node": { - "version": "15.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", - "dev": true + "version": "20.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.21.tgz", + "integrity": "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==", + "dev": true, + "requires": { + "undici-types": "~6.21.0" + } }, "@ungap/promise-all-settled": { "version": "1.1.2", @@ -4766,9 +4781,15 @@ } }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true + }, + "undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true }, "update-browserslist-db": { diff --git a/package.json b/package.json index 83e4916e74..3e59d0c801 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "devDependencies": { "@types/expect.js": "^0.3.29", "@types/mocha": "^10.0.0", - "@types/node": "^15.12.4", + "@types/node": "~20.19.21", "expect.js": "0.3.1", "mocha": "^10.0.0", "nyc": "^15.1.0", @@ -35,7 +35,7 @@ "socket.io": "^4.6.1", "socket.io-client": "^4.7.1", "ts-node": "^9.1.1", - "typescript": "^4.0.5" + "typescript": "~5.9.3" }, "engines": { "node": ">=10.0.0" diff --git a/test/index.ts b/test/index.ts index ac5fb29a53..36fcc1160a 100644 --- a/test/index.ts +++ b/test/index.ts @@ -2,8 +2,7 @@ import { io as ioc, Socket as ClientSocket } from "socket.io-client"; import expect = require("expect.js"); import { setupPrimary } from ".."; import { times, sleep } from "./util"; -import cluster = require("cluster"); -import { Worker } from "cluster"; +import cluster, { Worker } from "node:cluster"; const NODES_COUNT = 3; diff --git a/tsconfig.json b/tsconfig.json index 87d51bf0e1..bcd6128f99 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,8 @@ "allowJs": false, "target": "es2017", "module": "commonjs", - "declaration": true + "declaration": true, + "esModuleInterop": true }, "include": [ "./lib/**/*" From 1dd729b1a17c9598bb74dc60c757a8d92619e63b Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 16 Oct 2025 11:51:11 +0200 Subject: [PATCH 41/51] refactor: upgrade to prettier 3 --- lib/index.ts | 30 +- package-lock.json | 2882 +-------------------------------------------- package.json | 6 +- test/index.ts | 18 +- 4 files changed, 33 insertions(+), 2903 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index babe0bc590..0b98419521 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -150,12 +150,12 @@ export class ClusterAdapter extends Adapter { packet: arg, }, }); - } + }, ); } else { super.broadcast( message.data.packet, - ClusterAdapter.deserializeOptions(message.data.opts) + ClusterAdapter.deserializeOptions(message.data.opts), ); } break; @@ -177,7 +177,7 @@ export class ClusterAdapter extends Adapter { debug("calling addSockets with opts %j", message.data.opts); super.addSockets( ClusterAdapter.deserializeOptions(message.data.opts), - message.data.rooms + message.data.rooms, ); break; } @@ -185,7 +185,7 @@ export class ClusterAdapter extends Adapter { debug("calling delSockets with opts %j", message.data.opts); super.delSockets( ClusterAdapter.deserializeOptions(message.data.opts), - message.data.rooms + message.data.rooms, ); break; } @@ -193,14 +193,14 @@ export class ClusterAdapter extends Adapter { debug("calling disconnectSockets with opts %j", message.data.opts); super.disconnectSockets( ClusterAdapter.deserializeOptions(message.data.opts), - message.data.close + message.data.close, ); break; } case EventType.FETCH_SOCKETS: { debug("calling fetchSockets with opts %j", message.data.opts); const localSockets = await super.fetchSockets( - ClusterAdapter.deserializeOptions(message.data.opts) + ClusterAdapter.deserializeOptions(message.data.opts), ); this.publish({ @@ -227,7 +227,7 @@ export class ClusterAdapter extends Adapter { request.current++; message.data.sockets.forEach((socket: any) => - request.responses.push(socket) + request.responses.push(socket), ); if (request.current === request.expected) { @@ -294,7 +294,7 @@ export class ClusterAdapter extends Adapter { debug( "publish event of type %s for namespace %s", message.type, - message.nsp + message.nsp, ); process.send(message, null, {}, ignoreError); @@ -344,7 +344,7 @@ export class ClusterAdapter extends Adapter { packet: any, opts: BroadcastOptions, clientCountCallback: (clientCount: number) => void, - ack: (...args: any[]) => void + ack: (...args: any[]) => void, ) { const onlyLocal = opts?.flags?.local; if (!onlyLocal) { @@ -453,8 +453,8 @@ export class ClusterAdapter extends Adapter { if (storedRequest) { reject( new Error( - `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}` - ) + `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}`, + ), ); this.requests.delete(requestId); } @@ -505,7 +505,7 @@ export class ClusterAdapter extends Adapter { debug( 'waiting for %d responses to "serverSideEmit" request', - expectedResponseCount + expectedResponseCount, ); if (expectedResponseCount <= 0) { @@ -519,9 +519,9 @@ export class ClusterAdapter extends Adapter { if (storedRequest) { ack( new Error( - `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}` + `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}`, ), - storedRequest.responses + storedRequest.responses, ); this.requests.delete(requestId); } @@ -589,7 +589,7 @@ export function setupPrimary() { data: worker.id, }, null, - ignoreError + ignoreError, ); } } diff --git a/package-lock.json b/package-lock.json index a32b1d276f..2aacab756f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2879 +1,8 @@ { "name": "@socket.io/cluster-adapter", "version": "0.2.2", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@socket.io/cluster-adapter", - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "debug": "~4.3.1" - }, - "devDependencies": { - "@types/expect.js": "^0.3.29", - "@types/mocha": "^10.0.0", - "@types/node": "~20.19.21", - "expect.js": "0.3.1", - "mocha": "^10.0.0", - "nyc": "^15.1.0", - "prettier": "^2.1.2", - "socket.io": "^4.6.1", - "socket.io-client": "^4.7.1", - "ts-node": "^9.1.1", - "typescript": "~5.9.3" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "socket.io-adapter": "^2.4.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", - "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", - "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/expect.js": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@types/expect.js/-/expect.js-0.3.29.tgz", - "integrity": "sha1-KN01kVW4S47LCUr8P0t0wyItyjs=", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.19.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.21.tgz", - "integrity": "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001514", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", - "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.454", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", - "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", - "dev": true, - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.1.tgz", - "integrity": "sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.1.0", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", - "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/expect.js": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", - "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", - "dev": true - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/mocha/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dependencies": { - "ws": "~8.11.0" - } - }, - "node_modules/socket.io-client": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.1.tgz", - "integrity": "sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, "dependencies": { "@ampproject/remapping": { "version": "2.2.1", @@ -4478,9 +1607,9 @@ } }, "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true }, "process-on-spawn": { @@ -4612,6 +1741,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, "requires": { "ws": "~8.11.0" } @@ -4894,7 +2024,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} + "dev": true }, "xmlhttprequest-ssl": { "version": "2.0.0", diff --git a/package.json b/package.json index 3e59d0c801..ad55e91fb8 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "types": "./dist/index.d.ts", "scripts": { "test": "npm run format:check && tsc && nyc mocha --require ts-node/register test/index.ts", - "format:check": "prettier --parser typescript --check 'lib/**/*.ts' 'test/**/*.ts'", - "format:fix": "prettier --parser typescript --write 'lib/**/*.ts' 'test/**/*.ts'", + "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.ts'", + "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'", "prepack": "tsc" }, "dependencies": { @@ -31,7 +31,7 @@ "expect.js": "0.3.1", "mocha": "^10.0.0", "nyc": "^15.1.0", - "prettier": "^2.1.2", + "prettier": "~3.6.2", "socket.io": "^4.6.1", "socket.io-client": "^4.7.1", "ts-node": "^9.1.1", diff --git a/test/index.ts b/test/index.ts index 36fcc1160a..720f3242c6 100644 --- a/test/index.ts +++ b/test/index.ts @@ -181,7 +181,7 @@ describe("@socket.io/cluster-adapter", () => { }); workers[0].send( - "broadcasts with multiple acknowledgements (binary content)" + "broadcasts with multiple acknowledgements (binary content)", ); workers[0].on("message", (result) => { @@ -240,7 +240,7 @@ describe("@socket.io/cluster-adapter", () => { workers[2].send("join room1"); workers[0].send( - "makes the matching socket instances join the specified room" + "makes the matching socket instances join the specified room", ); await sleep(100); @@ -270,7 +270,7 @@ describe("@socket.io/cluster-adapter", () => { workers[2].send("join room2"); workers[0].send( - "makes the matching socket instances leave the specified room" + "makes the matching socket instances leave the specified room", ); await sleep(100); @@ -333,13 +333,13 @@ describe("@socket.io/cluster-adapter", () => { it("sends an event and receives a response from the other server instances", (done) => { workers[0].send( - "sends an event and receives a response from the other server instances (1)" + "sends an event and receives a response from the other server instances (1)", ); workers[1].send( - "sends an event and receives a response from the other server instances (2)" + "sends an event and receives a response from the other server instances (2)", ); workers[2].send( - "sends an event and receives a response from the other server instances (3)" + "sends an event and receives a response from the other server instances (3)", ); workers[0].on("message", (result) => { @@ -351,13 +351,13 @@ describe("@socket.io/cluster-adapter", () => { it("sends an event but timeout if one server does not respond", (done) => { workers[0].send( - "sends an event but timeout if one server does not respond (1)" + "sends an event but timeout if one server does not respond (1)", ); workers[1].send( - "sends an event but timeout if one server does not respond (2)" + "sends an event but timeout if one server does not respond (2)", ); workers[2].send( - "sends an event but timeout if one server does not respond (3)" + "sends an event but timeout if one server does not respond (3)", ); workers[0].on("message", (result) => { From 4fc25d80ec5834560dd078abc1c4d01dd83763a4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 16 Oct 2025 12:03:32 +0200 Subject: [PATCH 42/51] ci: add Node.js 24 Reference: https://github.com/nodejs/Release --- .github/workflows/ci.yml | 3 + package-lock.json | 2666 +++++++++++++++++++++++++++----------- package.json | 4 +- 3 files changed, 1941 insertions(+), 732 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1153f93867..4aac29428a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,9 +12,12 @@ jobs: timeout-minutes: 10 strategy: + fail-fast: false matrix: node-version: - 20 + - 22 + - 24 steps: - name: Checkout repository diff --git a/package-lock.json b/package-lock.json index 2aacab756f..a539227fcb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,40 +1,76 @@ { "name": "@socket.io/cluster-adapter", "version": "0.2.2", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@ampproject/remapping": { + "packages": { + "": { + "name": "@socket.io/cluster-adapter", + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "debug": "~4.3.1" + }, + "devDependencies": { + "@types/expect.js": "^0.3.29", + "@types/mocha": "^10.0.0", + "@types/node": "~20.19.21", + "expect.js": "0.3.1", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "prettier": "~3.6.2", + "socket.io": "^4.6.1", + "socket.io-client": "^4.7.1", + "tsx": "~4.20.6", + "typescript": "~5.9.3" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "socket.io-adapter": "^2.4.0" + } + }, + "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/code-frame": { + "node_modules/@babel/code-frame": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/compat-data": { + "node_modules/@babel/compat-data": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.22.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", "dev": true, - "requires": { + "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", "@babel/generator": "^7.22.7", @@ -50,73 +86,101 @@ "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/generator": { + "node_modules/@babel/generator": { "version": "7.22.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-compilation-targets": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, - "requires": { + "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-validator-option": "^7.22.5", "@nicolo-ribaudo/semver-v6": "^6.3.3", "browserslist": "^4.21.9", "lru-cache": "^5.1.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-environment-visitor": { + "node_modules/@babel/helper-environment-visitor": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-function-name": { + "node_modules/@babel/helper-function-name": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.22.5", "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-hoist-variables": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/helper-simple-access": "^7.22.5", @@ -125,89 +189,122 @@ "@babel/template": "^7.22.5", "@babel/traverse": "^7.22.5", "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-simple-access": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-string-parser": { + "node_modules/@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-option": { + "node_modules/@babel/helper-validator-option": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.22.5", "@babel/traverse": "^7.22.6", "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.22.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", - "dev": true + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/parser": "^7.22.5", "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.22.8", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/generator": "^7.22.7", "@babel/helper-environment-visitor": "^7.22.5", @@ -218,482 +315,1045 @@ "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { + "node_modules/@babel/types": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" - } - }, - "@istanbuljs/load-nyc-config": { + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "@istanbuljs/schema": { + "node_modules/@istanbuljs/schema": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@jridgewell/gen-mapping": { + "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@jridgewell/resolve-uri": { + "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/set-array": { + "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/sourcemap-codec": { + "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "@jridgewell/trace-mapping": { + "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } } }, - "@nicolo-ribaudo/semver-v6": { + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nicolo-ribaudo/semver-v6": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "@socket.io/component-emitter": { + "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, - "@types/cookie": { + "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, - "@types/cors": { + "node_modules/@types/cors": { "version": "2.8.13", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/expect.js": { + "node_modules/@types/expect.js": { "version": "0.3.29", "resolved": "https://registry.npmjs.org/@types/expect.js/-/expect.js-0.3.29.tgz", "integrity": "sha1-KN01kVW4S47LCUr8P0t0wyItyjs=", "dev": true }, - "@types/mocha": { + "node_modules/@types/mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", "dev": true }, - "@types/node": { + "node_modules/@types/node": { "version": "20.19.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.21.tgz", "integrity": "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==", "dev": true, - "requires": { + "dependencies": { "undici-types": "~6.21.0" } }, - "@ungap/promise-all-settled": { + "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, - "accepts": { + "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "requires": { + "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "aggregate-error": { + "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "requires": { + "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "ansi-colors": { + "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "append-transform": { + "node_modules/append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "requires": { + "dependencies": { "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "archy": { + "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { + "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { + "dependencies": { "sprintf-js": "~1.0.2" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base64id": { + "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "browser-stdout": { + "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserslist": { + "node_modules/browserslist": { "version": "4.21.9", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "caniuse-lite": "^1.0.30001503", "electron-to-chromium": "^1.4.431", "node-releases": "^2.0.12", "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "caching-transform": { + "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "requires": { + "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", "package-hash": "^4.0.0", "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "caniuse-lite": { + "node_modules/caniuse-lite": { "version": "1.0.30001514", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "clean-stack": { + "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "cliui": { + "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "commondir": { + "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "~5.1.1" } }, - "cookie": { + "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "cors": { + "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, - "requires": { + "dependencies": { "object-assign": "^4", "vary": "^1" + }, + "engines": { + "node": ">= 0.10" } }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "debug": { + "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { + "dependencies": { "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "decamelize": { + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "default-require-extensions": { + "node_modules/default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, - "requires": { + "dependencies": { "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "diff": { + "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "electron-to-chromium": { + "node_modules/electron-to-chromium": { "version": "1.4.454", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", "dev": true }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "engine.io": { + "node_modules/engine.io": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, - "requires": { + "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", @@ -705,21 +1365,16 @@ "engine.io-parser": "~5.0.3", "ws": "~8.11.0" }, - "dependencies": { - "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", - "dev": true - } + "engines": { + "node": ">=10.0.0" } }, - "engine.io-client": { + "node_modules/engine.io-client": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.1.tgz", "integrity": "sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng==", "dev": true, - "requires": { + "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.1.0", @@ -727,532 +1382,795 @@ "xmlhttprequest-ssl": "~2.0.0" } }, - "engine.io-parser": { + "node_modules/engine.io-parser": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } }, - "es6-error": { + "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "escalade": { + "node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" + } + }, + "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "expect.js": { + "node_modules/expect.js": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", "dev": true }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-cache-dir": { + "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "requires": { + "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "find-up": { + "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "flat": { + "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true + "dev": true, + "bin": { + "flat": "cli.js" + } }, - "foreground-child": { + "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "fromentries": { + "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-package-type": { + "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } }, - "glob": { + "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "globals": { + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "hasha": { + "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "requires": { + "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "he": { + "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "dev": true, + "bin": { + "he": "bin/he" + } }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "indent-string": { + "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-typedarray": { + "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-unicode-supported": { + "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-windows": { + "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "istanbul-lib-coverage": { + "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "istanbul-lib-hook": { + "node_modules/istanbul-lib-hook": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "requires": { + "dependencies": { "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-processinfo": { + "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "requires": { + "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", "istanbul-lib-coverage": "^3.2.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-source-maps": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "istanbul-reports": { + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { + "node_modules/js-yaml": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, - "requires": { + "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "locate-path": { + "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "lodash.flattendeep": { + "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "log-symbols": { + "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "requires": { + "dependencies": { "yallist": "^3.0.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "requires": { + "dependencies": { "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "mocha": { + "node_modules/mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, - "requires": { + "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -1276,208 +2194,292 @@ "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "ms": { + "node_modules/mocha/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/mocha/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "nanoid": { + "node_modules/nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "node-preload": { + "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "requires": { + "dependencies": { "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node-releases": { + "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "nyc": { + "node_modules/nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "caching-transform": "^4.0.0", @@ -1505,551 +2507,736 @@ "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" } }, - "object-assign": { + "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "p-limit": { + "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "p-map": { + "node_modules/p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "requires": { + "dependencies": { "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "package-hash": { + "node_modules/package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picocolors": { + "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "prettier": { + "node_modules/prettier": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "process-on-spawn": { + "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, - "requires": { + "dependencies": { "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" } }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "release-zalgo": { + "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, - "requires": { + "dependencies": { "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "rimraf": { + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "semver": { + "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "serialize-javascript": { + "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "requires": { + "dependencies": { "randombytes": "^2.1.0" } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "socket.io": { + "node_modules/socket.io": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, - "requires": { + "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", "engine.io": "~6.4.1", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" } }, - "socket.io-adapter": { + "node_modules/socket.io-adapter": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dev": true, - "requires": { + "dependencies": { "ws": "~8.11.0" } }, - "socket.io-client": { + "node_modules/socket.io-client": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.1.tgz", "integrity": "sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w==", "dev": true, - "requires": { + "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.5.1", "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, - "socket.io-parser": { + "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, - "requires": { + "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "engines": { + "node": ">=10.0.0" } }, - "spawn-wrap": { + "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "requires": { + "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", "make-dir": "^3.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "which": "^2.0.1" + }, + "engines": { + "node": ">=8" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string-width": { + "node_modules/string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "node_modules/tsx": { + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, + "license": "MIT", "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "typedarray-to-buffer": { + "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "requires": { + "dependencies": { "is-typedarray": "^1.0.0" } }, - "typescript": { + "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "undici-types": { + "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true }, - "update-browserslist-db": { + "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "uuid": { + "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-module": { + "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "workerpool": { + "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "wrappy": { + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, - "ws": { + "node_modules/ws": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "xmlhttprequest-ssl": { + "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "y18n": { + "node_modules/y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "requires": { + "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", @@ -2061,55 +3248,74 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "yargs-unparser": { + "node_modules/yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "yocto-queue": { + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index ad55e91fb8..df945fd0fe 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "test": "npm run format:check && tsc && nyc mocha --require ts-node/register test/index.ts", + "test": "npm run format:check && tsc && nyc mocha --import=tsx test/index.ts", "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.ts'", "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'", "prepack": "tsc" @@ -34,7 +34,7 @@ "prettier": "~3.6.2", "socket.io": "^4.6.1", "socket.io-client": "^4.7.1", - "ts-node": "^9.1.1", + "tsx": "~4.20.6", "typescript": "~5.9.3" }, "engines": { From 0c431243e28913fdd2a4a3de3e67a9f38d67a3aa Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 16 Oct 2025 19:16:20 +0200 Subject: [PATCH 43/51] refactor: use the ClusterAdapter class from socket.io-adapter package The ClusterAdapter class has been moved to [1], so that this adapter only needs to implement to pub/sub mechanism. Also, [2] should reduce the number of "timeout reached: only x responses received out of y" errors, since the fetchSockets() requests will now succeed even if a server leaves the cluster. [1]: https://github.com/socketio/socket.io/tree/main/packages/socket.io-adapter [2]: https://github.com/socketio/socket.io/commit/0e23ff0cc671e3186510f7cfb8a4c1147457296f --- lib/index.ts | 597 +++++----------------------------------------- package-lock.json | 34 ++- package.json | 2 +- test/index.ts | 4 +- test/worker.js | 4 +- 5 files changed, 92 insertions(+), 549 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 0b98419521..49d660bbc0 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,553 +1,80 @@ import cluster from "node:cluster"; -import { Adapter, BroadcastOptions, Room } from "socket.io-adapter"; -import { randomBytes } from "node:crypto"; - -const randomId = () => randomBytes(8).toString("hex"); -const debug = require("debug")("socket.io-cluster-adapter"); - +import { + ClusterAdapterWithHeartbeat, + ClusterAdapterOptions, + ClusterMessage, + ServerId, + ClusterResponse, + MessageType, +} from "socket.io-adapter"; +import debugModule from "debug"; + +const debug = debugModule("socket.io-cluster-adapter"); const MESSAGE_SOURCE = "_sio_adapter"; const hasOwnProperty = Object.prototype.hasOwnProperty; -/** - * Event types, for messages between nodes - */ - -enum EventType { - WORKER_INIT = 1, - WORKER_PING, - WORKER_EXIT, - BROADCAST, - SOCKETS_JOIN, - SOCKETS_LEAVE, - DISCONNECT_SOCKETS, - FETCH_SOCKETS, - FETCH_SOCKETS_RESPONSE, - SERVER_SIDE_EMIT, - SERVER_SIDE_EMIT_RESPONSE, - BROADCAST_CLIENT_COUNT, - BROADCAST_ACK, -} - -interface Request { - type: EventType; - resolve: Function; - timeout: NodeJS.Timeout; - expected: number; - current: number; - responses: any[]; -} - -interface AckRequest { - type: EventType.BROADCAST; - clientCountCallback: (clientCount: number) => void; - ack: (...args: any[]) => void; -} - -export interface ClusterAdapterOptions { - /** - * after this timeout the adapter will stop waiting from responses to request - * @default 5000 - */ - requestsTimeout: number; -} - function ignoreError() {} /** - * Returns a function that will create a ClusterAdapter instance. + * Returns a function that will create a NodeClusterAdapter instance. * * @param opts - additional options * * @public + * @see https://nodejs.org/api/cluster.html */ export function createAdapter(opts: Partial = {}) { - return function (nsp) { - return new ClusterAdapter(nsp, opts); + return function (nsp: any) { + return new NodeClusterAdapter(nsp, opts); }; } -export class ClusterAdapter extends Adapter { - public requestsTimeout: number; - - private workerIds: Set = new Set(); - private requests: Map = new Map(); - private ackRequests: Map = new Map(); - - /** - * Adapter constructor. - * - * @param nsp - the namespace - * @param opts - additional options - * - * @public - */ - constructor(nsp: any, opts: Partial = {}) { - super(nsp); - this.requestsTimeout = opts.requestsTimeout || 5000; - - this.publish({ - type: EventType.WORKER_INIT, - data: cluster.worker.id, - }); - - process.on("message", this.onMessage.bind(this)); - } - - public async onMessage(message: any) { - const isValidSource = message?.source === MESSAGE_SOURCE; - if (!isValidSource) { - return; - } - - if (message.type === EventType.WORKER_EXIT) { - this.workerIds.delete(message.data); - debug("workers count is now %d", this.workerIds.size); - return; - } - - if (message.nsp !== this.nsp.name) { - debug("ignore other namespace"); - return; - } - - switch (message.type) { - case EventType.WORKER_INIT: - this.workerIds.add(message.data); - debug("workers count is now %d", this.workerIds.size); - this.publish({ - type: EventType.WORKER_PING, - data: cluster.worker.id, - }); - break; - case EventType.WORKER_PING: - this.workerIds.add(message.data); - debug("workers count is now %d", this.workerIds.size); - break; - case EventType.BROADCAST: { - debug("broadcast with opts %j", message.data.opts); - - const withAck = message.data.requestId !== undefined; - if (withAck) { - super.broadcastWithAck( - message.data.packet, - ClusterAdapter.deserializeOptions(message.data.opts), - (clientCount) => { - debug("waiting for %d client acknowledgements", clientCount); - this.publish({ - type: EventType.BROADCAST_CLIENT_COUNT, - data: { - requestId: message.data.requestId, - clientCount, - }, - }); - }, - (arg) => { - debug("received acknowledgement with value %j", arg); - this.publish({ - type: EventType.BROADCAST_ACK, - data: { - requestId: message.data.requestId, - packet: arg, - }, - }); - }, - ); - } else { - super.broadcast( - message.data.packet, - ClusterAdapter.deserializeOptions(message.data.opts), - ); - } - break; - } - - case EventType.BROADCAST_CLIENT_COUNT: { - const request = this.ackRequests.get(message.data.requestId); - request?.clientCountCallback(message.data.clientCount); - break; +export class NodeClusterAdapter extends ClusterAdapterWithHeartbeat { + constructor(nsp: any, opts: ClusterAdapterOptions = {}) { + super(nsp, opts); + process.on("message", (message: any) => { + const isValidSource = message?.source === MESSAGE_SOURCE; + if (!isValidSource) { + debug("[%s] ignore unknown source", this.uid); + return; } - case EventType.BROADCAST_ACK: { - const request = this.ackRequests.get(message.data.requestId); - request?.ack(message.data.packet); - break; + // note: this check should be done in the onMessage() handler + if (message.nsp !== this.nsp.name) { + debug("[%s] ignore other namespace", this.uid); + return; } - case EventType.SOCKETS_JOIN: { - debug("calling addSockets with opts %j", message.data.opts); - super.addSockets( - ClusterAdapter.deserializeOptions(message.data.opts), - message.data.rooms, - ); - break; - } - case EventType.SOCKETS_LEAVE: { - debug("calling delSockets with opts %j", message.data.opts); - super.delSockets( - ClusterAdapter.deserializeOptions(message.data.opts), - message.data.rooms, - ); - break; - } - case EventType.DISCONNECT_SOCKETS: { - debug("calling disconnectSockets with opts %j", message.data.opts); - super.disconnectSockets( - ClusterAdapter.deserializeOptions(message.data.opts), - message.data.close, - ); - break; - } - case EventType.FETCH_SOCKETS: { - debug("calling fetchSockets with opts %j", message.data.opts); - const localSockets = await super.fetchSockets( - ClusterAdapter.deserializeOptions(message.data.opts), - ); - - this.publish({ - type: EventType.FETCH_SOCKETS_RESPONSE, - data: { - requestId: message.data.requestId, - workerId: message.data.workerId, - sockets: localSockets.map((socket) => ({ - id: socket.id, - handshake: socket.handshake, - rooms: [...socket.rooms], - data: socket.data, - })), - }, - }); - break; - } - case EventType.FETCH_SOCKETS_RESPONSE: { - const request = this.requests.get(message.data.requestId); - - if (!request) { - return; - } - - request.current++; - message.data.sockets.forEach((socket: any) => - request.responses.push(socket), - ); - - if (request.current === request.expected) { - clearTimeout(request.timeout); - request.resolve(request.responses); - this.requests.delete(message.data.requestId); - } - break; - } - case EventType.SERVER_SIDE_EMIT: { - const packet = message.data.packet; - const withAck = message.data.requestId !== undefined; - if (!withAck) { - this.nsp._onServerSideEmit(packet); - return; - } - let called = false; - const callback = (arg: any) => { - // only one argument is expected - if (called) { - return; - } - called = true; - debug("calling acknowledgement with %j", arg); - this.publish({ - type: EventType.SERVER_SIDE_EMIT_RESPONSE, - data: { - requestId: message.data.requestId, - workerId: message.data.workerId, - packet: arg, - }, - }); - }; - - packet.push(callback); - this.nsp._onServerSideEmit(packet); - break; - } - case EventType.SERVER_SIDE_EMIT_RESPONSE: { - const request = this.requests.get(message.data.requestId); - - if (!request) { - return; - } - - request.current++; - request.responses.push(message.data.packet); + this.onMessage(message); + }); - if (request.current === request.expected) { - clearTimeout(request.timeout); - request.resolve(null, request.responses); - this.requests.delete(message.data.requestId); - } - } - } + // until https://github.com/socketio/socket.io/commit/f3e1f5ebdf59158d0c8d1e20f8230275617fb355 is released + this.init(); } - private async publish(message: any) { - // to be able to ignore unrelated messages on the cluster message bus + protected override doPublish(message: ClusterMessage & { source: string }) { message.source = MESSAGE_SOURCE; - // to be able to ignore messages from other namespaces - message.nsp = this.nsp.name; - - debug( - "publish event of type %s for namespace %s", - message.type, - message.nsp, - ); process.send(message, null, {}, ignoreError); - } - - /** - * Transform ES6 Set into plain arrays. - * - * Note: we manually serialize ES6 Sets so that using `serialization: "advanced"` is not needed when using plaintext - * packets (reference: https://nodejs.org/api/child_process.html#child_process_advanced_serialization) - */ - private static serializeOptions(opts: BroadcastOptions) { - return { - rooms: [...opts.rooms], - except: opts.except ? [...opts.except] : [], - flags: opts.flags, - }; - } - private static deserializeOptions(opts: any): BroadcastOptions { - return { - rooms: new Set(opts.rooms), - except: new Set(opts.except), - flags: opts.flags, - }; + return Promise.resolve(""); // connection state recovery is not supported } - public broadcast(packet: any, opts: BroadcastOptions) { - const onlyLocal = opts?.flags?.local; - if (!onlyLocal) { - this.publish({ - type: EventType.BROADCAST, - data: { - packet, - opts: ClusterAdapter.serializeOptions(opts), - }, - }); - } - - // packets with binary contents are modified by the broadcast method, hence the nextTick() - process.nextTick(() => { - super.broadcast(packet, opts); - }); - } - - public broadcastWithAck( - packet: any, - opts: BroadcastOptions, - clientCountCallback: (clientCount: number) => void, - ack: (...args: any[]) => void, + protected override doPublishResponse( + requesterUid: ServerId, + response: ClusterResponse & { source: string; requesterUid: string }, ) { - const onlyLocal = opts?.flags?.local; - if (!onlyLocal) { - const requestId = randomId(); - - this.publish({ - type: EventType.BROADCAST, - data: { - packet, - requestId, - opts: ClusterAdapter.serializeOptions(opts), - }, - }); + response.source = MESSAGE_SOURCE; + response.requesterUid = requesterUid; - this.ackRequests.set(requestId, { - type: EventType.BROADCAST, - clientCountCallback, - ack, - }); - - // we have no way to know at this level whether the server has received an acknowledgement from each client, so we - // will simply clean up the ackRequests map after the given delay - setTimeout(() => { - this.ackRequests.delete(requestId); - }, opts.flags!.timeout); - } - - // packets with binary contents are modified by the broadcast method, hence the nextTick() - process.nextTick(() => { - super.broadcastWithAck(packet, opts, clientCountCallback, ack); - }); - } + process.send(response, null, {}, ignoreError); - public serverCount(): Promise { - return Promise.resolve(1 + this.workerIds.size); - } - - addSockets(opts: BroadcastOptions, rooms: Room[]) { - super.addSockets(opts, rooms); - - const onlyLocal = opts.flags?.local; - if (onlyLocal) { - return; - } - - this.publish({ - type: EventType.SOCKETS_JOIN, - data: { - opts: ClusterAdapter.serializeOptions(opts), - rooms, - }, - }); - } - - delSockets(opts: BroadcastOptions, rooms: Room[]) { - super.delSockets(opts, rooms); - - const onlyLocal = opts.flags?.local; - if (onlyLocal) { - return; - } - - this.publish({ - type: EventType.SOCKETS_LEAVE, - data: { - opts: ClusterAdapter.serializeOptions(opts), - rooms, - }, - }); - } - - disconnectSockets(opts: BroadcastOptions, close: boolean) { - super.disconnectSockets(opts, close); - - const onlyLocal = opts.flags?.local; - if (onlyLocal) { - return; - } - - this.publish({ - type: EventType.DISCONNECT_SOCKETS, - data: { - opts: ClusterAdapter.serializeOptions(opts), - close, - }, - }); - } - - private getExpectedResponseCount() { - return this.workerIds.size; - } - - async fetchSockets(opts: BroadcastOptions): Promise { - const localSockets = await super.fetchSockets(opts); - const expectedResponseCount = this.getExpectedResponseCount(); - - if (opts.flags?.local || expectedResponseCount === 0) { - return localSockets; - } - - const requestId = randomId(); - - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => { - const storedRequest = this.requests.get(requestId); - if (storedRequest) { - reject( - new Error( - `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}`, - ), - ); - this.requests.delete(requestId); - } - }, this.requestsTimeout); - - const storedRequest = { - type: EventType.FETCH_SOCKETS, - resolve, - timeout, - current: 0, - expected: expectedResponseCount, - responses: localSockets, - }; - this.requests.set(requestId, storedRequest); - - this.publish({ - type: EventType.FETCH_SOCKETS, - data: { - requestId, - workerId: cluster.worker.id, - opts: ClusterAdapter.serializeOptions(opts), - }, - }); - }); - } - - public serverSideEmit(packet: any[]): void { - const withAck = typeof packet[packet.length - 1] === "function"; - - if (withAck) { - this.serverSideEmitWithAck(packet).catch(() => { - // ignore errors - }); - return; - } - - this.publish({ - type: EventType.SERVER_SIDE_EMIT, - data: { - packet, - }, - }); - } - - private async serverSideEmitWithAck(packet: any[]) { - const ack = packet.pop(); - const expectedResponseCount = this.getExpectedResponseCount(); - - debug( - 'waiting for %d responses to "serverSideEmit" request', - expectedResponseCount, - ); - - if (expectedResponseCount <= 0) { - return ack(null, []); - } - - const requestId = randomId(); - - const timeout = setTimeout(() => { - const storedRequest = this.requests.get(requestId); - if (storedRequest) { - ack( - new Error( - `timeout reached: only ${storedRequest.current} responses received out of ${storedRequest.expected}`, - ), - storedRequest.responses, - ); - this.requests.delete(requestId); - } - }, this.requestsTimeout); - - const storedRequest = { - type: EventType.FETCH_SOCKETS, - resolve: ack, - timeout, - current: 0, - expected: expectedResponseCount, - responses: [], - }; - this.requests.set(requestId, storedRequest); - - this.publish({ - type: EventType.SERVER_SIDE_EMIT, - data: { - requestId, // the presence of this attribute defines whether an acknowledgement is needed - workerId: cluster.worker.id, - packet, - }, - }); + return Promise.resolve(); } } +const UIDS = Symbol("uids"); + export function setupPrimary() { cluster.on("message", (worker, message) => { const isValidSource = message?.source === MESSAGE_SOURCE; @@ -555,17 +82,26 @@ export function setupPrimary() { return; } + // store the requester's uids (one per namespace) so that the response can be sent specifically to them + worker[UIDS] = worker[UIDS] || new Set(); + worker[UIDS].add(message.uid); + switch (message.type) { - case EventType.FETCH_SOCKETS_RESPONSE: - case EventType.SERVER_SIDE_EMIT_RESPONSE: - const workerId = message.data.workerId; - // emit back to the requester - if (hasOwnProperty.call(cluster.workers, workerId)) { - cluster.workers[workerId].send(message, null, ignoreError); + case MessageType.FETCH_SOCKETS_RESPONSE: + case MessageType.SERVER_SIDE_EMIT_RESPONSE: + const requesterUid = message.requesterUid; + for (const workerId in cluster.workers) { + if ( + hasOwnProperty.call(cluster.workers, workerId) && + cluster.workers[workerId][UIDS]?.has(requesterUid) + ) { + cluster.workers[workerId].send(message, null, ignoreError); + break; + } } break; default: - const emitterIdAsString = "" + worker.id; + const emitterIdAsString = String(worker.id); // emit to all workers but the requester for (const workerId in cluster.workers) { if ( @@ -577,21 +113,4 @@ export function setupPrimary() { } } }); - - cluster.on("exit", (worker) => { - // notify all active workers - for (const workerId in cluster.workers) { - if (hasOwnProperty.call(cluster.workers, workerId)) { - cluster.workers[workerId].send( - { - source: MESSAGE_SOURCE, - type: EventType.WORKER_EXIT, - data: worker.id, - }, - null, - ignoreError, - ); - } - } - }); } diff --git a/package-lock.json b/package-lock.json index a539227fcb..8e01898192 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "node": ">=10.0.0" }, "peerDependencies": { - "socket.io-adapter": "^2.4.0" + "socket.io-adapter": "~2.5.5" } }, "node_modules/@ampproject/remapping": { @@ -2838,11 +2838,34 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", "dependencies": { - "ws": "~8.11.0" + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/socket.io-client": { @@ -3194,6 +3217,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index df945fd0fe..9b7daea38e 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "debug": "~4.3.1" }, "peerDependencies": { - "socket.io-adapter": "^2.4.0" + "socket.io-adapter": "~2.5.5" }, "devDependencies": { "@types/expect.js": "^0.3.29", diff --git a/test/index.ts b/test/index.ts index 720f3242c6..205bde0228 100644 --- a/test/index.ts +++ b/test/index.ts @@ -349,7 +349,9 @@ describe("@socket.io/cluster-adapter", () => { }); }); - it("sends an event but timeout if one server does not respond", (done) => { + it("sends an event but timeout if one server does not respond", function (done) { + this.timeout(6000); // currently not possible to configure the timeout delay + workers[0].send( "sends an event but timeout if one server does not respond (1)", ); diff --git a/test/worker.js b/test/worker.js index d6a2c50a14..ac9c447a19 100644 --- a/test/worker.js +++ b/test/worker.js @@ -150,11 +150,9 @@ process.on("message", async (msg) => { }); break; case "sends an event but timeout if one server does not respond (1)": - io.of("/").adapter.requestsTimeout = 200; - io.serverSideEmit("hello with ack", (err, response) => { expect(err.message).to.be( - "timeout reached: only 1 responses received out of 2" + "timeout reached: missing 1 responses" ); expect(response).to.be.an(Array); expect(response).to.contain(2); From 27fd420e7595debffbf9e0af424873d587a8d282 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 16 Oct 2025 19:31:30 +0200 Subject: [PATCH 44/51] refactor: prepare migration to monorepo --- .github/workflows/ci.yml | 35 ------------------ .gitignore | 18 --------- .../socket.io-cluster-adapter/CHANGELOG.md | 0 .../socket.io-cluster-adapter/LICENSE | 0 .../socket.io-cluster-adapter/README.md | 0 .../assets}/adapter.excalidraw | 0 .../assets}/adapter.png | Bin .../socket.io-cluster-adapter/lib}/index.ts | 0 .../package-lock.json | 0 .../socket.io-cluster-adapter/package.json | 0 .../socket.io-cluster-adapter/test}/index.ts | 0 .../socket.io-cluster-adapter/test}/util.ts | 0 .../socket.io-cluster-adapter/test}/worker.js | 0 .../socket.io-cluster-adapter/tsconfig.json | 0 14 files changed, 53 deletions(-) delete mode 100644 .github/workflows/ci.yml delete mode 100644 .gitignore rename CHANGELOG.md => packages/socket.io-cluster-adapter/CHANGELOG.md (100%) rename LICENSE => packages/socket.io-cluster-adapter/LICENSE (100%) rename README.md => packages/socket.io-cluster-adapter/README.md (100%) rename {assets => packages/socket.io-cluster-adapter/assets}/adapter.excalidraw (100%) rename {assets => packages/socket.io-cluster-adapter/assets}/adapter.png (100%) rename {lib => packages/socket.io-cluster-adapter/lib}/index.ts (100%) rename package-lock.json => packages/socket.io-cluster-adapter/package-lock.json (100%) rename package.json => packages/socket.io-cluster-adapter/package.json (100%) rename {test => packages/socket.io-cluster-adapter/test}/index.ts (100%) rename {test => packages/socket.io-cluster-adapter/test}/util.ts (100%) rename {test => packages/socket.io-cluster-adapter/test}/worker.js (100%) rename tsconfig.json => packages/socket.io-cluster-adapter/tsconfig.json (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 4aac29428a..0000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: CI - -on: - push: - pull_request: - schedule: - - cron: '0 0 * * 0' - -jobs: - test-node: - runs-on: ubuntu-latest - timeout-minutes: 10 - - strategy: - fail-fast: false - matrix: - node-version: - - 20 - - 22 - - 24 - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install dependencies - run: npm ci - - - name: Run tests - run: npm test diff --git a/.gitignore b/.gitignore deleted file mode 100644 index bc54f5be2f..0000000000 --- a/.gitignore +++ /dev/null @@ -1,18 +0,0 @@ -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -npm-debug.log -node_modules -.idea -.nyc_output/ -dist/ diff --git a/CHANGELOG.md b/packages/socket.io-cluster-adapter/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/socket.io-cluster-adapter/CHANGELOG.md diff --git a/LICENSE b/packages/socket.io-cluster-adapter/LICENSE similarity index 100% rename from LICENSE rename to packages/socket.io-cluster-adapter/LICENSE diff --git a/README.md b/packages/socket.io-cluster-adapter/README.md similarity index 100% rename from README.md rename to packages/socket.io-cluster-adapter/README.md diff --git a/assets/adapter.excalidraw b/packages/socket.io-cluster-adapter/assets/adapter.excalidraw similarity index 100% rename from assets/adapter.excalidraw rename to packages/socket.io-cluster-adapter/assets/adapter.excalidraw diff --git a/assets/adapter.png b/packages/socket.io-cluster-adapter/assets/adapter.png similarity index 100% rename from assets/adapter.png rename to packages/socket.io-cluster-adapter/assets/adapter.png diff --git a/lib/index.ts b/packages/socket.io-cluster-adapter/lib/index.ts similarity index 100% rename from lib/index.ts rename to packages/socket.io-cluster-adapter/lib/index.ts diff --git a/package-lock.json b/packages/socket.io-cluster-adapter/package-lock.json similarity index 100% rename from package-lock.json rename to packages/socket.io-cluster-adapter/package-lock.json diff --git a/package.json b/packages/socket.io-cluster-adapter/package.json similarity index 100% rename from package.json rename to packages/socket.io-cluster-adapter/package.json diff --git a/test/index.ts b/packages/socket.io-cluster-adapter/test/index.ts similarity index 100% rename from test/index.ts rename to packages/socket.io-cluster-adapter/test/index.ts diff --git a/test/util.ts b/packages/socket.io-cluster-adapter/test/util.ts similarity index 100% rename from test/util.ts rename to packages/socket.io-cluster-adapter/test/util.ts diff --git a/test/worker.js b/packages/socket.io-cluster-adapter/test/worker.js similarity index 100% rename from test/worker.js rename to packages/socket.io-cluster-adapter/test/worker.js diff --git a/tsconfig.json b/packages/socket.io-cluster-adapter/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/socket.io-cluster-adapter/tsconfig.json From 47ff1cd04c44bced71b1bc45478b64311e6eede0 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 16 Oct 2025 19:55:56 +0200 Subject: [PATCH 45/51] chore(release): @socket.io/cluster-adapter@0.3.0 Diff: https://github.com/socketio/socket.io-cluster-adapter/compare/0.2.2...0.3.0 --- CHANGELOG.md | 1 + .../socket.io-cluster-adapter/CHANGELOG.md | 21 +++++++++++++------ .../socket.io-cluster-adapter/package.json | 17 +++++++++------ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ee16880db..cb13c0a414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Here are the detailed changelogs for each package in this monorepo: | `socket.io` | [link](packages/socket.io/CHANGELOG.md) | | `socket.io-adapter` | [link](packages/socket.io-adapter/CHANGELOG.md) | | `socket.io-client` | [link](packages/socket.io-client/CHANGELOG.md) | +| `@socket.io/cluster-adapter` | [link](packages/socket.io-cluster-adapter/CHANGELOG.md) | | `@socket.io/cluster-engine` | [link](packages/socket.io-cluster-engine/CHANGELOG.md) | | `@socket.io/component-emitter` | [link](packages/socket.io-component-emitter/History.md) | | `socket.io-parser` | [link](packages/socket.io-parser/CHANGELOG.md) | diff --git a/packages/socket.io-cluster-adapter/CHANGELOG.md b/packages/socket.io-cluster-adapter/CHANGELOG.md index d8a0487726..2c409288f3 100644 --- a/packages/socket.io-cluster-adapter/CHANGELOG.md +++ b/packages/socket.io-cluster-adapter/CHANGELOG.md @@ -1,13 +1,22 @@ -# History +# Changelog -- [0.2.2](#022-2023-03-24) (Mar 2023) -- [0.2.1](#021-2022-10-13) (Oct 2022) -- [0.2.0](#020-2022-04-28) (Apr 2022) -- [0.1.0](#010-2021-06-22) (Jun 2021) +| Version | Release date | +|--------------------------|--------------| +| [0.3.0](#030-2025-10-16) | October 2025 | +| [0.2.2](#022-2023-03-24) | March 2023 | +| [0.2.1](#021-2022-10-13) | October 2022 | +| [0.2.0](#020-2022-04-28) | April 2022 | +| [0.1.0](#010-2021-06-22) | June 2021 | -# Release notes +## [0.3.0](https://github.com/socketio/socket.io-cluster-adapter/compare/0.2.2...0.3.0) (2025-10-16) + +This release contains an important refactor of the adapter ([this commit](https://github.com/socketio/socket.io-cluster-adapter/commit/0c431243e28913fdd2a4a3de3e67a9f38d67a3aa)), as most of the logic has been moved in the `ClusterAdapter` class of the `socket.io-adapter` package. + +Besides, the `@socket.io/cluster-adapter` package is now part of the `socket.io` monorepo. + + ## [0.2.2](https://github.com/socketio/socket.io-cluster-adapter/compare/0.2.1...0.2.2) (2023-03-24) diff --git a/packages/socket.io-cluster-adapter/package.json b/packages/socket.io-cluster-adapter/package.json index 0a7dff46d8..addd779942 100644 --- a/packages/socket.io-cluster-adapter/package.json +++ b/packages/socket.io-cluster-adapter/package.json @@ -1,11 +1,15 @@ { "name": "@socket.io/cluster-adapter", - "version": "0.2.2", + "version": "0.3.0", "description": "The Socket.IO cluster adapter, allowing to broadcast events between several Socket.IO servers", "license": "MIT", + "homepage": "https://github.com/socketio/socket.io/tree/main/packages/socket.io-cluster-adapter#readme", "repository": { "type": "git", - "url": "git@github.com:socketio/socket.io-cluster-adapter.git" + "url": "git+https://github.com/socketio/socket.io.git" + }, + "bugs": { + "url": "https://github.com/socketio/socket.io/issues" }, "files": [ "dist/" @@ -13,10 +17,11 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "test": "npm run format:check && tsc && nyc mocha --import=tsx test/index.ts", - "format:check": "prettier --check 'lib/**/*.ts' 'test/**/*.ts'", - "format:fix": "prettier --write 'lib/**/*.ts' 'test/**/*.ts'", - "prepack": "tsc" + "compile": "rimraf ./dist && tsc", + "test": "npm run format:check && npm run compile && nyc mocha --import=tsx test/index.ts", + "format:check": "prettier --check \"lib/**/*.ts' \"test/**/*.ts\"", + "format:fix": "prettier --write \"lib/**/*.ts\" \"test/**/*.ts\"", + "prepack": "npm run compile" }, "dependencies": { "debug": "~4.4.1" From 5080c73e1eafcc2e1443fee8ec3ec2db74ead9e3 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 17 Oct 2025 09:41:39 +0200 Subject: [PATCH 46/51] refactor: fix npm command --- packages/socket.io-cluster-adapter/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/socket.io-cluster-adapter/package.json b/packages/socket.io-cluster-adapter/package.json index addd779942..f83d52a148 100644 --- a/packages/socket.io-cluster-adapter/package.json +++ b/packages/socket.io-cluster-adapter/package.json @@ -19,7 +19,7 @@ "scripts": { "compile": "rimraf ./dist && tsc", "test": "npm run format:check && npm run compile && nyc mocha --import=tsx test/index.ts", - "format:check": "prettier --check \"lib/**/*.ts' \"test/**/*.ts\"", + "format:check": "prettier --check \"lib/**/*.ts\" \"test/**/*.ts\"", "format:fix": "prettier --write \"lib/**/*.ts\" \"test/**/*.ts\"", "prepack": "npm run compile" }, From 693080cac7e97f549f55294ef3dfe8a33236e60e Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 20 Oct 2025 09:51:38 +0200 Subject: [PATCH 47/51] refactor(sio-adapter): add more debug logs --- .../socket.io-adapter/lib/cluster-adapter.ts | 27 +++++++++++++------ .../socket.io-adapter/test/cluster-adapter.ts | 5 ---- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/socket.io-adapter/lib/cluster-adapter.ts b/packages/socket.io-adapter/lib/cluster-adapter.ts index 10caf5fc77..c53a48b4be 100644 --- a/packages/socket.io-adapter/lib/cluster-adapter.ts +++ b/packages/socket.io-adapter/lib/cluster-adapter.ts @@ -199,6 +199,14 @@ export abstract class ClusterAdapter extends Adapter { return debug("[%s] ignore message from self", this.uid); } + if (message.nsp !== this.nsp.name) { + return debug( + "[%s] ignore message from another namespace (%s)", + this.uid, + message.nsp, + ); + } + debug( "[%s] new event of type %d from %s", this.uid, @@ -671,6 +679,8 @@ export abstract class ClusterAdapter extends Adapter { protected publish( message: DistributiveOmit, ): void { + debug("[%s] sending message %s", this.uid, message.type); + this.publishAndReturnOffset(message).catch((err) => { debug("[%s] error while publishing message: %s", this.uid, err); }); @@ -699,6 +709,14 @@ export abstract class ClusterAdapter extends Adapter { ) { (response as ClusterResponse).uid = this.uid; (response as ClusterResponse).nsp = this.nsp.name; + + debug( + "[%s] sending response %s to %s", + this.uid, + response.type, + requesterUid, + ); + this.doPublishResponse(requesterUid, response as ClusterResponse).catch( (err) => { debug("[%s] error while publishing response: %s", this.uid, err); @@ -790,17 +808,10 @@ export abstract class ClusterAdapterWithHeartbeat extends ClusterAdapter { } if (message.uid && message.uid !== EMITTER_UID) { - // we track the UID of each sender, in order to know how many servers there are in the cluster + // we track the UID of each sender to know how many servers there are in the cluster this.nodesMap.set(message.uid, Date.now()); } - debug( - "[%s] new event of type %d from %s", - this.uid, - message.type, - message.uid, - ); - switch (message.type) { case MessageType.INITIAL_HEARTBEAT: this.publish({ diff --git a/packages/socket.io-adapter/test/cluster-adapter.ts b/packages/socket.io-adapter/test/cluster-adapter.ts index fe727c5949..18af8d478e 100644 --- a/packages/socket.io-adapter/test/cluster-adapter.ts +++ b/packages/socket.io-adapter/test/cluster-adapter.ts @@ -67,11 +67,6 @@ describe("cluster adapter", () => { serverSockets.push(socket); servers.push(io); if (servers.length === NODES_COUNT) { - // ensure all nodes know each other - servers[0].emit("ping"); - servers[1].emit("ping"); - servers[2].emit("ping"); - done(); } }); From 1c3e4711c13defb8e9f7196dc55a5aade71e82fd Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 6 Nov 2025 17:57:56 +0100 Subject: [PATCH 48/51] feat: add emitter based on Redis streams Related: https://github.com/socketio/socket.io-redis-streams-adapter/issues/8 --- package-lock.json | 142 ++--- package.json | 4 +- .../socket.io-redis-streams-emitter/LICENSE | 7 + .../socket.io-redis-streams-emitter/README.md | 220 ++++++++ .../compose.yaml | 15 + .../lib/index.ts | 496 ++++++++++++++++++ .../lib/typed-events.ts | 37 ++ .../lib/util.ts | 68 +++ .../package.json | 38 ++ .../test/index.ts | 225 ++++++++ .../test/util.ts | 156 ++++++ .../tsconfig.json | 13 + 12 files changed, 1355 insertions(+), 66 deletions(-) create mode 100644 packages/socket.io-redis-streams-emitter/LICENSE create mode 100644 packages/socket.io-redis-streams-emitter/README.md create mode 100644 packages/socket.io-redis-streams-emitter/compose.yaml create mode 100644 packages/socket.io-redis-streams-emitter/lib/index.ts create mode 100644 packages/socket.io-redis-streams-emitter/lib/typed-events.ts create mode 100644 packages/socket.io-redis-streams-emitter/lib/util.ts create mode 100644 packages/socket.io-redis-streams-emitter/package.json create mode 100644 packages/socket.io-redis-streams-emitter/test/index.ts create mode 100644 packages/socket.io-redis-streams-emitter/test/util.ts create mode 100644 packages/socket.io-redis-streams-emitter/tsconfig.json diff --git a/package-lock.json b/package-lock.json index 15384600bf..a9ef7e2f4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,8 @@ "packages/socket.io-parser", "packages/socket.io-client", "packages/socket.io", - "packages/socket.io-postgres-emitter" + "packages/socket.io-postgres-emitter", + "packages/socket.io-redis-streams-emitter" ], "devDependencies": { "@babel/core": "^7.24.7", @@ -31,6 +32,7 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@sinonjs/fake-timers": "^11.2.2", "@socket.io/postgres-adapter": "^0.1.0", + "@socket.io/redis-streams-adapter": "~0.2.2", "@types/debug": "^4.1.12", "@types/expect.js": "^0.3.32", "@types/mocha": "^10.0.7", @@ -121,6 +123,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", @@ -2809,6 +2812,7 @@ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.17.tgz", "integrity": "sha512-IPvU9A31qRCZ7lds/x+ksuK/UMndd0EASveAvCvEtFFKIZjZ+m/a4a0L7S28KEWoR5ka8526hlSghDo4Hrc2Hg==", "dev": true, + "peer": true, "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -3209,6 +3213,45 @@ "resolved": "packages/socket.io-postgres-emitter", "link": true }, + "node_modules/@socket.io/redis-streams-adapter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@socket.io/redis-streams-adapter/-/redis-streams-adapter-0.2.2.tgz", + "integrity": "sha512-BMPa6oGC0wFgpMXoGksbJ75zMBwk+79pxjHc2YusdoK+X0BxN4fTsqEBuFV7yeXi9ekbi87rwlsT61+WZGVW9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@msgpack/msgpack": "~2.8.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "socket.io-adapter": "^2.5.4" + } + }, + "node_modules/@socket.io/redis-streams-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@socket.io/redis-streams-emitter": { + "resolved": "packages/socket.io-redis-streams-emitter", + "link": true + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -3306,7 +3349,6 @@ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, - "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -3395,7 +3437,8 @@ "node_modules/@types/node": { "version": "18.15.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" + "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", + "peer": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", @@ -4559,7 +4602,6 @@ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -4570,24 +4612,21 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", @@ -4595,7 +4634,6 @@ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -4607,8 +4645,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", @@ -4616,7 +4653,6 @@ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -4630,7 +4666,6 @@ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4641,7 +4676,6 @@ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -4651,8 +4685,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", @@ -4660,7 +4693,6 @@ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -4678,7 +4710,6 @@ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -4693,7 +4724,6 @@ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -4707,7 +4737,6 @@ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -4723,7 +4752,6 @@ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -4734,16 +4762,14 @@ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@zip.js/zip.js": { "version": "2.7.45", @@ -4786,6 +4812,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4799,7 +4826,6 @@ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" }, @@ -5914,6 +5940,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -6313,7 +6340,6 @@ "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", "dev": true, "optional": true, - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -6333,7 +6359,6 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">=10" }, @@ -6346,7 +6371,6 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, - "peer": true, "engines": { "node": ">=6.0" } @@ -7236,7 +7260,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@types/node": "^22.2.0", "@wdio/config": "8.46.0", @@ -7262,7 +7285,8 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1400418.tgz", "integrity": "sha512-U8j75zDOXF8IP3o0Cgb7K4tFA9uUHEOru2Wx64+EUqL4LNOh9dRe1i8WKR1k3mSpjcCe3aIkTDvEwq0YkI4hfw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/devtools/node_modules/@types/node": { "version": "22.18.9", @@ -7271,7 +7295,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -7283,7 +7306,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@types/node": "^22.2.0" }, @@ -7297,7 +7319,6 @@ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">=16" } @@ -7308,8 +7329,7 @@ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/devtools/node_modules/uuid": { "version": "10.0.0", @@ -7322,7 +7342,6 @@ ], "license": "MIT", "optional": true, - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -7333,7 +7352,6 @@ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "optional": true, - "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -7721,8 +7739,7 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -7861,7 +7878,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7884,7 +7900,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -7897,7 +7912,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } @@ -7907,7 +7921,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } @@ -9053,8 +9066,7 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/globals": { "version": "11.12.0", @@ -9748,7 +9760,6 @@ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "optional": true, - "peer": true, "bin": { "is-docker": "cli.js" }, @@ -9904,7 +9915,6 @@ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "optional": true, - "peer": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -10356,7 +10366,6 @@ "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", "dev": true, "optional": true, - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -10368,7 +10377,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "optional": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -10378,8 +10386,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -10399,7 +10406,6 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "peer": true, "engines": { "node": ">=6.11.5" } @@ -10639,8 +10645,7 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -11111,8 +11116,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/netmask": { "version": "2.0.2", @@ -11973,6 +11977,7 @@ "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -13209,6 +13214,7 @@ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -13362,6 +13368,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -14480,7 +14487,6 @@ "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -14516,7 +14522,6 @@ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -14897,6 +14902,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14925,7 +14931,6 @@ } ], "optional": true, - "peer": true, "engines": { "node": "*" } @@ -15213,7 +15218,6 @@ "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -15669,7 +15673,6 @@ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" } @@ -16115,7 +16118,7 @@ }, "packages/socket.io-cluster-adapter": { "name": "@socket.io/cluster-adapter", - "version": "0.2.2", + "version": "0.3.0", "license": "MIT", "dependencies": { "debug": "~4.4.1" @@ -16177,6 +16180,15 @@ "@msgpack/msgpack": "^2.7.0", "debug": "~4.4.1" } + }, + "packages/socket.io-redis-streams-emitter": { + "name": "@socket.io/redis-streams-emitter", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "@msgpack/msgpack": "~2.8.0", + "debug": "~4.4.1" + } } } } diff --git a/package.json b/package.json index 1ec7bb9569..08d3bf21da 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "packages/socket.io-parser", "packages/socket.io-client", "packages/socket.io", - "packages/socket.io-postgres-emitter" + "packages/socket.io-postgres-emitter", + "packages/socket.io-redis-streams-emitter" ], "overrides": { "@types/estree": "0.0.52", @@ -32,6 +33,7 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@sinonjs/fake-timers": "^11.2.2", "@socket.io/postgres-adapter": "^0.1.0", + "@socket.io/redis-streams-adapter": "~0.2.2", "@types/debug": "^4.1.12", "@types/expect.js": "^0.3.32", "@types/mocha": "^10.0.7", diff --git a/packages/socket.io-redis-streams-emitter/LICENSE b/packages/socket.io-redis-streams-emitter/LICENSE new file mode 100644 index 0000000000..440a03247d --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2025-present Guillermo Rauch and Socket.IO contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/socket.io-redis-streams-emitter/README.md b/packages/socket.io-redis-streams-emitter/README.md new file mode 100644 index 0000000000..8bb38a1610 --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/README.md @@ -0,0 +1,220 @@ +# Socket.IO Redis Streams emitter + +The `@socket.io/redis-streams-emitter` package allows you to easily communicate with a group of Socket.IO servers from another Node.js process (server-side). + +It must be used in conjunction with [`@socket.io/redis-streams-adapter`](https://github.com/socketio/socket.io-redis-streams-adapter). + +**Table of contents** + + + * [Installation](#installation) + * [Usage](#usage) + * [With the `redis` package](#with-the-redis-package) + * [With the `redis` package and a Redis cluster](#with-the-redis-package-and-a-redis-cluster) + * [With the `ioredis` package](#with-the-ioredis-package) + * [With the `ioredis` package and a Redis cluster](#with-the-ioredis-package-and-a-redis-cluster) + * [Options](#options) + * [API](#api) + * [`Emitter(redisClient[, nsp][, opts])`](#emitterredisclient-nsp-opts) + * [`Emitter#to(room:string):BroadcastOperator`](#emittertoroomstringbroadcastoperator) + * [`Emitter#in(room:string):BroadcastOperator`](#emitterinroomstringbroadcastoperator) + * [`Emitter#except(room:string):BroadcastOperator`](#emitterexceptroomstringbroadcastoperator) + * [`Emitter#of(namespace:string):Emitter`](#emitterofnamespacestringemitter) + * [`Emitter#socketsJoin(rooms:string|string[])`](#emittersocketsjoinroomsstringstring) + * [`Emitter#socketsLeave(rooms:string|string[])`](#emittersocketsleaveroomsstringstring) + * [`Emitter#disconnectSockets(close:boolean)`](#emitterdisconnectsocketscloseboolean) + * [`Emitter#serverSideEmit(ev:string[,...args:any[]])`](#emitterserversideemitevstringargsany) + * [License](#license) + + +## Installation + +``` +npm install @socket.io/redis-streams-emitter redis +``` + +## Usage + +### With the `redis` package + +```js +import { createClient } from "redis"; +import { Emitter } from "@socket.io/redis-streams-emitter"; + +const redisClient = createClient({ + url: "redis://localhost:6379" +}); + +await redisClient.connect(); + +const io = new Emitter(redisClient); + +setInterval(() => { + io.emit("ping", new Date()); +}, 1000); +``` + +### With the `redis` package and a Redis cluster + +```js +import { createCluster } from "redis"; +import { Emitter } from "@socket.io/redis-streams-emitter"; + +const redisClient = createCluster({ + rootNodes: [ + { + url: "redis://localhost:7000", + }, + { + url: "redis://localhost:7001", + }, + { + url: "redis://localhost:7002", + }, + ], +}); + +await redisClient.connect(); + +const io = new Emitter(redisClient); + +setInterval(() => { + io.emit("ping", new Date()); +}, 1000); +``` + +### With the `ioredis` package + +```js +import { Redis } from "ioredis"; +import { Emitter } from "@socket.io/redis-streams-emitter"; + +const redisClient = new Redis(); + +const io = new Emitter(redisClient); + +setInterval(() => { + io.emit("ping", new Date()); +}, 1000); +``` + +### With the `ioredis` package and a Redis cluster + +```js +import { Cluster } from "ioredis"; +import { Emitter } from "@socket.io/redis-streams-emitter"; + +const redisClient = new Cluster([ + { + host: "localhost", + port: 7000, + }, + { + host: "localhost", + port: 7001, + }, + { + host: "localhost", + port: 7002, + }, +]); + +const io = new Emitter(redisClient); + +setInterval(() => { + io.emit("ping", new Date()); +}, 1000); +``` + +## Options + +| Name | Description | Default value | +|--------------|--------------------------------------------------------------------|---------------| +| `streamName` | The name of the Redis stream. | `socket.io` | +| `maxLen` | The maximum size of the stream. Almost exact trimming (~) is used. | `10_000` | + +## API + +### `Emitter(redisClient[, nsp][, opts])` + +```js +const io = new Emitter(redisClient); +``` + +### `Emitter#to(room:string):BroadcastOperator` +### `Emitter#in(room:string):BroadcastOperator` + +Specifies a specific `room` that you want to emit to. + +```js +io.to("room1").emit("hello"); +``` + +### `Emitter#except(room:string):BroadcastOperator` + +Specifies a specific `room` that you want to exclude from broadcasting. + +```js +io.except("room2").emit("hello"); +``` + +### `Emitter#of(namespace:string):Emitter` + +Specifies a specific namespace that you want to emit to. + +```js +const customNamespace = io.of("/custom"); + +customNamespace.emit("hello"); +``` + +### `Emitter#socketsJoin(rooms:string|string[])` + +Makes the matching socket instances join the specified rooms: + +```js +// make all Socket instances join the "room1" room +io.socketsJoin("room1"); + +// make all Socket instances of the "admin" namespace in the "room1" room join the "room2" room +io.of("/admin").in("room1").socketsJoin("room2"); +``` + +### `Emitter#socketsLeave(rooms:string|string[])` + +Makes the matching socket instances leave the specified rooms: + +```js +// make all Socket instances leave the "room1" room +io.socketsLeave("room1"); + +// make all Socket instances of the "admin" namespace in the "room1" room leave the "room2" room +io.of("/admin").in("room1").socketsLeave("room2"); +``` + +### `Emitter#disconnectSockets(close:boolean)` + +Makes the matching socket instances disconnect: + +```js +// make all Socket instances disconnect +io.disconnectSockets(); + +// make all Socket instances of the "admin" namespace in the "room1" room disconnect +io.of("/admin").in("room1").disconnectSockets(); + +// this also works with a single socket ID +io.of("/admin").in(theSocketId).disconnectSockets(); +``` + +### `Emitter#serverSideEmit(ev:string[,...args:any[]])` + +Emits an event that will be received by each Socket.IO server of the cluster. + +```js +io.serverSideEmit("ping"); +``` + +## License + +[MIT](./LICENSE) diff --git a/packages/socket.io-redis-streams-emitter/compose.yaml b/packages/socket.io-redis-streams-emitter/compose.yaml new file mode 100644 index 0000000000..38beb48bf0 --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/compose.yaml @@ -0,0 +1,15 @@ +services: + redis: + image: redis:5 + ports: + - "6379:6379" + + redis-cluster: + image: grokzen/redis-cluster:7.0.10 + ports: + - "7000-7005:7000-7005" + + valkey: + image: valkey/valkey:8 + ports: + - "6389:6379" diff --git a/packages/socket.io-redis-streams-emitter/lib/index.ts b/packages/socket.io-redis-streams-emitter/lib/index.ts new file mode 100644 index 0000000000..81d05d880a --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/lib/index.ts @@ -0,0 +1,496 @@ +import debugModule from "debug"; +import type { + DefaultEventsMap, + EventNames, + EventParams, + EventsMap, + TypedEventBroadcaster, +} from "./typed-events"; +import { encode } from "@msgpack/msgpack"; +import { hasBinary, XADD } from "./util"; +import { ClusterMessage, MessageType, BroadcastFlags } from "socket.io-adapter"; + +const debug = debugModule("socket.io-redis-streams-emitter"); +const EMITTER_UID = "emitter"; + +type DistributiveOmit = T extends any + ? Omit + : never; + +// TODO move to the socket.io-adapter package +abstract class BaseEmitter< + EmitEvents extends EventsMap = DefaultEventsMap, + ServerSideEvents extends EventsMap = DefaultEventsMap, +> { + protected abstract publish( + message: DistributiveOmit, + ): void; + + /** + * Emits to all clients. + * + * @return Always true + * @public + */ + public emit>( + ev: Ev, + ...args: EventParams + ): true { + return this.newBroadcastOperator().emit(ev, ...args); + } + + /** + * Targets a room when emitting. + * + * @param room + * @return BroadcastOperator + * @public + */ + public to( + room: string | string[], + ): BroadcastOperator { + return this.newBroadcastOperator().to(room); + } + + /** + * Targets a room when emitting. + * + * @param room + * @return BroadcastOperator + * @public + */ + public in( + room: string | string[], + ): BroadcastOperator { + return this.newBroadcastOperator().in(room); + } + + /** + * Excludes a room when emitting. + * + * @param room + * @return BroadcastOperator + * @public + */ + public except( + room: string | string[], + ): BroadcastOperator { + return this.newBroadcastOperator().except(room); + } + + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return BroadcastOperator + * @public + */ + public get volatile(): BroadcastOperator { + return this.newBroadcastOperator().volatile; + } + + /** + * Sets the compress flag. + * + * @param compress - if `true`, compresses the sending data + * @return BroadcastOperator + * @public + */ + public compress( + compress: boolean, + ): BroadcastOperator { + return this.newBroadcastOperator().compress(compress); + } + + /** + * Makes the matching socket instances join the specified rooms + * + * @param rooms + * @public + */ + public socketsJoin(rooms: string | string[]): void { + return this.newBroadcastOperator().socketsJoin(rooms); + } + + /** + * Makes the matching socket instances leave the specified rooms + * + * @param rooms + * @public + */ + public socketsLeave(rooms: string | string[]): void { + return this.newBroadcastOperator().socketsLeave(rooms); + } + + /** + * Makes the matching socket instances disconnect + * + * @param close - whether to close the underlying connection + * @public + */ + public disconnectSockets(close: boolean = false): void { + return this.newBroadcastOperator().disconnectSockets(close); + } + + /** + * Send a packet to the Socket.IO servers in the cluster + * + * @param ev - the event name + * @param args - any number of serializable arguments + */ + public serverSideEmit>( + ev: Ev, + ...args: EventParams + ): void { + return this.newBroadcastOperator().serverSideEmit(ev, ...args); + } + + private newBroadcastOperator() { + return new BroadcastOperator((msg) => + this.publish(msg), + ); + } +} + +export const RESERVED_EVENTS: ReadonlySet = new Set([ + "connect", + "connect_error", + "disconnect", + "disconnecting", + "newListener", + "removeListener", +]); + +export class BroadcastOperator< + EmitEvents extends EventsMap, + ServerSideEvents extends EventsMap, +> implements TypedEventBroadcaster +{ + constructor( + private readonly publish: ( + message: DistributiveOmit, + ) => void, + private readonly rooms: Set = new Set(), + private readonly exceptRooms: Set = new Set(), + private readonly flags: BroadcastFlags = {}, + ) {} + + /** + * Targets a room when emitting. + * + * @param room + * @return a new BroadcastOperator instance + * @public + */ + public to( + room: string | string[], + ): BroadcastOperator { + const rooms = new Set(this.rooms); + if (Array.isArray(room)) { + room.forEach((r) => rooms.add(r)); + } else { + rooms.add(room); + } + return new BroadcastOperator( + this.publish, + rooms, + this.exceptRooms, + this.flags, + ); + } + + /** + * Targets a room when emitting. + * + * @param room + * @return a new BroadcastOperator instance + * @public + */ + public in( + room: string | string[], + ): BroadcastOperator { + return this.to(room); + } + + /** + * Excludes a room when emitting. + * + * @param room + * @return a new BroadcastOperator instance + * @public + */ + public except( + room: string | string[], + ): BroadcastOperator { + const exceptRooms = new Set(this.exceptRooms); + if (Array.isArray(room)) { + room.forEach((r) => exceptRooms.add(r)); + } else { + exceptRooms.add(room); + } + return new BroadcastOperator( + this.publish, + this.rooms, + exceptRooms, + this.flags, + ); + } + + /** + * Sets the compress flag. + * + * @param compress - if `true`, compresses the sending data + * @return a new BroadcastOperator instance + * @public + */ + public compress( + compress: boolean, + ): BroadcastOperator { + const flags = Object.assign({}, this.flags, { compress }); + return new BroadcastOperator( + this.publish, + this.rooms, + this.exceptRooms, + flags, + ); + } + + /** + * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to + * receive messages (because of network slowness or other issues, or because they’re connected through long polling + * and is in the middle of a request-response cycle). + * + * @return a new BroadcastOperator instance + * @public + */ + public get volatile(): BroadcastOperator { + const flags = Object.assign({}, this.flags, { volatile: true }); + return new BroadcastOperator( + this.publish, + this.rooms, + this.exceptRooms, + flags, + ); + } + + /** + * Emits to all clients. + * + * @return Always true + * @public + */ + public emit>( + ev: Ev, + ...args: EventParams + ): true { + if (RESERVED_EVENTS.has(ev)) { + throw new Error(`"${String(ev)}" is a reserved event name`); + } + + // set up packet object + const data = [ev, ...args]; + const packet = { + type: 2, // EVENT + data: data, + }; + + const opts = { + rooms: [...this.rooms], + flags: this.flags, + except: [...this.exceptRooms], + }; + + this.publish({ + type: MessageType.BROADCAST, + data: { + packet, + opts, + }, + }); + + return true; + } + + /** + * Makes the matching socket instances join the specified rooms + * + * @param rooms + * @public + */ + public socketsJoin(rooms: string | string[]): void { + this.publish({ + type: MessageType.SOCKETS_JOIN, + data: { + opts: { + rooms: [...this.rooms], + except: [...this.exceptRooms], + flags: {}, + }, + rooms: Array.isArray(rooms) ? rooms : [rooms], + }, + }); + } + + /** + * Makes the matching socket instances leave the specified rooms + * + * @param rooms + * @public + */ + public socketsLeave(rooms: string | string[]): void { + this.publish({ + type: MessageType.SOCKETS_LEAVE, + data: { + opts: { + rooms: [...this.rooms], + except: [...this.exceptRooms], + flags: {}, + }, + rooms: Array.isArray(rooms) ? rooms : [rooms], + }, + }); + } + + /** + * Makes the matching socket instances disconnect + * + * @param close - whether to close the underlying connection + * @public + */ + public disconnectSockets(close: boolean = false): void { + this.publish({ + type: MessageType.DISCONNECT_SOCKETS, + data: { + opts: { + rooms: [...this.rooms], + except: [...this.exceptRooms], + flags: {}, + }, + close, + }, + }); + } + + /** + * Send a packet to the Socket.IO servers in the cluster + * + * @param ev - the event name + * @param args - any number of serializable arguments + */ + public serverSideEmit>( + ev: Ev, + ...args: EventParams + ): void { + const withAck = args.length && typeof args[args.length - 1] === "function"; + + if (withAck) { + throw new Error("Acknowledgements are not supported"); + } + + this.publish({ + type: MessageType.SERVER_SIDE_EMIT, + data: { + packet: [ev, ...args], + }, + }); + } +} + +function flattenPayload(message: ClusterMessage) { + const rawMessage = { + uid: message.uid, + nsp: message.nsp, + type: message.type.toString(), + data: undefined as string | undefined, + }; + + // @ts-expect-error + const data = message.data; + + if (data) { + const mayContainBinary = [ + MessageType.BROADCAST, + MessageType.FETCH_SOCKETS_RESPONSE, + MessageType.SERVER_SIDE_EMIT, + MessageType.SERVER_SIDE_EMIT_RESPONSE, + MessageType.BROADCAST_ACK, + ].includes(message.type); + + if (mayContainBinary && hasBinary(data)) { + rawMessage.data = Buffer.from(encode(data)).toString("base64"); + } else { + rawMessage.data = JSON.stringify(data); + } + } + + return rawMessage; +} + +export interface RedisStreamsEmitterOptions { + /** + * The name of the Redis stream. + * @default "socket.io" + */ + streamName?: string; + /** + * The maximum size of the stream. Almost exact trimming (~) is used. + * @default 10_000 + */ + maxLen?: number; +} + +export class Emitter< + EmitEvents extends EventsMap = DefaultEventsMap, + ServerSideEvents extends EventsMap = DefaultEventsMap, +> extends BaseEmitter { + readonly #redisClient: any; + readonly #opts: Required; + readonly #nsp: string; + + constructor( + redisClient: any, + opts: RedisStreamsEmitterOptions = {}, + nsp = "/", + ) { + super(); + this.#redisClient = redisClient; + this.#opts = Object.assign( + { + streamName: "socket.io", + maxLen: 10_000, + }, + opts, + ); + this.#nsp = nsp; + } + + public of(nsp: string) { + return new Emitter(this.#redisClient, this.#opts, nsp); + } + + protected override publish( + message: DistributiveOmit, + ) { + (message as ClusterMessage).uid = EMITTER_UID; + (message as ClusterMessage).nsp = this.#nsp; + + debug( + "publishing message %s to stream %s", + message.type, + this.#opts.streamName, + ); + + if (message.type === MessageType.BROADCAST) { + // @ts-expect-error FIXME untyped packet object + message.data.packet.nsp = this.#nsp; + } + + return XADD( + this.#redisClient, + this.#opts.streamName, + flattenPayload(message as ClusterMessage), + this.#opts.maxLen, + ); + } +} diff --git a/packages/socket.io-redis-streams-emitter/lib/typed-events.ts b/packages/socket.io-redis-streams-emitter/lib/typed-events.ts new file mode 100644 index 0000000000..3f2c0d43ba --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/lib/typed-events.ts @@ -0,0 +1,37 @@ +/** + * An events map is an interface that maps event names to their value, which + * represents the type of the `on` listener. + */ +export interface EventsMap { + [event: string]: any; +} + +/** + * The default events map, used if no EventsMap is given. Using this EventsMap + * is equivalent to accepting all event names, and any data. + */ +export interface DefaultEventsMap { + [event: string]: (...args: any[]) => void; +} + +/** + * Returns a union type containing all the keys of an event map. + */ +export type EventNames = keyof Map & (string | symbol); + +/** The tuple type representing the parameters of an event listener */ +export type EventParams< + Map extends EventsMap, + Ev extends EventNames, +> = Parameters; + +/** + * Interface for classes that aren't `EventEmitter`s, but still expose a + * strictly typed `emit` method. + */ +export interface TypedEventBroadcaster { + emit>( + ev: Ev, + ...args: EventParams + ): boolean; +} diff --git a/packages/socket.io-redis-streams-emitter/lib/util.ts b/packages/socket.io-redis-streams-emitter/lib/util.ts new file mode 100644 index 0000000000..505e6f19d6 --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/lib/util.ts @@ -0,0 +1,68 @@ +export function hasBinary(obj: any, toJSON?: boolean): boolean { + if (!obj || typeof obj !== "object") { + return false; + } + + if (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj)) { + return true; + } + + if (Array.isArray(obj)) { + for (let i = 0, l = obj.length; i < l; i++) { + if (hasBinary(obj[i])) { + return true; + } + } + return false; + } + + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) { + return true; + } + } + + if (obj.toJSON && typeof obj.toJSON === "function" && !toJSON) { + return hasBinary(obj.toJSON(), true); + } + + return false; +} + +/** + * Whether the client comes from the `redis` package + * + * @param redisClient + * + * @see https://github.com/redis/node-redis + */ +function isRedisV4Client(redisClient: any) { + return typeof redisClient.sSubscribe === "function"; +} + +/** + * @see https://redis.io/commands/xadd/ + */ +export function XADD( + redisClient: any, + streamName: string, + payload: any, + maxLenThreshold: number, +) { + if (isRedisV4Client(redisClient)) { + return redisClient.xAdd(streamName, "*", payload, { + TRIM: { + strategy: "MAXLEN", + strategyModifier: "~", + threshold: maxLenThreshold, + }, + }); + } else { + const args = [streamName, "MAXLEN", "~", maxLenThreshold, "*"]; + Object.keys(payload).forEach((k) => { + args.push(k, payload[k]); + }); + + return redisClient.xadd.call(redisClient, args); + } +} diff --git a/packages/socket.io-redis-streams-emitter/package.json b/packages/socket.io-redis-streams-emitter/package.json new file mode 100644 index 0000000000..d27e28ba38 --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/package.json @@ -0,0 +1,38 @@ +{ + "name": "@socket.io/redis-streams-emitter", + "version": "0.0.1", + "description": "The Socket.IO Redis streams emitter, allowing to communicate with a group of Socket.IO servers from another Node.js process", + "license": "MIT", + "homepage": "https://github.com/socketio/socket.io/tree/main/packages/socket.io-redis-streams-emitter#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/socketio/socket.io.git" + }, + "files": [ + "dist/" + ], + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "compile": "rimraf ./dist && tsc", + "format:check": "prettier --parser typescript --check 'lib/**/*.ts' 'test/**/*.ts'", + "format:fix": "prettier --parser typescript --write 'lib/**/*.ts' 'test/**/*.ts'", + "prepack": "npm run compile", + "test": "npm run format:check && npm run compile && npm run test:redis-standalone && npm run test:ioredis-standalone", + "test:redis-standalone": "nyc mocha --import=tsx test/**/*.ts", + "test:redis-cluster": "REDIS_CLUSTER=1 mocha --import=tsx test/**/*.ts", + "test:ioredis-standalone": "REDIS_LIB=ioredis mocha --import=tsx test/**/*.ts", + "test:ioredis-cluster": "REDIS_LIB=ioredis REDIS_CLUSTER=1 mocha --import=tsx test/**/*.ts", + "test:valkey-standalone": "VALKEY=1 mocha --import=tsx test/**/*.ts" + }, + "dependencies": { + "@msgpack/msgpack": "~2.8.0", + "debug": "~4.4.1" + }, + "keywords": [ + "socket.io", + "redis", + "redis-streams", + "emitter" + ] +} diff --git a/packages/socket.io-redis-streams-emitter/test/index.ts b/packages/socket.io-redis-streams-emitter/test/index.ts new file mode 100644 index 0000000000..c2f302716c --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/test/index.ts @@ -0,0 +1,225 @@ +import { type Server, type Socket as ServerSocket } from "socket.io"; +import { type Socket as ClientSocket } from "socket.io-client"; +import expect = require("expect.js"); +import { times, sleep, setup, initRedisClient } from "./util"; +import { Emitter } from "../lib"; + +const PROPAGATION_DELAY_IN_MS = 100; + +describe("@socket.io/redis-streams-emitter", () => { + let servers: Server[], + serverSockets: ServerSocket[], + clientSockets: ClientSocket[], + cleanup: () => void, + emitter: Emitter; + + beforeEach(async () => { + const testContext = await setup(); + servers = testContext.servers; + serverSockets = testContext.serverSockets; + clientSockets = testContext.clientSockets; + const redisClient = await initRedisClient(); + emitter = new Emitter(redisClient); + + cleanup = () => { + testContext.cleanup(); + redisClient.quit(); + }; + }); + + afterEach(() => cleanup()); + + describe("broadcast", function () { + it("broadcasts to all clients", (done) => { + const partialDone = times(3, done); + + clientSockets.forEach((clientSocket) => { + clientSocket.on("test", (arg1, arg2, arg3) => { + expect(arg1).to.eql(1); + expect(arg2).to.eql("2"); + expect(Buffer.isBuffer(arg3)).to.be(true); + partialDone(); + }); + }); + + emitter.emit("test", 1, "2", Buffer.from([3, 4])); + }); + + it("broadcasts to all clients in a namespace", (done) => { + const partialDone = times(3, () => { + servers.forEach((server) => server.of("/custom").adapter.close()); + done(); + }); + + servers.forEach((server) => server.of("/custom")); + + const onConnect = times(3, async () => { + await sleep(PROPAGATION_DELAY_IN_MS); + + emitter.of("/custom").emit("test"); + }); + + clientSockets.forEach((clientSocket) => { + const socket = clientSocket.io.socket("/custom"); + socket.on("connect", onConnect); + socket.on("test", () => { + socket.disconnect(); + partialDone(); + }); + }); + }); + + it("broadcasts to all clients in a room", (done) => { + serverSockets[1].join("room1"); + + clientSockets[0].on("test", () => { + done(new Error("should not happen")); + }); + + clientSockets[1].on("test", () => { + done(); + }); + + clientSockets[2].on("test", () => { + done(new Error("should not happen")); + }); + + emitter.to("room1").emit("test"); + }); + + it("broadcasts to all clients except in room", (done) => { + const partialDone = times(2, done); + serverSockets[1].join("room1"); + + clientSockets[0].on("test", () => { + partialDone(); + }); + + clientSockets[1].on("test", () => { + done(new Error("should not happen")); + }); + + clientSockets[2].on("test", () => { + partialDone(); + }); + + emitter.of("/").except("room1").emit("test"); + }); + }); + + describe("socketsJoin", () => { + it("makes all socket instances join the specified room", async () => { + emitter.socketsJoin("room1"); + + await sleep(PROPAGATION_DELAY_IN_MS); + + expect(serverSockets[0].rooms.has("room1")).to.be(true); + expect(serverSockets[1].rooms.has("room1")).to.be(true); + expect(serverSockets[2].rooms.has("room1")).to.be(true); + }); + + it("makes the matching socket instances join the specified room", async () => { + serverSockets[0].join("room1"); + serverSockets[2].join("room1"); + + emitter.in("room1").socketsJoin("room2"); + + await sleep(PROPAGATION_DELAY_IN_MS); + + expect(serverSockets[0].rooms.has("room2")).to.be(true); + expect(serverSockets[1].rooms.has("room2")).to.be(false); + expect(serverSockets[2].rooms.has("room2")).to.be(true); + }); + + it("makes the given socket instance join the specified room", async () => { + emitter.in(serverSockets[1].id).socketsJoin("room3"); + + await sleep(PROPAGATION_DELAY_IN_MS); + + expect(serverSockets[0].rooms.has("room3")).to.be(false); + expect(serverSockets[1].rooms.has("room3")).to.be(true); + expect(serverSockets[2].rooms.has("room3")).to.be(false); + }); + }); + + describe("socketsLeave", () => { + it("makes all socket instances leave the specified room", async () => { + serverSockets[0].join("room1"); + serverSockets[2].join("room1"); + + emitter.socketsLeave("room1"); + + await sleep(PROPAGATION_DELAY_IN_MS); + + expect(serverSockets[0].rooms.has("room1")).to.be(false); + expect(serverSockets[1].rooms.has("room1")).to.be(false); + expect(serverSockets[2].rooms.has("room1")).to.be(false); + }); + + it("makes the matching socket instances leave the specified room", async () => { + serverSockets[0].join(["room1", "room2"]); + serverSockets[1].join(["room1", "room2"]); + serverSockets[2].join(["room2"]); + + emitter.in("room1").socketsLeave("room2"); + + await sleep(PROPAGATION_DELAY_IN_MS); + + expect(serverSockets[0].rooms.has("room2")).to.be(false); + expect(serverSockets[1].rooms.has("room2")).to.be(false); + expect(serverSockets[2].rooms.has("room2")).to.be(true); + }); + + it("makes the given socket instance leave the specified room", async () => { + serverSockets[0].join("room3"); + serverSockets[1].join("room3"); + serverSockets[2].join("room3"); + + emitter.in(serverSockets[1].id).socketsLeave("room3"); + + await sleep(PROPAGATION_DELAY_IN_MS); + + expect(serverSockets[0].rooms.has("room3")).to.be(true); + expect(serverSockets[1].rooms.has("room3")).to.be(false); + expect(serverSockets[2].rooms.has("room3")).to.be(true); + }); + }); + + describe("disconnectSockets", () => { + it("makes all socket instances disconnect", (done) => { + const partialDone = times(3, done); + + clientSockets.forEach((clientSocket) => { + clientSocket.on("disconnect", (reason) => { + expect(reason).to.eql("io server disconnect"); + partialDone(); + }); + }); + + emitter.disconnectSockets(); + }); + }); + + describe("serverSideEmit", () => { + it("sends an event to other server instances", (done) => { + const partialDone = times(3, done); + + emitter.serverSideEmit("hello", "world", 1, "2"); + + servers[0].on("hello", (arg1, arg2, arg3) => { + expect(arg1).to.eql("world"); + expect(arg2).to.eql(1); + expect(arg3).to.eql("2"); + partialDone(); + }); + + servers[1].on("hello", (arg1, arg2, arg3) => { + partialDone(); + }); + + servers[2].of("/").on("hello", () => { + partialDone(); + }); + }); + }); +}); diff --git a/packages/socket.io-redis-streams-emitter/test/util.ts b/packages/socket.io-redis-streams-emitter/test/util.ts new file mode 100644 index 0000000000..ea5d4a2bb1 --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/test/util.ts @@ -0,0 +1,156 @@ +import { createServer } from "node:http"; +import { type AddressInfo } from "node:net"; +import { createClient, createCluster } from "redis"; +import { Redis, Cluster } from "ioredis"; +import { Server, type Socket as ServerSocket } from "socket.io"; +import { io as ioc, type Socket as ClientSocket } from "socket.io-client"; +import { createAdapter } from "@socket.io/redis-streams-adapter"; + +export function times(count: number, fn: () => void) { + let i = 0; + return () => { + i++; + if (i === count) { + fn(); + } else if (i > count) { + throw new Error(`too many calls: ${i} instead of ${count}`); + } + }; +} + +export function sleep(duration: number) { + return new Promise((resolve) => setTimeout(resolve, duration)); +} + +const mode = process.env.REDIS_CLUSTER === "1" ? "cluster" : "standalone"; +const lib = process.env.REDIS_LIB || "redis"; + +console.log(`[INFO] testing in ${mode} mode with ${lib}`); + +export async function initRedisClient() { + if (mode === "cluster") { + if (lib === "ioredis") { + return new Cluster([ + { + host: "localhost", + port: 7000, + }, + { + host: "localhost", + port: 7001, + }, + { + host: "localhost", + port: 7002, + }, + { + host: "localhost", + port: 7003, + }, + { + host: "localhost", + port: 7004, + }, + { + host: "localhost", + port: 7005, + }, + ]); + } else { + const redisClient = createCluster({ + rootNodes: [ + { + url: "redis://localhost:7000", + }, + { + url: "redis://localhost:7001", + }, + { + url: "redis://localhost:7002", + }, + { + url: "redis://localhost:7003", + }, + { + url: "redis://localhost:7004", + }, + { + url: "redis://localhost:7005", + }, + ], + }); + + await redisClient.connect(); + + return redisClient; + } + } else { + if (lib === "ioredis") { + return new Redis(); + } else { + const port = process.env.VALKEY === "1" ? 6389 : 6379; + const redisClient = createClient({ + url: `redis://localhost:${port}`, + }); + await redisClient.connect(); + + return redisClient; + } + } +} + +async function init() { + const redisClient = await initRedisClient(); + + const httpServer = createServer(); + const io = new Server(httpServer, { + adapter: createAdapter(redisClient, { + readCount: 1, // return as soon as possible + }), + }); + + return new Promise<{ + io: Server; + socket: ServerSocket; + clientSocket: ClientSocket; + cleanup: () => void; + }>((resolve) => { + httpServer.listen(() => { + const port = (httpServer.address() as AddressInfo).port; + const clientSocket = ioc(`http://localhost:${port}`); + + io.on("connection", async (socket) => { + resolve({ + io, + socket, + clientSocket, + cleanup: () => { + io.close(); + clientSocket.disconnect(); + redisClient.quit(); + }, + }); + }); + }); + }); +} + +export async function setup() { + const results = await Promise.all([init(), init(), init()]); + + const servers = results.map(({ io }) => io); + const serverSockets = results.map(({ socket }) => socket); + const clientSockets = results.map(({ clientSocket }) => clientSocket); + const cleanupMethods = results.map(({ cleanup }) => cleanup); + + return { + servers, + serverSockets, + clientSockets, + cleanup: () => { + for (const cleanup of cleanupMethods) { + cleanup(); + } + }, + }; +} diff --git a/packages/socket.io-redis-streams-emitter/tsconfig.json b/packages/socket.io-redis-streams-emitter/tsconfig.json new file mode 100644 index 0000000000..70b8015c31 --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "allowJs": false, + "target": "es2017", + "module": "commonjs", + "declaration": true, + "strict": true + }, + "include": [ + "./lib/**/*" + ] +} From 599001d213f0090b81a9937ab678597ec6ae2572 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Thu, 6 Nov 2025 18:23:00 +0100 Subject: [PATCH 49/51] chore(release): @socket.io/redis-streams-emitter@0.1.0 --- packages/socket.io-redis-streams-emitter/CHANGELOG.md | 9 +++++++++ packages/socket.io-redis-streams-emitter/package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 packages/socket.io-redis-streams-emitter/CHANGELOG.md diff --git a/packages/socket.io-redis-streams-emitter/CHANGELOG.md b/packages/socket.io-redis-streams-emitter/CHANGELOG.md new file mode 100644 index 0000000000..6a23f8e75e --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +| Version | Release date | +|--------------------------|---------------| +| [0.1.0](#010-2025-11-06) | November 2025 | + +## 0.1.0 (2025-11-06) + +Initial release! diff --git a/packages/socket.io-redis-streams-emitter/package.json b/packages/socket.io-redis-streams-emitter/package.json index d27e28ba38..875388bbbc 100644 --- a/packages/socket.io-redis-streams-emitter/package.json +++ b/packages/socket.io-redis-streams-emitter/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/redis-streams-emitter", - "version": "0.0.1", + "version": "0.1.0", "description": "The Socket.IO Redis streams emitter, allowing to communicate with a group of Socket.IO servers from another Node.js process", "license": "MIT", "homepage": "https://github.com/socketio/socket.io/tree/main/packages/socket.io-redis-streams-emitter#readme", From 7617707ed8f0defd0e19cb7c6963504ce7b87f6b Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 7 Nov 2025 10:20:53 +0100 Subject: [PATCH 50/51] fix(redis-streams-emitter): remove dependency on socket.io-adapter Related: https://github.com/socketio/socket.io/issues/5414 --- .../lib/adapter-types.ts | 75 +++++++++++++++++++ .../lib/index.ts | 2 +- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 packages/socket.io-redis-streams-emitter/lib/adapter-types.ts diff --git a/packages/socket.io-redis-streams-emitter/lib/adapter-types.ts b/packages/socket.io-redis-streams-emitter/lib/adapter-types.ts new file mode 100644 index 0000000000..854dc495ac --- /dev/null +++ b/packages/socket.io-redis-streams-emitter/lib/adapter-types.ts @@ -0,0 +1,75 @@ +// imported from the 'socket.io-adapter' package +export enum MessageType { + INITIAL_HEARTBEAT = 1, + HEARTBEAT, + BROADCAST, + SOCKETS_JOIN, + SOCKETS_LEAVE, + DISCONNECT_SOCKETS, + FETCH_SOCKETS, + FETCH_SOCKETS_RESPONSE, + SERVER_SIDE_EMIT, + SERVER_SIDE_EMIT_RESPONSE, + BROADCAST_CLIENT_COUNT, + BROADCAST_ACK, + ADAPTER_CLOSE, +} + +export type ServerId = string; + +export type ClusterMessage = { + uid: ServerId; + nsp: string; +} & ( + | { + type: + | MessageType.INITIAL_HEARTBEAT + | MessageType.HEARTBEAT + | MessageType.ADAPTER_CLOSE; + } + | { + type: MessageType.BROADCAST; + data: { + opts: { rooms: string[]; except: string[]; flags: BroadcastFlags }; + packet: unknown; + requestId?: string; + }; + } + | { + type: MessageType.SOCKETS_JOIN | MessageType.SOCKETS_LEAVE; + data: { + opts: { rooms: string[]; except: string[]; flags: BroadcastFlags }; + rooms: string[]; + }; + } + | { + type: MessageType.DISCONNECT_SOCKETS; + data: { + opts: { rooms: string[]; except: string[]; flags: BroadcastFlags }; + close?: boolean; + }; + } + | { + type: MessageType.FETCH_SOCKETS; + data: { + opts: { rooms: string[]; except: string[]; flags: BroadcastFlags }; + requestId: string; + }; + } + | { + type: MessageType.SERVER_SIDE_EMIT; + data: { + requestId?: string; + packet: any[]; + }; + } +); + +export interface BroadcastFlags { + volatile?: boolean; + compress?: boolean; + local?: boolean; + broadcast?: boolean; + binary?: boolean; + timeout?: number; +} diff --git a/packages/socket.io-redis-streams-emitter/lib/index.ts b/packages/socket.io-redis-streams-emitter/lib/index.ts index 81d05d880a..1293707293 100644 --- a/packages/socket.io-redis-streams-emitter/lib/index.ts +++ b/packages/socket.io-redis-streams-emitter/lib/index.ts @@ -8,7 +8,7 @@ import type { } from "./typed-events"; import { encode } from "@msgpack/msgpack"; import { hasBinary, XADD } from "./util"; -import { ClusterMessage, MessageType, BroadcastFlags } from "socket.io-adapter"; +import { ClusterMessage, MessageType, BroadcastFlags } from "./adapter-types"; const debug = debugModule("socket.io-redis-streams-emitter"); const EMITTER_UID = "emitter"; From 54743633ffa7bd595cc759d4affc49121fedaeb4 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Fri, 7 Nov 2025 10:33:07 +0100 Subject: [PATCH 51/51] chore(release): @socket.io/redis-streams-emitter@0.1.1 Diff: https://github.com/socketio/socket.io/compare/@socket.io/redis-streams-emitter@0.1.0...@socket.io/redis-streams-emitter@0.1.1 --- packages/socket.io-redis-streams-emitter/CHANGELOG.md | 10 ++++++++++ packages/socket.io-redis-streams-emitter/package.json | 2 +- packages/socket.io-redis-streams-emitter/tsconfig.json | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/socket.io-redis-streams-emitter/CHANGELOG.md b/packages/socket.io-redis-streams-emitter/CHANGELOG.md index 6a23f8e75e..4d62a8c871 100644 --- a/packages/socket.io-redis-streams-emitter/CHANGELOG.md +++ b/packages/socket.io-redis-streams-emitter/CHANGELOG.md @@ -2,8 +2,18 @@ | Version | Release date | |--------------------------|---------------| +| [0.1.1](#011-2025-11-07) | November 2025 | | [0.1.0](#010-2025-11-06) | November 2025 | + +## [0.1.1](https://github.com/socketio/socket.io/compare/@socket.io/redis-streams-emitter@0.1.0...@socket.io/redis-streams-emitter@0.1.1) (2025-11-07) + + +### Bug Fixes + +* remove dependency on socket.io-adapter ([7617707](https://github.com/socketio/socket.io/commit/7617707ed8f0defd0e19cb7c6963504ce7b87f6b)) + + ## 0.1.0 (2025-11-06) Initial release! diff --git a/packages/socket.io-redis-streams-emitter/package.json b/packages/socket.io-redis-streams-emitter/package.json index 875388bbbc..20b0d5d078 100644 --- a/packages/socket.io-redis-streams-emitter/package.json +++ b/packages/socket.io-redis-streams-emitter/package.json @@ -1,6 +1,6 @@ { "name": "@socket.io/redis-streams-emitter", - "version": "0.1.0", + "version": "0.1.1", "description": "The Socket.IO Redis streams emitter, allowing to communicate with a group of Socket.IO servers from another Node.js process", "license": "MIT", "homepage": "https://github.com/socketio/socket.io/tree/main/packages/socket.io-redis-streams-emitter#readme", diff --git a/packages/socket.io-redis-streams-emitter/tsconfig.json b/packages/socket.io-redis-streams-emitter/tsconfig.json index 70b8015c31..5cd54c53b3 100644 --- a/packages/socket.io-redis-streams-emitter/tsconfig.json +++ b/packages/socket.io-redis-streams-emitter/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "outDir": "./dist", "allowJs": false, - "target": "es2017", + "target": "es2022", "module": "commonjs", "declaration": true, "strict": true